Все ядра Unix являются реентерабельными. Это означает, что несколько процессов могут выполняться в режиме ядра одновременно. Конечно, в однопроцессорных системах может выполняться только один процесс, но многие могут быть заблокированы в режиме ядра при ожидании ЦП или завершении какой-либо операции ввода-вывода. Например, после выдачи чтения на диск от имени процесса ядро позволяет контроллеру диска обрабатывать его и возобновляет выполнение других процессов. Прерывание уведомляет ядро, когда устройство удовлетворило чтение, поэтому предыдущий процесс может возобновить выполнение.
Одним из способов обеспечения повторного входа является написание функций так, чтобы они изменяли только локальные переменные и не изменяли глобальные структуры данных. Такие функции называются реентерабельными. Но реентерабельное ядро не ограничивается только такими реентерабельными функциями (хотя так реализуются некоторые ядра реального времени). Вместо этого ядро может включать не входящие функции и использовать механизмы блокировки, чтобы гарантировать, что только один процесс может одновременно выполнять не входящую функцию.
Если происходит аппаратное прерывание, возвращающееся ядро может приостановить текущий запущенный процесс, даже если этот процесс находится в режиме ядра. Эта возможность очень важна, потому что она улучшает пропускную способность контроллеров устройств, которые выдают прерывания. Как только устройство выдало прерывание, оно ожидает, пока ЦП не подтвердит его. Если ядро сможет быстро ответить, контроллер устройства сможет выполнять другие задачи, пока процессор обрабатывает прерывание.
Теперь давайте посмотрим на повторяемость ядра и его влияние на организацию ядра. Путь управления ядром обозначает последовательность инструкций, выполняемых ядром для обработки системного вызова, исключения или прерывания.
В простейшем случае CPU выполняет путь управления ядром последовательно от первой инструкции до последней. Однако, когда происходит одно из следующих событий, ЦП чередует пути управления ядром:
Процесс, выполняющийся в режиме пользователя, вызывает системный вызов, и соответствующий путь управления ядром проверяет, что запрос не может быть удовлетворен немедленно; Затем он вызывает планировщик, чтобы выбрать новый процесс для запуска. В результате происходит переключение процесса. Первый путь управления ядром остается незавершенным, и ЦПУ возобновляет выполнение какого-либо другого пути управления ядром. В этом случае два пути управления выполняются от имени двух разных процессов.
ЦПУ обнаруживает исключение, например, доступ к странице, отсутствующей в ОЗУ, при выполнении пути управления ядром. Первый путь управления приостановлен, и ЦП начинает выполнение подходящей процедуры. В нашем примере процедура такого типа может выделить новую страницу для процесса и прочитать ее содержимое с диска. Когда процедура заканчивается, первый путь управления может быть возобновлен. В этом случае два пути управления выполняются от имени одного и того же процесса.
Аппаратное прерывание происходит, когда ЦПУ выполняет путь управления ядром с включенными прерываниями. Первый путь управления ядром остается незавершенным, и ЦПУ начинает обрабатывать другой путь управления ядром для обработки прерывания. Первый путь управления ядром возобновляется, когда завершается обработчик прерывания. В этом случае два пути управления ядром выполняются в контексте выполнения одного и того же процесса, и ему учитывается общее время системного процессора. Однако обработчик прерываний не обязательно работает от имени процесса.
Прерывание происходит, когда ЦП работает с включенным вытеснением ядра, и выполняется процесс с более высоким приоритетом. В этом случае первый путь управления ядром остается незавершенным, и ЦПУ возобновляет выполнение другого пути управления ядром от имени процесса с более высоким приоритетом. Это происходит, только если ядро было скомпилировано с поддержкой вытеснения ядра.
Эта информация доступна на http://jno.glas.net/data/prog_books/lin_kern_2.6/0596005652/understandlk-CHP-1-SECT-6.html
Подробнее о http://linux.omnipotent.net/article.php?article_id=12496&page=-1