Багатошарова структура ОС

Обчислювальну систему, працюючу під управлінням ОС на основі ядра, можна розглядати як систему, що складається з трьох ієрархічно розташованих шарів : нижній шар утворює апаратура, проміжний — ядро, а утиліти, оброблювальні програми і додатки, складають верхній шар системи (мал. 3.6). Шарувату структуру обчислювальної системи прийнято зображувати у вигляді системи концентричних кіл, ілюструючи той факт, що кожен шар може взаємодіяти тільки з суміжними шарами. Дійсно, при такій організації ОС додатка не можуть безпосередньо взаємодіяти з апаратурою, а тільки через шар ядра.

Мал. 3.6. Тришарова схема обчислювальної системи

 

Багатошаровий підхід є універсальним і ефективним способом декомпозиції складних систем будь-якого типу, у тому числі і програмних. Відповідно до цього підходу система складається з ієрархії шарів. Кожен шар обслуговує вищерозміщений шар, виконуючи для нього деякий набір функцій, які утворюють міжшаровий інтерфейс (мал. 3.7). На основі функцій шару, що пролягає нижче, наступний (вгору за ієрархією) шар будує свої функції — складніші і потужніші, які, у свою чергу, виявляються примітивами для створення ще потужніших функцій вищерозміщеного шару. Суворі правила торкаються тільки взаємодії між шарами системи, а між модулями усередині шару зв'язку можуть бути довільними. Окремий модуль може виконати свою роботу або самостійно, або звернутися до іншого модуля свого шару, або звернутися по допомогу до шару, що пролягає нижче, через міжшаровий інтерфейс.

Така організація системи має багато достоїнств. Вона істотно спрощує розробку системи, оскільки дозволяє спочатку визначити зверху «вниз» функції шарів і міжшарові інтерфейси, а потім при детальній реалізації поступово нарощувати потужність функцій шарів, рухаючись «від низу до верху». Крім того, при модернізації системи можна змінювати модулі усередині шару без необхідності робити які-небудь зміни в інших шарах, якщо при цих внутрішніх змінах міжшарові інтерфейси залишаються в силі.

Мал. 3.7. Концепція багатошарової взаємодії

 

Оскільки ядро є складним багатофункціональним комплексом, то багатошаровий підхід зазвичай поширюється і на структуру ядра.

Ядро може складатися з наступних шарів:

Засоби апаратної підтримки ОС. Досі про операційну систему говорилося як про комплекс програм, але, взагалі кажучи, частина функцій ОС може виконуватися і апаратними засобами. Тому іноді можна зустріти визначення операційної системи як сукупності програмних і апаратних засобів, що і відбите на мал. 3.8. До операційної системи відносять, природно, не усі апаратні облаштування комп'ютера, а тільки засоби апаратної підтримки ОС, тобто ті, які прямо беруть участь в організації обчислювальних процесів : засоби підтримки привілейованого режиму, систему переривань, засобу перемикання контекстів процесів, засобу захисту областей пам'яті і т. п.

Машинно-залежні компоненти ОС. Цей шар утворюють програмні модулі, в яких відбивається специфіка апаратної платформи комп'ютера. У ідеалі цей шар повністю екранує вищерозміщені шари ядра від особливостей апаратури. Це дозволяє розробляти вищерозміщені шари на основі машинно-незалежних модулів, існуючих в єдиному екземплярі для усіх типів апаратних платформ, підтримуваних цією ОС. Прикладом екрануючого шару може служити шар HAL операційної системи Windows NT.

Базові механізми ядра. Цей шар виконує найбільш примітивні операції ядра, такі як програмне перемикання контекстів процесів, диспетчеризацію переривань, переміщення сторінок з пам'яті на диск і назад і т. п. Модулі цього шару не приймають рішень про розподіл ресурсів — вони тільки відпрацьовують прийняті «вгорі» рішення, що і дає привід називати їх виконавчими механізмами для модулів верхніх шарів. Наприклад, рішення про те, що в даний момент треба перервати виконання поточного процесу А і почати виконання процесу, приймається менеджером процесів на вищерозміщеному шарі, а шару базових механізмів передається тільки директива про те, що треба виконати перемикання з контексту поточного процесу на контекст процесу В.

Менеджери ресурсів. Цей шар складається з потужних функціональних модулів, що реалізовують стратегічні завдання по управлінню основними ресурсами обчислювальної системи. Зазвичай на цьому шарі працюють менеджери (що називаються також диспетчерами) процесів, введення-виводу, файлової системи і оперативної пам'яті. Розбиття на менеджери може бути і декілька іншим, наприклад менеджер файлової системи іноді об'єднують з менеджером введення-виводу, а функції управління доступом користувачів до системи в цілому і її окремим об'єктам доручають окремому менеджерові безпеки. Кожен з менеджерів веде облік вільних і використовуваних ресурсів певного типу і планує їх розподіл відповідно до запитів додатків. Наприклад, менеджер віртуальної пам'яті управляє переміщенням сторінок з оперативної пам'яті на диск і назад. Менеджер повинен відстежувати інтенсивність звернень до сторінок, час перебування їх в пам'яті, стану процесів, що використовують дані, і багато інших параметрів, на підставі яких він час від часу приймає рішення про те, які сторінки необхідно вивантажити і які — завантажити. Для виконання прийнятих рішень менеджер звертається до шару базових механізмів, що пролягає нижче, із запитами про завантаження (вивантаженню) конкретних сторінок. Усередині шару менеджерів існують тісні взаємні зв'язки, що відбивають той факт, що для виконання процесу потрібний доступ одночасно до декількох ресурсів — процесора, області пам'яті, можливо, до певного файлу або облаштування введення-виводу. Наприклад, при створенні процесу менеджер процесів звертається до менеджера пам'яті, який повинен виділити процесу певну область пам'яті для його кодів і даних.

Інтерфейс системних викликів. Цей шар є самим верхнім шаром ядра і взаємодіє безпосередньо з додатками і системними утилітами, утворюючи прикладний програмний інтерфейс операційної системи. Функції API, обслуговуючі системні виклики, надають доступ до ресурсів системи в зручній і компактній формі, без вказівки деталей їх фізичного розташування. Наприклад, в операційній системі UNIX за допомогою системного виклику fd = open("/doc/a.txt", 0_RDONLY) застосування відкриває файл a.txt, що зберігається в каталозі /doc, а за допомогою системного виклику read(fd, buffer, count) читає з цього файлу в область свого адресного простору, що має ім'я buffer, деяка кількість байт. Для здійснення таких комплексних дій системні виклики зазвичай звертаються за допомогою до функцій шару менеджерів ресурсів, причому для виконання одного системного виклику може знадобитися декілька таких звернень.

Мал. 3.8. Багатошарова структура ядра ОС

 

Приведене розбиття ядра ОС на шари є досить умовним. У реальній системі кількість шарів і розподіл функцій між ними може бути і іншим. У системах, призначених для апаратних платформ одного типу, наприклад ОС NetWare, шар машинно-залежних модулів зазвичай не виділяється, зливаючись з шаром базових механізмів і, частково, з шаром менеджерів ресурсів. Не завжди оформляються в окремий шар базові механізми — в цьому випадку менеджери ресурсів не лише планують використання ресурсів, але і самостійно реалізують свої плани.

Можлива і протилежна картина, коли ядро складається з більшої кількості шарів. Наприклад, менеджери ресурсів, складаючи певний шар ядра, у свою чергу, можуть мати багатошарову структуру. Передусім це відноситься до менеджера введення-виводу, нижній шар якого складають драйвери пристроїв, наприклад драйвер жорсткого диска або драйвер мережевого адаптера, а верхні шари — драйвери файлових систем або протоколів мережевих служб, що мають справу з логічною організацією інформації.

Спосіб взаємодії шарів в реальній ОС також може відхилятися від описаної вище схеми. Для прискорення роботи ядра в деяких випадках відбувається безпосереднє звернення з верхнього шару до функцій нижніх шарів, минувши проміжні. Типовим прикладом такої «неправильної» взаємодії є початкова стадія обробки системного виклику. На багатьох апаратних платформах для реалізації системного виклику використовується інструкція програмного переривання. Цим додаток фактично викликає модуль первинної обробки переривань, який знаходиться в шарі базових механізмів, а вже цей модуль викликає потрібну функцію з шару системних викликів. Самі функції системних викликів також іноді порушують субординацію ієрархічних шарів, звертаючись прямо до базових механізмів ядра.

Вибір кількості шарів ядра є відповідальною і складною справою: збільшення числа шарів веде до деякого уповільнення роботи ядра за рахунок додаткових накладних витрат на міжшарову взаємодію, а зменшення числа шарів погіршує розширюваність і логічність системи. Зазвичай операційні системи, що пройшли довгий шлях еволюційного розвитку, наприклад багато версій UNIX, мають неврегульоване ядро з невеликим числом чітко виділених шарів, а у порівняно «молодих» операційних систем, таких як Windows NT, ядро розділене на більше число шарів і їх взаємодію формалізовано в набагато більшій мірі.