Тенденції в структурній побудові операційних систем
У загальному випадку "структура" монолітної системи являє собою відсутність структури. ОС написана як набір процедур, кожна з яких може викликати інші, коли їй це потрібно. При використанні цієї техніки кожна процедура системи має добре певний інтерфейс в термінах параметрів і результатів, і кожна вільна викликати будь-яку іншу для виконання певної потрібної для неї корисною роботи.
Для побудови монолітної системи необхідно скомпілювати всі окремі процедури, а потім зв'язати їх разом в єдиний об'єктний файл за допомогою компоновщика (прикладами можуть служити ранні версії ядра UNIX або Novell NetWare). Кожна процедура бачить будь-яку іншу процедуру (на відміну від структури, що містить модулі, в якій велика частина інформації є локальною для модуля, і процедури модуля можна викликати тільки через спеціально визначені точки входу).
Однак навіть такі монолітні системи можуть бути трохи структурованими. При зверненні до системних викликів, підтримуваним ОС, параметри поміщаються в строго певні місця, такі, як регістри або стек, а потім виконується спеціальна команда переривання, відома як виклик ядра або виклик супервізора. Ця команда перемикає машину з режиму користувача в режим ядра, званий також режимом супервізора, і передає управління ОС. Потім ОС перевіряє параметри виклику для того, щоб визначити, який системний виклик повинен бути виконаний. Після цього ОС індексує таблицю, яка містить посилання на процедури, і викликає відповідну процедуру. Така організація ОС передбачає наступну структуру:
а) головна програма, яка викликає необхідні сервісні процедури;
б) набір сервісних процедур, що реалізують системні виклики.
В) набір утиліт, які обслуговують сервісні процедури.
Узагальненням попереднього підходу є організація ОС як ієрархії рівнів. Рівні утворюються групами функцій операційної системи - файлова система, управління процесами і пристроями і т.п. Кожен рівень може взаємодіяти тільки зі своїм безпосереднім сусідом - вище-або нижчого рівня. Прикладні програми або модулі самої операційної системи передають запити вгору і вниз за цими рівнями.
Першою системою, побудованої таким чином була проста пакетна система THE, яку побудував Дейкстра і його студенти в 1968 році. Система мала 6 рівнів. Рівень 0 займався розподілом часу процесора, перемикаючи процеси по перериванню або після закінчення часу. Рівень 1 керував пам'яттю - розподіляв оперативну пам'ять і простір на магнітному барабані для тих частин процесів (сторінок), для яких не було місця в ОП, тобто шар 1 виконував функції віртуальної пам'яті. Шар 2 керував зв'язком між консоллю оператора і процесами. За допомогою цього рівня кожен процес мав свою власну консоль оператора. Рівень 3 керував пристроями введення-виведення і буферизованного потоки інформації до них і від них. За допомогою рівня 3 кожен процес замість того, щоб працювати з конкретними пристроями, з їх різноманітними особливостями, звертався до абстрактним пристроїв введення-виведення, що володіє зручними для користувача характеристиками. На рівні 4 працювали призначені для користувача програми, яким не треба було дбати ні про процеси, ні про пам'ять, ні про консолі, ні про управління пристроями введення-виведення. Процес системного оператора розміщувався на рівні 5.
В системі THE багаторівнева схема служила, в основному, цілям розробки, так як всі частини системи компонувалися потім в загальний об'єктний модуль.
Багаторівневий підхід був також використаний при реалізації різних варіантів ОС UNIX.
Хоча такий структурний підхід на практиці зазвичай працював непогано, сьогодні він все більше сприймається монолітним. У системах, що мають багаторівневу структуру було нелегко видалити один шар і замінити його іншим в силу множинності і розмитості інтерфейсів між шарами.