В чем разница между очередью устройства и очередью ожидания? - PullRequest
0 голосов
/ 04 декабря 2018

Насколько я понимаю, очередь ожидания ожидает запрос ввода-вывода, поэтому кажется, что очередь устройства либо совпадает с очередью ожидания, либо является ее подмножеством?Есть ли какой-то процесс в очереди ожидания, но не в очереди устройств?

1 Ответ

0 голосов
/ 05 декабря 2018

В чем разница между очередью устройства и очередью ожидания?

Предположим (для шутки!), Что у вас есть микроядро и драйвер жесткого диска, работающий как пользовательский процесс-пространство, где конкретный драйвер устройства поддерживает некоторую структуру данных (одну очередь FIFO, отдельную очередь для каждого уровня приоритета ввода-вывода, какое-то дерево, ...) для отслеживания ожидающих операций для своего устройства, и чтоэта структура данных находится в виртуальном адресном пространстве процесса драйвера устройства, поэтому драйвер устройства может получить к нему быстрый доступ.Я мог бы (если это просто очередь FIFO, а не что-то хорошее) испытать искушение назвать это «очередью устройства».

Давайте также предположим, что планировщик (внутри микроядра) имеет:

  • какая-то структура данных для отслеживания «готовых к выполнению» задач (задач, ожидающих времени ЦП).Я мог бы (если это просто очередь FIFO, а не что-то хорошее) испытать искушение назвать это «очередью ожидания», но, скорее всего, я бы назвал ее «готовой к запуску очереди».

  • какая-то структура данных для отслеживания задач, ожидающих времени (например, потому что они вызвали sleep()).Я мог бы (если это просто отсортированный список, а не что-то хорошее) тоже испытать искушение назвать это «очередью ожидания», но, скорее всего, я бы назвал ее «спящим списком».

Обратите внимание, что у ядра нет причин иметь структуру данных для отслеживания задач, ожидающих сообщения (от драйвера устройства или из любого другого места);и только нужно сделать if(task->state == WAITING_FOR_MESSAGE) { unblock(task); } для этого случая.Аналогичным образом, если обработчик ошибок страницы ядра должен заставить задачу ждать получения данных страницы (например, из пространства подкачки), он может заблокировать задачу (например, и установить состояние задачи на WAITING_FOR_PAGE_DATA), и ему нужны толькочтобы разблокировать задачу при получении данных, и ей не требуется структура данных для отслеживания этих задач.

...