Лекция: Монолитные системы и системы с микроядром

 

Исполняя системный вызов, пользовательская программа передает управление ядру. Практически во всех современных системах ядро представляет собой единый процесс — единое адресное пространство. Но организация взаимодействия между нитями (потоками) этого процесса в различных системах устроена по-разному.

Три основные группы нитей, исполняющихся в режиме ядра:

  • обработчики прерываний,
  • обработчики системных вызовов со стороны пользовательских процессов
  • нити, исполняющие различные внутренние по отношению к системе работы, например управление дисковым кэшем.

В документации фирмы Sun нити этих трех групп в ядре Solaris называются, соответственно, исполняющимися в контекстепрерывания (interrupt context), в пользовательском контексте (user context) и в контексте ядра (kernel context, или контексте системы. Далее мы будем называть последние две категории нитей, соответственно пользовательскими и системными, хотя и те, и другие исполняют системный код в системном адресном пространстве.

Обработчики прерываний всегда представляют собой особую статью — система практически никогда не имеет контроля над тем, когда возникают внешние события, зато практически всегда обязана обрабатывать эти события по мере их появления. Поэтому обработчики прерываний получают управление по необходимости.

В то же время, порядок получения управления пользовательскими и системными нитями в ряде ситуаций находится под контролем системы. Планировщик является частью ядра и модули системы вольны, включать егои выключать по мере необходимости. Практически всегда его выключают на время работы обработчика прерывания, но некоторые системы делают это и при активизации других нитей ядра. Полное выключение планировщика на время работы ядра фактически озна­чает, что система не реализует внутри ядра вытесняющей многозадачности. Системные и пользовательские нити в этом случае являются сопрограмма­ми, а не нитями в полном смысле этого слова.

Эта архитектура, называемая монолитным ядром, привлекательна примерно тем же, чем привлекательна кооперативная многозадачность на пользова­тельском уровне: любой модуль ядра может потерять управление лишь в двух случаях — при исполнении обработчика прерывания или по собст­венной инициативе. Благодаря этому разработчик модуля может не беспокоиться о критических секциях и прочих малоприятных аспектах доступа к разделяемым данным (кроме, разумеется, случаев, когда разделяет данные с обработчиком прерывания).

Платить за эти преимущества приходится значительными сложностями при переносе системы на многопроцессорные машины и невозможностью реализовать режим реального времени. Действительно, код ядра, написанный в расчете на кооперативную многозадачность, не может быть реентерабельным, поэтому такая система в то время, когда исполняется какая-то из ее нитей, не может обрабатывать системные вызовы. Следовательно, она не может иметь пользовательские процессы с приоритетом выше, чем у нитей ядра — а именно такие процессы нужны для поддержки приложений реального времени.

Альтернативной монолитным ядрам является микроядро. Микроядерные системы реализуют вытесняющую многозадачность не только между пользовательскими процессами, но и между нитями ядра.

В зависимости от того, какого рода взаимодействия преобладают, мы можем выстроить целый спектр более или менее монолитных (и, напротив, более или менее микроядерных) архитектур. На практике, большинство современ­ных ОС общего назначения, имеют гибридную архитектуру, которая не является микроядерной, и в то же время не может быть классифицирована как монолитная. Многие из архитектур и, во всяком случае, многие ключевых принципов взаимодействия между модулями современных операцион­ных систем были разработаны еще до того, как появилось само слово «микроядро».

еще рефераты
Еще работы по информатике