Сегодня на уроке мы изучали очереди ожидания в Linux, и кое-что интересное появилось, когда мы говорили об эксклюзивных/неэксклюзивных ожиданиях.
Задан вопрос: что произойдет, если в очереди ожидания одни процессы находятся в монопольном состоянии, а другие — в неэксклюзивном.
Лектор ответил, что wake_up()
пройдет по очереди, пробуждая все неэксклюзивные процессы, пока не встретит монопольный, а затем просто разбудит последний процесс и остановится.
Например: Пусть N, E представляют неисключительный и монопольный процессы в очереди ожидания соответственно:
N - N - N - E - N - E - N - N
Лектор утверждал, что первые 4 ожидания будут разбужены (N-N-N-E) и ядро прекратит обход после первого E.
Это звучало странно, так как E является эксклюзивным, что означает, что он не хочет просыпаться ни с кем другим, а в данном случае он просыпается с другими.
Гугление вопроса дало следующее:
Когда очередь ожидания «пробуждается», все задачи в очереди ожидания становятся доступными для планировщика. Если задача добавлена в очередь ожидания с помощью эксклюзивной функции, вызов пробуждения активирует только одну эксклюзивную задачу, оставляя остальные в ожидании. Если в очередь добавлены как монопольные, так и не монопольные задачи, функция пробуждения будет активировать любые не монопольные задачи до тех пор, пока не активирует монопольную задачу. Порядок пробуждения обычно обратный порядку. порядок, в котором задачи добавляются в очередь. https://blackfin.uclinux.org/doku.php?id=linux-kernel:wait_queues
Который правильный? Является ли реальный ответ чем-то совершенно другим?
ПРИМЕЧАНИЕ. В классе мы говорим о Linux 2.4.18-14, i386 (пожалуйста, прокомментируйте, если нужна дополнительная информация о системе)