Назначение и общая структура ОС
ОС является центральным элементом системного ПО. Ее основные функции:
– обеспечение согласованного функционирования аппаратных и программных средств;
– предоставление возможности общего управления системой.
К основным задачам ОС относятся:
– управление процессами (задачами, потоками, программами, т.е. объектами, потребляющими процессорное время);
– управление ресурсами: памятью, внешними устройствами, файловой системой;
– управление вводом-выводом;
– общее управление и синхронизация.
Саму ОС можно представить как ядро и его программный интерфейс (см. рис. хх).
Ядро ОС осуществляет планирование и управление всеми ресурсами и процессами системы, т.е. выполняет функции, указанные выше.
Программный интерфейс ядра (Application Program Interface – API) обеспечивает доступ к функциям (и объектам) ядра со стороны прикладных программ.
Основные подсистемы ядра функционируют в привилегированном режиме (если в системе вообще предусмотрены уровни привилегий), все остальные программы – в "пользовательском", и они не имеют возможности обращаться к ресурсам вычислительной системы (аппаратуре) напрямую. Таким образом, "правильно" организованная ОС должна изолировать прикладные программы от аппаратуры, защищая одновременно и от сложностей взаимодействия с аппаратурой, и от некорректного поведения прикладных программ.
(В относительно несложных ОС, не требующих многозадачности, или в специализированных деление на привилегированный системный и непривилегированный пользовательский уровень отсутствует, т.к. не требуется. Пример – MS-DOS.)
3) подсистемы, относимые к ОС, но не входящие в ядро.
В некоторых случаях операционную систему можно считать целиком состоящей из одного ядра, к которому обращаются прочие системные и прикладные программы. В других – ядро имеет более или менее сложно внутреннее деление на части, обладающие различной функциональностью и привилегиями (см. ниже).
Архитектуры ОС
Архитектурные особенности ОС …
Наиболее ранние и наиболее простые ОС могли быть организованы, например, в виде расширения (библиотеки) к языку (среде) программирования, и их средства активизировались исключительно по инициативе прикладной программы, написанной на этом языке — т.н. пассивные ОС. В ряде случаев (обычно это разного рода встраиваемые системы) и сейчас возможно распределить функции ОС между исполняемыми прикладными программами. Однако для более сложных вычислительных систем, решающих более разнообразные задачи, особенно если актуальна унификация ПО, — необходимо выделять как самостоятельный элемент ОС, имеющую соответствующую архитектуру.
Монитор – набор программ (подпрограмм) и данных, разделяемых и выполняемых другими программами. При этом монитор все равно пассивен — активизируется только по запросам от прикладных программ.
Абстрактная машина – набор аппаратных средств, обеспечивающий выполнение заранее оговоренного набора функций. Поверх них реализуется программная надстройка, служащая моделью машины для программ и обеспечивающая доступ к аппаратуре. Примером может служить ОС MS-DOS и построенная на ее основе ветвь Windows.
Виртуальная машина – функциональный эквивалент реальной ЭВМ, реализуемый различными аппаратными и программными средствами (также можно сказать – моделируемый/эмулируемый на различных аппаратно-программных платформах). Примерами могут служить Unix-системы, OS/2, Windows NT. Однако наиболее явно она проявляется в т.н. системах виртуальных машин (СВМ) для "больших" ЭВМ, где для каждого пользователя эмулировалась работа на "отдельной" ЭВМ (виртуальные машины, создаваемые продуктами типа VMWare, либо виртуальная Java-машина и ей подобные реализуют схожие идеи, но для других задач и на ином уровне).
2.2.1. Системы с монолитным ядром (monolithic kernel)
Простейший, наиболее естественный и поэтому традиционный способ организации ядра ОС – представить его как единую программу, состоящую из набора подпрограмм, служащих обработчиками запросов через API и аппаратных событий. Ядро целиком функционирует на едином уровне привилегий (если они есть), каждая его подпрограмма может (потенциально) вызвать любую другую, и ОС можно считать целиком состоящей из одного ядра. Если ядро достаточно сложное и объемное, оно может быть структурировано – выделяются группы подпрограмм, отличающиеся назначением и интерфейсом: диспетчер системных функций, обслуживание API, сервисные процедуры и т.д.
Монолитное ядро позволяет минимизировать "внутренние" непроизводительные затраты (за счет использования только простых процедурных вызовов), но критично к качеству проектирования и программирования, для изменения его конфигурации, как правило, необходима полная перекомпиляция (повторная "сборка").
Монолитное ядро характерно для ранних ОС, в настоящее время применяется в основном сравнительно простыми системами. В то же время, этой архитектуре (в ряде случаев — модификациями) следует большинство Unix-систем.
После появления микроядерной архитектуры (см. ниже) монолитное ядро стали называть также макроядром.
2.2.2. Многоуровневые ("слоеные") системы (layered system)
Логичным развитием идеи структурирования системы является построение ее в виде иерархии модулей – "слоев", каждый из которых отвечает за определенный набор взаимосвязанных функций, причем каждый слой взаимодействует лишь с соседними с ним. Такой подход применяется вообще очень широко не только в ОС, но и в самых различных сложных системах; получаемую структуру часто называют "стеком" уровней (модулей, протоколов и т.п.); характерный пример – стековая модель "взаимодействия открытых систем" OSI. В случае ОС нижний слой обычно отвечает за взаимодействие с аппаратурой, верхний – с программами пользователя, общие количество и функции зависят от особенностей конкретной системы. Например, ОС THE (Technishe Hogeschool Eindhoven, первая "слоёная" ОС, реализована под руководством Дейкстры в 1968 г) имела 6 уровней.
Многоуровневые системы благодаря иерархическому структурированию удобны для реализации и отладки, а также модификации (модули слоёв можно относительно легко заменить). Однако повышаются требования к качеству проектирования (сложность выделения ограниченного числа слоев со строго стековой иерархией) и служебные затраты при функционировании (многократная передача запросов и данных сквозь стек слоёв). Реально же многоуровневое иерархическое построение применяется в том или ином виде в подавляющем большинстве сложных систем.
2.2.3. Микроядерная архитектура (microkernel architecture)
Представляет собой еще один вариант многоуровневой организации. Выделяется микроядро – специальный модуль ядра, реализующий наиболее важные функции ОС. Обычно это управление прочими процессами и взаимодействие между ними; управление ресурсами, включая память, в т.ч. виртуальную; ввод-вывод; первичная обработка прерываний. Все остальные процессы в системе взаимодействуют либо с микроядром, либо посредством его – друг с другом. Иногда набор функций микроядра может быть сведен к приему запросов на обслуживание (в т.ч. и от аппаратуры, т.е. прерываний) и перенаправлению их соответствующим модулям-обработчикам. Микроядро обязательно работает в привилегированном режиме, остальные процессы, включая системные, могут оставаться на пользовательском уровне привилегий. Запросы к микроядру не могут быть просто вызовами подпрограмм, т.к. связаны с переключением уровня привилегий; их принято называть сообщениями (не путать с сообщениями, используемыми при событийном управлении прикладными программами, например, оконными сообщениями Windows, см. хх).
Основная цель такой архитектуры – минимизировать объем высокопривилегированного (нередко – также и аппаратно-зависимого) кода и повысить модульность системы: большинство необходимых системных процессов могут исполняться, останавливаться или заменяться другими так же, как и обычные прикладные программы. К недостаткам относятся дополнительные затраты при использовании интерфейса сообщений – гораздо бóльшие, чем в случае процедурного интерфейса. Как и в случае любой "не-монолитной" ОС, значительную сложность может представлять проектирование иерархии модулей, в данном случае включение конкретных функций в микроядро либо отнесение их к "внешним".
На основе микроядра построен ряд систем реального времени, например, Unix-подобная QNX (впрочем, их с успехом строят и монолитными). Элементы микроядерной архитектуры присутствуют в Windows NT и 4.4BSD.
В 1989 году Ирой Голдштейн и Полом Дейлом был введен термин микроядро (microkernel).
2.2.4. Виртуальные машины (virtual machine)
Доведенная до логического завершения идея изоляции пользовательского уровня от деталей вычислительной системы. Вместо прямого или косвенного обращения к ним все программы взаимодействуют только с виртуальной машиной – функциональным эквивалентом реальной, но реализуемой различными аппаратными и программными средствами, а точнее – выполняются ею. "Глубина" реализации может быть различной: виртуальная машина может выполнять "виртуальные" машинные команды, эмулируя работу "виртуального" процессора, а может – строки алгоритмического языка высокого уровня ("встроенный" в систему интерпретатор, например, Forth- или Java-машины). Соответственно, зависимой от аппаратной платформы будет только сама виртуальная машина, прочее же ПО, включая наиболее сложные высокоуровневые алгоритмы самой ОС, может и должно быть написано переносимым, что существенно упрощает унификацию ПО, создание программно-совместимых семейств ЭВМ. Например, архитектура Windows NT предусматривает наличие уровня HAL (Hardware Abstraction Layer), играющего аналогичную роль – изолировать ("абстрагировать") вышестоящие уровни от аппаратуры, что теоретически делает систему межплатформенной.
Первой ОС, основанной на концепции виртуальной машины, считается CP/CMS (она же VM/370) для семейства машин IBM/370. Впоследствии часто использовались для организации многопользовательского режима (предоставление каждому пользователю "собственной" виртуальной машины, поддерживаемой средствами одной "большой" ЭВМ), эмуляции рабочих мест для заданной программной конфигурации (продукты типа VMWare), выполнения чужеродного кода (эмуляторы процессоров) и т.д., т.е. не обязательно в качестве собственно ОС. Общим недостатком любых "виртуальных машин" остается мéньшее быстродействие и бóльшие затраты ресурсов по сравнению с "родной" платформой из-за необходимости фактически интерпретировать "чужой" код вместо естественного его исполнения.
Эмулировать заданную архитектуру можно и аппаратными средствами, но это уже не имеет отношения к программным архитектурам.
2.2.4. Смешанная архитектура
Представляет собой попытку совместить достоинства различных архитектур и/или компенсировать их недостатки. Встречается часто, т.к. "чистые" архитектуры на практике обычно приходится "подгонять" к конкретным реальным условиям. Например, архитектура MS Windows NT определяется как "модифицированная микроядерная".