Операционные системы - статьи

         

микроядро обрабатывает прерывания, обеспечивает


В операционной системе Minix 3 микроядро обрабатывает прерывания, обеспечивает основные механизмы для управления процессами, реализует межпроцессные взаимодействия и производит планирование процессов. Оно также предоставляет небольшой набор вызовов ядра для авторизованных драйверов и серверов, например, для чтения части заданного пользовательского адресного пространства или записи в авторизованные порты ввода-вывода. В адресном пространстве микроядра работает драйвер таймера, но он планируется как отдельный процесс. Никакие другие драйверы в режиме ядра не работают.

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

Поверх уровня драйверов устройств располагается уровень серверов. Файловый сервер является небольшой (4,500 строк исполняемого кода) программой, которая принимает запросы от пользовательских процессов по обработке Posix-совместимых вызовов, относящихся к файлам (read, write, lseek и stat) и выполняет их. На этом уровне находится и менеджер процессов, который поддерживает управление процессами и памятью и выполняет Posix-совместимые и другие системные вызовы, такие как fork, exec и brk. Несколько необычным является сервер реинкарнации, который является родительским процессом всех других серверов и всех драйверов. Если драйвер или сервер аварийно или по собственной инициативе завершается, либо не отвечает на периодические запросы отклика, то сервер реинкарнации принудительно завершает его, если это требуется, и перезапускает из копии на диске или в основной памяти.
В число других серверов входит сервер сети, поддерживающий весь стек TCP/IP; простой сервер имен, используемый всеми остальными серверами; и информационный сервер, способствующий отладке.

Наконец, над уровнем серверов находятся пользовательские процессы. Для пользователей единственным отличием от других Unix-систем является то, что библиотечные процедуры для системных вызовов выполняют свою работу путем посылки сообщений серверам. Во всем остальном это обычные пользовательские процессы, в которых может использоваться API Posix.

Межпроцессные взаимодействия (IPC) в MINIX 3 поддерживаются на основе передачи сообщений фиксированной длины с использованием принципа рандеву: система копирует сообщение напрямую от отправителя к получателю, когда оба они к этому готовы. Кроме того, поддерживается механизм асинхронного уведомления о событиях. События, о которых оказалось невозможно уведомить процесс, фиксируются в битовой шкале в таблице процессов. С системой передачи сообщений интегрирована обработка прерываний. Обработчики прерываний используют механизм уведомлений для сигнализации о завершении ввода-вывода. Этот механизм позволяет обработчику установить бит в битовой шкале "необработанных прерываний" драйвера и продолжить выполнение без блокировки. Когда драйвер становится готовым к получению прерывания, ядро преобразует его в обычное сообщение.

Надежность Minix 3 происходит из разных источников. Во-первых, размер кода, выполняемого в ядре, составляет около 4000 строк, и общее число ошибок - всего около 24. Небольшой размер ядра позволяет верифицировать его код вручную или на основе формальных методов. Особенности IPC позволяют избежать потребности управления буферами в ядре. Кроме того, для каждого процесса ограничены доступные примитивы IPC, включая адреса назначения и события, о которых происходит уведомление. Например, пользовательские процессы могут использовать только принцип рандеву и посылать сообщения только Posix-серверам. В дополнение к этому, все структуры ядра являются статическими.


Все эти свойства значительно упрощают код и устраняют ошибки в ядре, связанные с переполнением буферов, "утечку памяти" (memory leak), несвоевременные прерывания и т.д. Конечно, перемещение большей части операционной системы в процессы, выполняемые в режиме пользователя, не устраняют неизбежные ошибки в драйверах и серверах, но это ограничивает их воздействие на систему в целом. Ошибочный код в ядре может испортить критичные структуры данных, записать на диск ненужные данные и т.д.; ошибочный же код в большинстве драйверов и серверов не может принести такого вреда, поскольку эти процессы строго разделены и очень ограничены в своих возможностях.

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

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

В течение десятилетий мультисерверные архитектуры на основе микроядра критиковались за недостаточную эффективность. Однако различные проекты показали, что при модульной разработке можно достичь приемлемой производительности. Несмотря на то, что система Minix 3 не оптимизировалась для достижения высокой производительности, она работает достаточно быстро. Вынос с ядра драйверов привел к снижению производительности на 10%, и система собирается, включая ядро, общие драйверы и все серверы (112 компиляций и 11 редактирований связей) менее чем за 6 секунд на процессоре Athlon с 2,2 Ггц. Тот факт, что мультисерверная архитектура смогла обеспечить высоконадежную Unix-подобную среду за счет небольшого снижения производительности, показывает практичность этого подхода.Minix 3 для Pentium свободно распространяется под лицензией Беркли на сайте www.minix3.org.


Содержание раздела