Каждое устройство Linux, кажется, реализована несколько иначе, и предпочтительный способ, кажется, изменяется каждые несколько Linux выпускает по мере добавления безопаснее/быстрее функции ядра, но, как правило:
водитель
- Устройство создает чтения и пишите очереди ожидания для устройства.
- Любой процесс, который хочет подождать для ввода/вывода, помещается в соответствующую очередь ожидания . Когда происходит прерывание , обработчик просыпается один или несколько ожидающих потоков. (Очевидно, что потоки не запускаются немедленно, поскольку мы находимся в контексте прерывания , но добавлены в очередь планирования ядра ).
- Когда запланировано ядро, поток проверяет, соответствуют ли условия - если нет , он возвращается в очередь ожидания.
Типичный пример (слегка упрощенный):
В драйвере при инициализации:
init_waitqueue_head(&readers_wait_q);
В функции считывания драйвера:
if (filp->f_flags & O_NONBLOCK)
{
return -EAGAIN;
}
if (wait_event_interruptible(&readers_wait_q, read_avail != 0))
{
/* signal interrupted the wait, return */
return -ERESTARTSYS;
}
to_copy = min(user_max_read, read_avail);
copy_to_user(user_buf, read_ptr, to_copy);
то обработчик прерываний только вопросы:
wake_up_interruptible(&readers_wait_q);
Обратите внимание, что wait_event_interruptible() - это макрос, который скрывает цикл, который проверяет условие - read_avail != 0
в этом случае - и повторно добавляет в очередь ожидания снова, если пробуждается, когда условие не является истинным.
Как уже упоминалось, существует ряд вариаций - главное, что если для обработчика прерываний есть много работы, то он сам выполняет минимальный минимум и откладывает остальное на рабочую очередь или на тазетку (обычно называемый «нижней половиной»), и именно это пробуждает ожидающие потоки.
См Linux Device Driver книга для более подробной информации - PDF доступны здесь: http://lwn.net/Kernel/LDD3
Вы в значительной степени ударил гвоздь на голове (за последнее замечание, за исключением, нет опроса, по большей части). Множественное мультиплексирование между mulitiple официантами и файлами выполняется ядром, которое является невидимым процессом, который координирует такие вещи от имени всех других процессов. –