В вытесняющем ядре (скажем, Linux), скажем, процесс A делает вызов getc
на stdin
, поэтому он блокируется в ожидании символа. Я чувствую, что у меня есть фундаментальное непонимание того, как ядро узнает, что нужно разбудить процесс A в этот момент и доставить данные после их получения.
Насколько я понимаю, этот процесс может быть переведен в приостановленное состояние, пока планировщик планирует запуск других процессов/потоков, или он будет вытеснен. Когда происходит нажатие клавиши, посредством опроса/прерываний, в зависимости от реализации, ОС запускает драйвер устройства, который декодирует нажатую клавишу. Однако возможно (и вероятно), что мой процесс A в настоящее время не запущен. На данный момент я сбит с толку тем, как мой процесс, который был заблокирован в ожидании ввода-вывода, теперь ставится в очередь для повторного запуска, особенно как он знает, какой процесс ожидает чего. Похоже, что драйверы устройств содержат некоторую форму очереди ожидания.
Точно так же, и я не уверен, что это точно связано с вышеизложенным, но если окно моего браузера, например, находится в фокусе, кажется, что оно получает нажатия клавиш, но не другие окна. Есть ли у каждого окна/процесса возможность «прослушивать» события клавиатуры, даже если они не в фокусе, но только не для удобства пользователя?
Поэтому мне любопытно, как ядра (или как некоторые из них) отслеживают, какие процессы ожидают каких событий, и когда эти события приходят, как они определяют, какие процессы планировать для запуска?