Очередь ожидания Linux — сочетание монопольного и неэксклюзивного

Сегодня на уроке мы изучали очереди ожидания в 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 (пожалуйста, прокомментируйте, если нужна дополнительная информация о системе)


person Dean Leitersdorf    schedule 06.10.2016    source источник


Ответы (1)


N - N - N - E - N - E - N - N

Первое, что нужно отметить, это то, что записи с WQ_FLAG_EXCLUSIVE добавляются в конец очереди, а не в ее начало. Итак, приведенный пример никогда не встречается; очереди ожидания всегда сортируются: все N, затем все E.

поскольку E является эксклюзивным, что означает, что он не хочет просыпаться ни с кем другим, и в этом случае он просыпается с другими

Второе, на что следует обратить внимание, это то, что эксклюзивные официанты не хотят, чтобы их будили с другими эксклюзивными официантами. Предположительно, неэксклюзивные официанты выполняют полностью неперекрывающиеся задачи, в то время как эксклюзивные официанты выполняют связанные работы. -- возможно, им всем требуется один и тот же общий ресурс, поэтому их пробуждение вызовет "грохочущее стадо", поскольку все они пытаются получить один и тот же замок.

Таким образом, то, что вы нашли через Google, верно. Большинство из того, что вам сказали, также верно, а именно то, что Linux останавливается после пробуждения первого обнаруженного эксклюзивного ожидания. Однако предположение о том, что очередь ожидания не отсортирована по исключительности, было неверным.

person Evan    schedule 29.03.2017