
- •Глава 4.
- •Многопоточность
- •Функциональность потоков
- •Потоки на пользовательском уровне и на уровне ядра
- •Другие схемы
- •4.2 Симметричная многопроцессорная обработка
- •Организация симметричной многопроцессорной системы
- •Архитектура многопроцессорных операционных систем
- •4.3. Микроядра
- •Архитектура микроядра
- •Достоинства архитектуры с микроядром
- •Производительность микроядра
- •Архитектура микроядер
- •4.4. Потоки и smp в windows 2000
- •Объекты процессов и потоков
- •Многопоточность
- •Состояния потоков
- •Поддержка подсистем операционной системы
- •Поддержка симметричной многопроцессорной обработки
- •4.5. Управление потоками и smp в solaris
- •Мотивация
- •Структура процессов
- •Выполнение потоков
- •Прерывания в роли потоков
- •4 6. Управление процессамии потоками в linux
- •4.7. Резюме, ключевые термины и контрольные вопросы
- •Контрольные вопросы
- •4.8. Рекомендуемая литература
- •4.9. Задачи
4.3. Микроядра
В последнее время большое внимание уделяется концепции микроядер. Микроядро представляет собой остов операционной системы, служащий основой для других ее модулей. Термин не имеет точного определения, и многие вопросы, относящиеся к микроядрам, различные группы разработчиков операционных систем трактуют по-разному. В число этих вопросов входят такие: насколько малым должно быть ядро, чтобы его можно было назвать микроядром; как должны быть разработаны драйверы устройств, чтобы достичь максимальной производительности при абстрагировании их функциональности от особенностей аппаратного обеспечения; как следует выполнять не относящиеся к ядру операции — в пространстве ядра или в пользовательском пространстве, и другие.
Подход с использованием микроядра приобрел популярность после его использования в операционной системе Mach. Теоретически такой подход обеспечивает высокую степень гибкости и модульности. Другим примером удачного использования этого подхода стала операционная система Windows 2000, которая претендует на широкую популярность. Микроядро операционной системы Windows 2000 окружено несколькими компактными подсистемами, что облегчает его реализацию на различных платформах. Некоторые другие программные продукты также реализованы с использованием микроядра. В ближайшем будущем этот подход, по-видимому, будет встречаться в большинстве операционных систем, разрабатываемых для персональных компьютеров, рабочих станций и серверов.
Архитектура микроядра
На структуру ранних операционных систем, разработанных в средине 50-х годов, обращалось мало внимания. Ни у кого не было опыта в разработке действительно больших программных систем, а проблемы взаимозависимости и взаимодействия сильно недооценивались. В подобных монолитных операционных системах (monolithic operating systems) почти все процедуры могли вызывать одна другую. Такое отсутствие структуры было несовместимо с расширением операционных систем. Первая версия операционной системы OS/360 была создана коллективом программистов из 5000 человек за пять лет и содержала более миллиона строк кода. Разработанная несколько позже операционная система Multics содержала уже 20 миллионов строк. Как отмечалось в разделе 2.3, для разработки программного обеспечения такого масштаба требуется использовать методы модульного программирования. В частности, были разработаны слоистые операционные системы (layered operating systems)3 (рис. 4.10,а) с иерархической организацией функций, взаимодействие в которых возможно только между функциями, находящимися на соседних уровнях. При "многослойном" подходе все уровни или большинство из них выполняются в режиме ядра.
"Слоистый" подход тоже не лишен своих проблем. Каждый слой обладает определенными функциональными возможностями, и значительные изменения одного из уровней могут иметь различное влияние (которое трудно предвидеть) на код в смежных слоях (как верхнем, так и нижнем). Поэтому довольно трудно реализовать согласованные версии операционной системы, имеющие на несколько функций больше или меньше, чем в базовой версии. Многочисленные взаимодействия между соседними уровнями усложняют обеспечение безопасности.
Суть философии, лежащей в основе использования микроядра, заключается в том, что в ядре должны быть только самые важные функции операционной системы. Работа служб и приложений, не являющихся критическими, основана на работе микроядра, но выполняются они в пользовательском режиме. И хотя разделение на то, что находится внутри микроядра, и то, что выносится за его пределы, зависит от архитектуры системы; общая тенденция такова, что многие службы, которые традиционно входили в операционную систему, теперь входят во внешние подсистемы, взаимодействующие с ядром и друг с другом. К ним относятся драйверы устройств, файловые системы, менеджер виртуальной памяти, система управления окнами и службы безопасности.
3 Как обычно, терминология в этой области непоследовательна. Термином монолитная операционная система часто обозначаются операционные системы двух видов, для которых в данной книге употребляются названия монолитные и слоистые.
В архитектуре с микроядром традиционное вертикальное расположение уровней заменяется горизонтальным (рис. 4.10,6). Внешние по отношению к микроядру компоненты операционной системы реализуются как обслуживающие процессы. Между собой они взаимодействуют как равноправные партнеры; обычно взаимодействие реализуется с помощью обмена сообщениями, которые передаются через микроядро. Таким образом, ядро выступает в роли посредника: оно подтверждает правильность сообщений, передает их от одного компонента другому и предоставляет доступ к аппаратному обеспечению. Кроме того, микроядро выполняет защитные функции: оно не пропускает сообщение, если такой обмен не разрешен.
Например, если приложению нужно открыть файл, оно отправляет сообщение серверу файловой системы. Если ему нужно создать процесс или поток, оно отправляет сообщение серверу процессов. Каждый из серверов может отправлять сообщения другим серверам и обращаться к элементарным функциям микроядра. Так в одном компьютере реализуется архитектура типа клиент/сервер.