Если запущенный процесс блокируется на I / O
Блокировка ввода-вывода в значительной степени эквивалентна приостановке вашего процесса. В контексте ядра Linux, выполнение некоторого системного вызова IO, такого как, read()
приведет к тому, что sysenter
обработчик прерываний или триггера вызовет обработку этого ввода-вывода, вызывая в do_sys_read()
конечном счете. Здесь, если текущий запрос не может быть немедленно удовлетворен, вызывается функция, sched()
которая затем может выполнить другой процесс.
В контексте кооперативной системы я ожидал бы, что когда вы совершаете системный вызов по какой-то причине ввода-вывода, если запрос не может быть удовлетворен, ядро выбирает другую задачу и выполняет ее. Этот документ дает некоторую предысторию - в основном, если вы ждали IO, вы могли бы быть навсегда в ожидании этого IO. Идея совместного планирования заключается в том, что вы часто вызываете sched()
или эквивалентный метод relinquish-the-cpu, если выполняете задачи с интенсивным использованием процессора.
Соображения о режиме ядра становятся более интересными. На архитектурах, где они доступны, таких как определенные встроенные платформы , обработчики прерываний по-прежнему будут вызываться в ответ на аппаратные или программные прерывания. С точки зрения реализации обычно возможно отключить обработку прерываний , но это также имеет недостатки.