Під архітектурою операційної системи розуміють структурну і функціональну організацію ОС на основі деякої сукупності програмних модулів. До складу ОС входять виконувані і об'єктні модулі стандартних для даної ОС форматів, програмні модулі спеціального формату (наприклад, завантажувач ОС, драйвери введення-виведення), конфігураційні файли, файли документації, модулі довідкової системи і т.д.
На архітектуру ранніх операційних систем зверталося мало уваги: по-перше, ні в кого не було досвіду в розробці великих програмних систем, а по-друге, проблема взаємозалежності та взаємодії модулів недооцінювалася. У подібних монолітних ОС майже всі процедури могли викликати одна одну. Таке відсутність структури було несумісне з розширенням операційних систем. Перша версія ОС OS / 360 була створена колективом з 5000 осіб за 5 років і містила більш 1 млн рядків коду. Розроблена дещо пізніше операційна система Mastics містила до 1975 року вже 20 млн рядків [17]. Стало ясно, що розробка таких систем повинна вестися на основі модульного програмування.
Більшість сучасних ОС є добре структуровані модульні системи, здатні до розвитку, розширення та переносу на нові платформи. Якоїсь єдиної уніфікованої архітектури ОС не існує, але відомі універсальні підходи до структурування ОС. Принципово важливими універсальними підходами до розробки архітектури ОС є [5. 10. 13. 17]:
- модульна організація;
- функціональна надлишковість;
- функціональна вибірковість;
- параметрическая універсальність;
- концепція багаторівневої ієрархічної обчислювальної системи, по якій ОС представляється багатошаровою структурою;
- поділ модулів на дві групи по функціям: ядро - модулі, що виконують основні функції ОС, і модулі, що виконують допоміжні функції ОС;
- поділ модулів ОС на дві групи по розміщенню в пам'яті обчислювальної системи: резидентні, які постійно перебувають в оперативній пам'яті, і транзитні, що завантажуються в оперативну пам'ять тільки на час поповнення своїх функцій;
- реалізація двох режимів роботи обчислювальної системи: привілейованого режиму (режиму ядра - Kernel mode), або режиму супервізора (supervisor mode), і призначеного для користувача режиму (user mode), або режиму завдання (task mode);
- обмеження функцій ядра (а отже, і кількості модулів ядра) до мінімальної кількості необхідних найважливіших функцій.
Перші ОС розроблялися як монолітні системи без чітко вираженої структури (рис. 1.2).
Для побудови монолітної системи необхідно скомпілювати всі окремі процедури, а потім зв'язати їх разом в єдиний об'єктний файл за допомогою компоновщика (прикладами можуть служити ранні версії ядра UNIX або Novell NetWare). Кожна процедура бачить будь-яку іншу процедуру (на відміну від структури, що містить модулі, в якій велика частина інформації є локальною для модуля, і процедури модуля можна викликати тільки через спеціально визначені точки входу).
Однак навіть такі монолітні системи можуть бути трохи структурованими. При зверненні до системних викликів, підтримуваним ОС, параметри поміщаються в строго певні місця, такі як регістри або стек, а потім виконується спеціальна команда переривання, відома як виклик ядра або виклик супервізора. Ця команда перемикає машину з режиму користувача в режим ядра, званий також режимом супервізора, і передає управління ОС. Потім ОС перевіряє параметри виклику, для того щоб визначити, який системний виклик повинен бути виконаний. Після цього ОС індексує таблицю, яка містить посилання на процедури, і викликає відповідну процедуру.
Мал. 1.2. монолітна архітектура
Така організація ОС передбачає наступну структуру [13]:
- головна програма, яка викликає необхідні сервісні процедури;
- набір сервісних процедур, що реалізують системні виклики;
- набір утиліт, які обслуговують сервісні процедури.
У цій моделі для кожного системного виклику є одна сервісна процедура. Утиліти виконують функції, які потрібні декільком сервісним процедурам. Цей поділ процедур на три шари показано на рис. 1.3.
Класичною вважається архітектура ОС, заснована на концепції ієрархічної багаторівневої машини, привілейованому ядрі і призначеному для користувача режимі роботи транзитних модулів. Модулі ядра виконують базові функції ОС: управління процесами, пам'яттю, пристроями введення-виведення і т.п. Ядро складає серцевину ОС, без якої вона є повністю непрацездатною і не може виконати ні одну зі своїх функцій. В ядрі вирішуються внутрішньосистемні задачі організації обчислювального процесу, недоступні для додатка.
Мал. 1.3. структурована архітектура
Особливий клас функцій ядра служить для підтримки додатків, створюючи для них так звану прикладну програмну середу. Додатки можуть звертатися до ядра з запитами - системними викликами - для виконання тих чи інших дій, наприклад, відкриття і читання файлу, отримання системного часу, виведення інформації на дисплей і т.д. Функції ядра, які можуть викликатися додатками, утворюють інтерфейс прикладного програмування - API (Application Programming Interface).
Для забезпечення високої швидкості роботи ОС модулі ядра (принаймні, велика їх частина) є резидентними і працюють в привілейованому режимі (Kernel mode). Цей режим, по-перше, повинен убезпечити роботу самої ОС від втручання додатків, і, по-друге, повинен забезпечити можливість роботи модулів ядра з повним набором машинних інструкцій, що дозволяють власне ядру виконувати управління ресурсами комп'ютера, зокрема, переключення процесора з задачі на задачу, управлінням пристроями введення-виведення, розподілом і захистом пам'яті та ін.
Решта модулі ОС виконують не настільки важливі функції, як ядро, і є транзитними. Наприклад, це можуть бути програми архівування даних, дефрагментації диска, стиснення дисків, очищення дисків і т.п.
Допоміжні модулі зазвичай поділяються на групи:
Ці модулі ОС оформляються як звичайні додатки, звертаються до функцій ядра за допомогою системних викликів і виконуються в режимі користувача (user mode). В цьому режимі забороняється виконання деяких команд, які пов'язані з функціями ядра ОС (управління ресурсами, розподіл і захист пам'яті і т.п.).
У концепції багаторівневої (багатошарової) ієрархічної машини структура ОС також представляється поруч шарів. При такій організації кожен шар обслуговує вищерозміщений шар, виконуючи для нього певний набір функцій, які утворюють міжшарового інтерфейс. На основі цих функцій наступний верхній за ієрархією шар будує свої функції - більш складні і більш потужні і т.д. Така організація системи істотно спрощує її розробку, тому що дозволяє спочатку "зверху вниз" визначити функції шарів і міжшарові інтерфейси, а при детальній реалізації, рухаючись "від низу до верху", - нарощувати потужність функції шарів. Крім того, модулі кожного шару можна змінювати без необхідності змін в інших шарах (але не змінюючи міжшарових інтерфейсів!).
Багатошарова структура ядра ОС може бути представлена, наприклад, варіантом, показаним на рис. 1.4.
Мал. 1.4. Багатошарова структура ОС
В даній схемі виділені наступні шари.
Підвищення стійкості ОС забезпечується переходом ядра в привілейований режим. При цьому відбувається деяке уповільнення виконання системних викликів. Системний виклик привілейованого ядра ініціює перемикання процесора з призначеного для користувача режиму в привілейований, а при поверненні до додатка - зворотне перемикання. За рахунок цього виникає додаткова затримка в обробці системного виклику (рис. 1.5). Однак таке рішення стало класичним і використовується в багатьох ОС (UNIX, VAX, VMS, IBM OS / 390, OS / 2 та ін.).
Мал. 1.5. Обробка системного виклику
Багатошарова класична багаторівнева архітектура ОС не позбавлена своїх проблем. Справа в тому, що значні зміни одного з рівнів можуть мати важко передбачуване вплив на суміжні рівні. Крім того, численні взаємодії між сусідніми рівнями ускладнюють забезпечення безпеки. Тому, як альтернатива класичному варіанту архітектури ОС, часто використовується мікроядерна архітектура ОС.
Суть цієї архітектури полягає в наступному. У привілейованому режимі залишається працювати тільки дуже невелика частина ОС, яка називається мікроядром. Микроядро захищено від інших частин ОС і додатків. До його складу входять машинно-залежні модулі, а також модулі, що виконують базові механізми звичайного ядра. Всі інші більш високорівневі функції ядра оформляються як модулі, що працюють в режимі користувача. Так, менеджери ресурсів, які є невід'ємною частиною звичайного ядра, стають "периферійними" модулями, що працюють в режимі користувача. Таким чином, в архітектурі з мікроядром традиційне розташування рівнів по вертикалі замінюється горизонтальним. Це можна уявити, як показано на рис. 1.6.
Зовнішні по відношенню до мікроядра компоненти ОС реалізуються як обслуговуючі процеси. Між собою вони взаємодіють як рівноправні партнери за допомогою обміну повідомленнями, які передаються через микроядро. Оскільки призначенням цих компонентів ОС є обслуговування запитів додатків користувачів, утиліт і системних обробних програм, менеджери ресурсів, винесені в призначений для користувача режим, називаються серверами ОС, тобто модулями, основним призначенням яких є обслуговування запитів локальних додатків і інших модулів ОС.
Мал. 1.6. Перехід до микроядерной архітектурі
Схематично механізм звернень до функцій ОС, оформленим у вигляді серверів, виглядає, як показано на рис. 1.7.
Мал. 1.7. Клієнт-серверна архітектура
Схема зміни режимів при виконанні системного виклику в ОС з микроядерной архітектурою виглядає, як показано на рис. 1.8. З малюнка ясно, що виконання системного виклику супроводжується чотирма перемиканнями режимів (4 t), в той час як в класичній архітектурі - двома. Отже, продуктивність ОС з микроядерной архітектурою при інших рівних умовах буде нижче, ніж у ОС із класичним ядром.
Мал. 1.8. Обробка системного виклику в микроядерной архітектурі
У той же час визнані наступні переваги микроядерной архітектури [17]:
- однакові інтерфейси;
- простота розширюваності;
- висока гнучкість;
- можливість переносимості;
- висока надійність;
- підтримка розподілених систем;
- підтримка об'єктно-орієнтованих ОС.
Може бути, це здасться парадоксальним, але є і такий підхід до микроядерной ОС, як зменшення мікроядра.
Для можливості уявлення про розмірах мікроядер операційних систем в ряді джерел [17] наводяться такі дані:
- типове микроядро першого покоління - до 300 Кб коду і 140 інтерфейсів системних викликів;
- микроядро ОС L4 (друге покоління) - 12 Кбайт коду і 7 інтерфейсів системних викликів.
В сучасних операційних системах розрізняють наступні види ядер.