В превантивно ядро (да речем Linux), да кажем, че процес A прави повикване до getc
на stdin
, така че е блокиран в очакване на символ. Чувствам, че имам основно неразбиране как ядрото знае тогава да събуди процес A в този момент и да достави данните, след като бъдат получени.
Моето разбиране е, че тогава този процес може да бъде поставен в спряно състояние, докато планировчикът планира други процеси/нишки да се изпълняват, или той се изпреварва. Когато се случи натискане на клавиш, чрез запитване/прекъсвания в зависимост от изпълнението, операционната система стартира драйвер на устройство, който декодира клавиша, който е бил натиснат. Въпреки това е възможно (и вероятно) моят процес A да не се изпълнява в момента. В този момент съм объркан как моят процес, който беше блокиран в очакване на I/O, сега е поставен на опашка, за да стартира отново, особено как знае кой процес чака какво. Изглежда, че драйверите на устройството държат някаква форма на опашка за изчакване.
По същия начин и не съм сигурен дали това е точно свързано с горното, но ако прозорецът на браузъра ми например е на фокус, изглежда, че получава натискания на клавиши, но не и други прозорци. Всеки прозорец/процес има ли способността да "слуша" за събития от клавиатурата, дори ако не са на фокус, но просто не го правете заради потребителското изживяване?
Така че съм любопитен как ядрата (или как някои) следят кои процеси чакат за кои събития и когато тези събития постъпят, как определя кои процеси да планират за изпълнение?