Керування ресурсами центрального процесора і багатозадачність
Деякі операційні системи дозволяють виконувати тільки одну програму в конкретний проміжок часу (таким чином, наприклад, працює більшість систем сімейства MS-DOS). Проте більшість сучасних операційних систем дозволяє додаткам функціонувати сукупно. Ситуація, коли програми виконуються одночасно, називається багатозадачністю (multitasking), а операційна система, яка дозволяє працювати в такому режимі, - багатозадачною операційною системою (multitasking operating system).
Комп’ютерні програми, які написані для багатозадачних систем, самі часто містять декілька незалежних задач, які виконуються паралельно. Подібні маленькі програми-задачі отримали назву потоків (threads), оскільки вони разом формують єдиний потік інструкцій програми, які виконуються. Кожний потік забезпечений персональним набором значень регістрів центрального процесора – контекстом (context). Потоки, які виконуються в середині одної програми, можуть використовувати загальну область оперативної пам’яті. Група потоків, які поділяють загальний простір пам’яті і спільно користуються ресурсами операційної системи, носить назву процесу (process). Якщо процесор і операційна система підтримують роботу з так званою віртуальною пам’яттю, то кожний окремо взятий процес може виконуватися в своєму адресному просторі, який захищений від доступу зі сторони інших процесів.
Оскільки в конкретний момент часу процесор може відпрацьовувати інструкції тільки одної програми, операційна система повинна сама вирішувати, які саме набори інструкцій (потоки) будуть виконуватися. Процес прийняття рішень такого роду називається плануванням (scheduling). Планування задач зазвичай покладають на центральну частину операційної системи – ядро (kernel). В залежності від специфіки додатків, на виконання яких розрахована конкретна операційна система, можуть використовуватися різні механізми планування потоків. Різні типи додатків (пакетні додатки, інтерактивні, програми реального часу) по-різному завантажують центральний процесор. Тому в цілому продуктивність системи істотно залежить від вибраного механізму планування.
Найпростіший метод планування заключається у вистроюванні всіх потоків в порядку їх появи і виконання кожного потоку до повного його завершення. Цей механізм отримав назву виконання до повного завершення в порядку FIFO (first-in-first-out – аналог черги: першим увійшов – першим вийшов). Безперечними перевагами даного методу планування являються простота реалізації, дуже низький показник розрахункових затрат і його „справедливість” – всі потоки обробляються почергово по мірі їх появи.
Розглянутий метод планування добре використовувати для пакетних і деяких транзакціонним застосуванням, які послідовно обробляють дані, а потім завершують свою роботу. В той час дана схема абсолютно не може застосовуватись для інтерактивних застосувань і застосувань реального часу.
Оскільки інтерактивні програми повинні оперативно обслуговувати зовнішні пристрої і реагувати на команди користувача, таки застосування потребують швидкого, хоч і короткочасного доступу до ресурсів центрального процесору.
Одним із шляхів вирішення даної проблеми являється призначення пріоритетів для кожного потоку. Критичні по часу виконання потоки, які потребують оперативності зі сторони центрального процесора, наділяються більш високим пріоритетом ніж, скажемо, пакетні застосування. Потоки з більш високим пріоритетом можуть напряму переміщатися до початку черги очікуючи виконання потоків. Якщо ж в черзі присутні декілька потоків з основним пріоритетом, то вони виконуються в порядку їх появи ( так само, як і для звичайного планування FIFO). Описаний метод планування носить назву пріоритетне виконання до повного завершення (run-to-completion priority scheduling).
Не дивлячись на то , що пріоритетне планування задач має несумнівні переваги перед плануванням FIFO, воно все ж таки має серйозний недолік – потік з високим пріоритетом може монополізувати використання центрального процесора. До того ж, якщо процесор вже зайнятий виконанням потоку з низьким пріоритетом, який віднімає більше процесорного часу, потоки з більш високим пріоритетом „застрягають” в черзі на виконання, очікуючи звільнення процесору. Для вирішення проблеми, яка виникла, розглянутий метод планування повинен мати можливість відкладати (переривати) виконання поточного потоку, таким чином, щоб інші потоки могли користуватися ресурсами центрального процесора.
Пріоритетне переривання виконання
Вимушена зупинка виконання одного потоку з ціллю надання ресурсів центрального процесора називається пріоритетним перериванням (preemption), а відповідний метод планування – планування з пріоритетним перериванням (preemptive scheduling, або преємптивне планування). Функція преємптивного переривання цілком покладається на ядро операційної системи, яке періодично змінює потоки, які виконуються процесором, шляхом переключення контекстів (context switch). Сигналом, по якому буде проходити переключення контекстів, може виступати, наприклад, системний таймер або ж прямий виклик функції ядра системи. В першому випадку кожному потоку виділяється проміжок часу виконання центральним процесором. По закінченню цього часу потік штучно переривається, і ресурси передаються наступному. Якщо ж потік сам вирішив передати повноваження своїм конкурентам, він викликає спеціальну функцію ядра системи, яка і виконує переключення потоків. Таким чином, коли поступає сигнал на переключення контекстів, ядро вибирає черговий потік з черги, а перерваний потік вертає назад очікувати наступну можливість використовувати ресурси процесора.
Перерахуємо основні переваги багатозадачності з пріоритетним перериванням.
Передбачуваність. Потік „знає” з деякою точністю, коли він буде виконуватися в наступний раз. Наприклад, враховуючи можливості ядра, потік може бути настроєним на його запуск раз в секунду. Програміст може бути цілком впевнений, що виконання потоку буде сплановано таким чином.
Стабільність. У потоків нема. Ніякої можливості монополізувати використання ресурсів центрального процесора. А потік, який увійшов в нескінченний цикл (простіше „який завис”), ніяк не впливає на виконання інших потоків.
Звичайно, розглянутий метод планування має і свої недоліки, які перераховані нижче.
Менша ефективність. В порівнянні з методом виконання до повного завершення, багатозначність з перериванням не є такою ефективною, так як потребує більш частішого переключення контекстів. Процесор витрачає більше часу, ніж якщо б він виконував їх без всяких переривань до повного завершення.
Складність прикладних програм. Оскільки потік може бути перерваним практично в любий момент, це покладає на програміста певну відповідальність. Програмний код повинен буди розроблений таким чином, щоб запобігти втрату даних під час переривання виконання.
Керування пам’яттю
Операційна система також виконує управління оперативною пам’яттю комп’ютера. Зазвичай пам’ять розділяється на різноманітні частини: одна частина використовується для розміщення коду (інструкцій, які виконується центральним процесором), інша – для програмних даних. Вільна область пам’яті, з якої система може динамічно виділяти області для чергового використання, отримала назву кучі (heap)/
Деякі операційні системи дозволяють процесам адресувати більший простір пам’яті, ніж фізично встановлене в комп’ютері, - це так звана віртуальна пам’ять (virtual memory). Механізм віртуальної пам’яті дозволяє розширити область доступної пам’яті за рахунок використання додаткового носія, такого як жорсткий диск. Використання віртуальної пам’яті базується на апаратній особливості деяких процесорів, в середині яких міститься так званий блок управління пам’яттю (memory map unit – MMU). Механізм MMU автоматично переадресовує запроси або до оперативної пам’яті (random access memory – RAM), або до додаткового носія (жорсткий диск), в залежності від того, де в дійсності знаходяться дані, які запитуються. Використання механізму MMU також дозволяє захищати фрагменти пам’яті, позначуючи їх атрибутом „тільки для читання” або взагалі виключаючи з операцій з картою пам’яті.
Віртуальна пам’ять має також і інші переваги: механізм MMU може бути запрограмований таким чином, щоб відділяти області пам’яті різноманітних процесів один від одного. Таким чином, запобігається доступ до пам’яті одного процесу зі сторони інших.
Маючи всі свої переваги, віртуальна пам’ять не дається системі „даром”. Платити приходиться продуктивністю. Саме по цій причині система IOS не використовує механізм віртуальної пам’яті в повній мірі, як ми помачимо далі.
Переривання
Операційні системи зазвичай виконують обробку переривань центрального процесору. Переривання – це апаратна подія, по якій виконання поточного набору інструкцій призупиняється, а управління передається спеціальній програмі. Ця спеціальна програма – обробник переривання (interrupt handler) – виконує необхідні дії, зв’язані з природою переривання, і повертає процесор до виконання припиненого н