O Torvalds Linus

Сайт о *nix системах и всем что с ними связано

Очереди ожидания

Mar-11-2012 By root

Очереди ожидания по-разному применяются в ядре; в частности, они используются при обработке прерываний, синхронизации процессов и в хронометрировании. Некоторое событие, например, завершится дисковая операция, освободится системный ресурс или истечет заданный интервал времени. Очереди ожидания реализуют условное ожидание событий: процесс, которому нужно ждать наступления какого-то события, встает в соответствующую очередь и освобождает процессор.

Поскольку очереди ожидания модифицируются обработчиками прерываний и основными функциями ядра, двунаправленные списки должны быть защищены от попыток одновременного обращения, которые могут привести к непредсказуемым результатам. Синхронизация достигается с помощью спин – блокировки lock, хранящейся в голове очереди. Поле task list является головой списка ожидающих процессов.

Каждый элемент этого списка представляет спящий процесс, который ждет наступления некоторого события. Адрес его дескриптора хранится в поле task. Поле task list содержит указатели, связывающие этот элемент со списком процессов, ожидающих наступления того же события.

Однако будить все процессы в очереди ожидания не всегда удобно. Например, если два или более процессов ожидают исключительного доступа к одному и тому же ресурсу, имеет смысл будить только один из них. Этот процесс захватит ресурс, а остальные продолжат спать. (Так удается избежать проблемы стада перед грозой”, которая возникает, когда несколько процессов пробуждается только для того, чтобы поучаствовать в борьбе за ресурс, к которому сможет обратиться только один из них, а остальным придется вернуться ко сну.)

Таким образом, можно выделить два типа спящих процессов: эксклюзивные процессы (помеченные единицей в поле flags соответствующего элемента очереди ожидания) избирательно будятся ядром, а не эксклюзивные (помеченные нулем в поле flags) будятся всегда, как только наступает ожидаемое событие. Процесс, ожидающий ресурсы, который может быть выделен только одному процессу за раз, является типичным примером эксклюзивного процесса. Процессы, ожидающие события, которое касается любого из них, являются не эксклюзивными. Рассмотрим в качестве примера группу процессов, ожидающих окончания операций ввода/вывода. Когда пересылка данных закончится, все ожидающие процессы могут быть разбужены. Как мы увидим далее, поле func элемента очереди ожидания служит для уточнения, как должны быть разбужены процессы, стоящие в очереди.

Add A Comment