В чем разница между очередью устройства и очередью ожидания?
Предположим (для шутки!), Что у вас есть микроядро и драйвер жесткого диска, работающий как пользовательский процесс-пространство, где конкретный драйвер устройства поддерживает некоторую структуру данных (одну очередь FIFO, отдельную очередь для каждого уровня приоритета ввода-вывода, какое-то дерево, ...) для отслеживания ожидающих операций для своего устройства, и чтоэта структура данных находится в виртуальном адресном пространстве процесса драйвера устройства, поэтому драйвер устройства может получить к нему быстрый доступ.Я мог бы (если это просто очередь FIFO, а не что-то хорошее) испытать искушение назвать это «очередью устройства».
Давайте также предположим, что планировщик (внутри микроядра) имеет:
какая-то структура данных для отслеживания «готовых к выполнению» задач (задач, ожидающих времени ЦП).Я мог бы (если это просто очередь FIFO, а не что-то хорошее) испытать искушение назвать это «очередью ожидания», но, скорее всего, я бы назвал ее «готовой к запуску очереди».
какая-то структура данных для отслеживания задач, ожидающих времени (например, потому что они вызвали sleep()
).Я мог бы (если это просто отсортированный список, а не что-то хорошее) тоже испытать искушение назвать это «очередью ожидания», но, скорее всего, я бы назвал ее «спящим списком».
Обратите внимание, что у ядра нет причин иметь структуру данных для отслеживания задач, ожидающих сообщения (от драйвера устройства или из любого другого места);и только нужно сделать if(task->state == WAITING_FOR_MESSAGE) { unblock(task); }
для этого случая.Аналогичным образом, если обработчик ошибок страницы ядра должен заставить задачу ждать получения данных страницы (например, из пространства подкачки), он может заблокировать задачу (например, и установить состояние задачи на WAITING_FOR_PAGE_DATA
), и ему нужны толькочтобы разблокировать задачу при получении данных, и ей не требуется структура данных для отслеживания этих задач.