
- •2 Структура пз
- •3 Операційні системи
- •3.1 Загальні зведення
- •3.2 Основні складові функції сучасних ос
- •3.2.1 Системи планування
- •3.2.2 Синхронізація та обмін даними між процесами
- •3.2.3 Системи керування пам’яттю
- •3.2.4 Система керування файлами
- •3.2.5 Системи керування вводом-виводом
- •3.2.6 Переривання
- •3.3 Деякі сучасні ос
- •3.3.1 Ос сімейства dos
- •3.3.2 Ос сімейства os/2
- •3.3.3 Ос сімейства Windows
- •3.3.4 Ос сімейства Unix
- •3.3.5 Мережна ос реального часу qnx
- •4 Сервісні системи
- •4.1 Інтерфейсні системи
- •4.2 Оболонки ос
- •2.2.3 Утиліти
- •5 Інструментальні системи
- •5.1 Системи програмування
- •5.2 Системи управління базами даних
- •5.3 Інструментарій штучного інтелекту
- •5.4 Редактори
- •5.5 Інтегровані системи
- •5.6 Сучасні системи програмування
- •5.7 Прикладне по
- •6 Особливості проектування спо
- •6.1 Асемблери
- •6.1.1 Машинно-залежні характеристики асемблера
- •6.1.2 Машинно-незалежні характеристики асемблера
- •6.1.3 Варіанти побудови асемблерів
- •6.2 Завантажники й програми зв'язування
- •6.2.1 Машинно-залежні властивості завантажника
- •6.2.2 Машинно-незалежні властивості завантажників
- •6.2.3 Побудова завантажників.
- •6.3 Макропроцесори
- •6.3.1 Машинно-незалежні особливості.
- •6.3.2 Варіанти побудови макропроцесорів.
- •6.4 Компілятори
- •6.4.1 Граматика.
- •6.4.2 Лексичний аналіз.
- •6.4.3 Синтаксичний аналіз.
- •6.4.4 Генерація коду.
- •6.4.5 Машинно-залежні особливості компіляторів.
- •6.4.6 Машинно-незалежні особливості компіляторів.
- •6.4.7 Варіанти побудови компіляторів.
- •6.4.8 Інтерпретатори.
- •6.4.9 Компілятори на p-код.
- •6.4.10 Компілятори компіляторів.
- •6.5 Основи побудови операційних систем
- •6.5.1 Принципи побудови ос
- •6.5.2 Основні структурні рішення
- •6.5.3 Принципи побудови інтерфейсів ос
- •Література
3.2.6 Переривання
Призначення і типи переривань
Переривання є основною рушійною силою будь-якої операційної системи. Періодичні переривання від таймера викликають зміну процесів у мультипрограмної ОС, а переривання від пристроїв вводу-виводу керують потоками даних, якими обчислювальна система обмінюється із зовнішнім світом. Система переривань переводить процесор на виконання потоку команд, відмінного від того, котрий виконувався, з наступним поверненням до вихідного коду. Механізм переривань схожий на механізм виконання процедур, однак, між ними маються істотні відмінності. Переключення по перериванню відрізняється від переключення, що відбувається по команді безумовного чи умовного переходу, передбаченої програмістом у потоці команд додатка. Перехід по команді відбувається в заздалегідь визначених програмістом пунктах програми в залежності від вихідних даних, оброблюваних програмою. Переривання ж відбувається в довільному пункті потоку команд програми, що програміст не може прогнозувати. Переривання виникає або в залежності від зовнішніх подій, або з появою непередбачених аварійних ситуацій у процесі виконання програми. Подібність же переривань із процедурами полягає в тому, що в обох випадках виконується деяка підпрограма, що обробляє спеціальну ситуацію, а потім продовжується виконання основної програми.
У залежності від джерела переривання поділяються на три великих класи:
- зовнішні;
- внутрішні;
- програмні.
Зовнішні переривання можуть виникати в результаті дій користувача чи оператора за терміналом, або ж у результаті надходження сигналів від апаратних пристроїв. Зовнішні переривання називають також апаратними, тому що вони виникають унаслідок подачі апаратурою електричного сигналу на спеціальний вхід переривання процесора. Даний клас переривань є асинхронним стосовно потоку інструкцій програми, що переривається. Апаратура процесора працює так, що асинхронні переривання виникають між виконанням двох сусідніх інструкцій, при цьому система після обробки переривання продовжує виконання процесу, вже починаючи з наступної інструкції.
Внутрішні переривання, називані також виключеннями, відбуваються синхронно виконанню програми з появою аварійної ситуації у ході виконання інструкції програми. Виключення виникають безпосередньо в ході виконання тактів команди («всередині» виконання).
Програмні переривання виникають при виконанні особливої команди процесора, виконання якої імітує переривання, тобто перехід на нову послідовність інструкцій.
Перериванням приписується пріоритет, за допомогою якого вони ранжируються по ступені важливості. Про переривання, що мають однакове значення пріоритету, говорять, що вони відносяться до одного рівня пріоритету переривань.
Переривання обробляються модулями операційної системи, тому що дії, виконувані по перериванню, відносяться до керування поділюваними ресурсами обчислювальної системи - принтером, диском, таймером, процесором і т.п. Процедури, викликувані по перериваннях, називають оброблювачами переривань, чи процедурами обслуговування переривань. Апаратні переривання обробляються драйверами відповідних зовнішніх пристроїв, виключення - спеціальними модулями ядра, а програмні переривання - процедурами ОС, що обслуговують системні виклики. Крім цих модулів в операційній системі може знаходитися диспетчер переривань, що координує роботу окремих оброблювачів переривань,
Механізм переривань
Механізм переривань підтримується апаратними засобами комп'ютера і програмними засобами операційної системи. Апаратна підтримка переривань має свої особливості, що залежать від типу процесора й інших апаратних компонентів, що передають сигнал запиту переривання від зовнішнього пристрою до процесора. Особливості апаратної реалізації переривань впливають на засоби програмної підтримки переривань, що працюють у складі ОС.
Існують два основних способи, за допомогою яких виконуються переривання: векторний і опитуваний. В обох способах процесору дається інформація про рівень пріоритету переривання на шині підключення зовнішніх пристроїв. У випадку векторних переривань у процесор передається також інформація про початкову адресу програми обробки виниклого переривання - оброблювача переривань.
Пристроям, що використовують векторні переривання, призначається вектор переривань. Він являє собою електричний сигнал, що виставляється на відповідні шини процесора і несучий у собі інформацію про визначений та закріплений за даним пристроєм номер, яким ідентифікується відповідний оброблювач переривань. Цей вектор може бути фіксованим, конфігуруємим або програмувальним. Операційна система може передбачати процедуру реєстрації вектора обробки переривань для визначеного пристрою, що зв'язує підпрограму обробки переривань із визначеним вектором. При одержанні сигналу запиту переривання процесор виконує спеціальний цикл підтвердження переривання, у якому пристрій повинний ідентифікувати себе. Протягом цього циклу пристрій відповідає, виставляючи на шині вектор переривань. Потім процесор використовує цей вектор для перебування оброблювача даного переривання.
При використанні опитуваних переривань процесор одержує від пристрою, що запросило переривання, тільки інформацію про рівень пріоритету переривання. З кожним рівнем переривань може бути зв'язано кілька пристроїв і відповідно кілька програм - оброблювачів переривань. При виникненні: переривання процесор повинний визначити, яке пристрій з тих, який зв'язані з даним рівнем переривань, дійсно запросило переривання. Це досягається викликом усіх оброблювачів переривань для даного рівня пріоритету, поки один з оброблювачів не підтвердить, що переривання прийшло від пристрою, що обслуговується їм.
Механізм переривань деякої апаратної платформи може сполучити векторний і опитуваний типи переривань.
Механізм переривань частіше підтримує пріоритезацію і маскуювання переривань. Пріоритезація означає, що всі джерела переривань поділяються на класи і кожен клас призначається свій рівень пріоритету запиту на переривання. Пріоритети можуть обслуговуватися як відносні й абсолютні. Обслуговування запитів переривань за схемою з відносними пріоритетами полягає в тім, що при одночасному надходженні запитів переривань із різних класів вибирається запит, що має вищий пріоритет. Однак надалі при обслуговуванні цього запиту процедура обробки переривання вже не відкладається навіть у тому випадку, коли з'являються більш пріоритетні запити - рішення про вибір нового запиту приймається тільки в момент завершення обслуговування чергового переривання. Якщо ж більш пріоритетним перериванням дозволяється припиняти роботу процедур обслуговування менш пріоритетних переривань, то це означає, що працює схема пріоритезації з абсолютними пріоритетами,
Якщо процесор працює за схемою з абсолютними пріоритетами, то він підтримує в одному зі своїх внутрішніх регістрів перемінний, фіксуючий рівень пріоритету, що обслуговується в даний момент переривання. При надходженні запиту з визначеного класу його пріоритет порівнюється з поточним пріоритетом процесора, і якщо пріоритет запиту вище, те поточна процедура обробки переривань витісняється, а по завершенні обслуговування нового переривання відбувається повернення до перерваної процедури.
Упорядковане обслуговування запитів переривань поряд із схемами пріоритетної обробки запитів може виконуватися механізмом маскування запитів. Схема маскування припускає можливість тимчасової заборони на переривання.
Узагальнено послідовність дій апаратних і програмних засобів по обробці переривання можна описати в такий спосіб.
1. При виникненні сигналу переривання відбувається первинне апаратне розпізнавання його типу. Якщо переривання даного типу в даний момент заборонені, то процесор продовжує підтримувати природний хід виконання команд. У противному випадку в залежності від надійшла в процесор інформації відбувається автоматичний виклик процедури обробки переривання, адреса якої знаходиться в спеціальній таблиці операційної системи, розташовуваної або в регістрах процесора, або у визначеному місці оперативної пам'яті, .
Автоматично зберігається деяка частина контексту перерваного потоку, що дозволить ядру відновити виконання потоку процесу після обробки переривання (значення лічильника команд, слова стану машини, регістри загального призначення). Маже бути збережений і повний контекст процесу, якщо ОС обслуговує дане переривання зі зміною процесу, при цьому можливо також перепланування процесів.
Одночасно із завантаженням адреси процедури; обробки переривань у лічильник команд може автоматично виконуватися завантаження нового значення слова стану машини, що визначає режими роботи процесора при обробці переривання, у тому числі роботу в привілейованому режимі.
4. Тимчасово забороняються переривання даного типу, щоб не утворилася черга вкладених друг у друга потоків однієї і тієї ж процедури.
5. Після того як переривання оброблене ядром операційної системи, перерваний контекст відновлюється, і робота потоку відновляється з перерваного місця. При поверненні з переривання блокування повторних переривань даного типу знімається.
Програмні переривання
Програмне переривання реалізує один із способів переходу на підпрограму за допомогою спеціальної інструкції процесора. При виконанні команди програмного переривання процесор відпрацьовує ту ж послідовність дій, що і при виникненні зовнішнього чи внутрішнього переривання, але тільки відбувається це в передбачуваній крапці програми - там, де програміст помістив дану команду.
Однієї із причин появи інструкцій програмних переривань у системі команд процесорів є те, що їх використання часто приводить до більш компактного коду програм у порівнянні з використанням стандартних команд виконання процедур. Іншою причиною застосування програмних переривань замість звичайних інструкцій виклику підпрограм є можливість зміни користувальницького режиму на привілейований одночасно з викликом процедури.
Диспетчеризація і пріоритезація переривань в ОС
Переривання створюють додаткові труднощі для ОС в організації обчислювального процесу. Ці труднощі зв'язані з непередбаченими переходами керування від однієї процедури до іншої, що виникають у результаті переривань від контролерів зовнішніх пристроїв. Можливо, також виникнення в непередбачені моменти часу виключень, зв'язаних із помилками під час виконання інструкцій. Ускладнюють задачу планування обчислювальних робіт і запити на виконання системних функцій від користувальницьких додатків, виконувані за допомогою програмних переривань. Самі модулі ОС також часто викликають один одного за допомогою програмних переривань, ще більше заплутуючи картину обчислювального процесу.
Операційна система не може втрачати контроль над ходом виконання системних процедур, викликуваних по перериваннях. Вона повинна упорядковувати їх у часі так само, як планувальник упорядковує численні користувальницькі потоки. Крім того, сам планувальник потоків є системною процедурою, викликуваної по перериваннях. Тому правильне планування процедур, викликуваних по перериваннях, є необхідною умовою правильного планування користувальницьких потоків.
Для упорядкування роботи оброблювачів переривань в операційних системах застосовується той же механізм, що і для упорядкування роботи користувальницьких процесів - механізм пріоритетних черг. Усі джерела переривань поділяються на декілька класів, причому кожному класу привласнюється пріоритет. В операційній системі виділяється програмний модуль, що займається диспетчеризацією оброблювачів переривань. Цей модуль у різних ОС називається по-різному, але для визначеності будемо його називати диспетчером переривань
При виникненні переривання диспетчер переривань викликається першим. Він забороняє ненадовго всі переривання, а потім з'ясовує причину переривання. Після цього диспетчер порівнює призначений даному джерелу переривання пріоритет і порівнює його з поточним пріоритетам потоку команд, виконуваного процесором. У цей час процесор вже може виконувати інструкції іншого оброблювача переривань, що також має деякий пріоритет. Якщо пріоритет нового запиту вище поточного, то виконання поточного оброблювача припиняється, і він міститься у відповідну чергу оброблювачів переривань. У противному випадку в чергу міститься оброблювач нового запиту.
Процедури обробки переривань і поточний процес
Важливою особливістю процедур, виконуваних по запитах переривань, є те, що вони виконують роботу, найчастіше ніяк не зв'язану з поточним процесом. . У деяких випадках узагалі важко однозначно визначити, для якого процесу виконує роботу той чи інший програмний модуль ОС. Тому для такого роду процедур уводяться обмеження - вони не мають права використовувати ресурси (пам'ять, відкриті файли і т.п.), з якими працює поточний, процес, чи ж від імені цього процесу запитувати виділення додаткових ресурсів. Процедури обробки переривань працюють із ресурсами, що були виділені їм при ініціалізації відповідного чи драйвера ініціалізації самої операційної системи. Ці ресурси належать операційній системі, а не конкретному процесу, тому говорять, що процедури обробки переривань працюють поза контекстом процесу. Оскільки всі подібні процедури є частиною операційної системи, відповідальність за дотримання цих обмежень несе системний програміст.
Диспетчеризація переривань є важливою функцією ОС, і ця функція реалізована практично у всіх мультипрограмних операційних системах. Можна помітити, що в загальному випадку в операційній системі реалізується двохрівневий механізм планування робіт. Верхній рівень планування виконується диспетчером переривань, що розподіляє процесорний час між потоком запитів, що надходять, на переривання різних типів - зовнішніх, внутрішніх і програмних. Процесорний час, що залишився, розподіляється іншим диспетчером - диспетчером потоків, на підставі різних дисциплін.
Системні виклики
Системний виклик дозволяє додатку звернутися до операційної системи із проханням виконати ту чи іншу дію, як процедуру кодового сегмента ОС. Для прикладного програміста операційна система виглядає як деяка бібліотек, що надає деякий набір корисних функцій, за допомогою яких можна спростити прикладну програму або виконати дії, заборонені в користувальницькому режимі.
Реалізація системних викликів повинна задовольняти наступним вимогам:
забезпечувати переключення в привілейований режим;
мати високу швидкість виклику процедур ОС;
- забезпечувати по можливості однакове звертання до системних викликів для всіх апаратних платформ, на яких працює ОС;
- допускати легке розширення набору, системних викликів;
- забезпечувати контроль із боку ОС за коректним використанням системних викликів.
Перша вимога для більшості апаратних платформ може бути виконано тільки за допомогою механізму програмних переривань. Тому інші вимоги потрібно забезпечити саме для такої реалізації системних викликів. Деякі з цих вимог взаємно суперечливі.
Для забезпечення високої швидкості було б корисно використовувати векторні властивості системи програмних переривань, що маються в багатьох процесорах, тобто закріпити за кожним системним викликом визначене значення вектора. Додаток при такому способі виклику безпосередньо вказує в аргументі запиту значення вектора, після чого керування негайно передається необхідній процедурі операційної системи. Однак цей децентралізований спосіб передачі керування прив'язаний до особливостей апаратної платформи, а також не дозволяє операційній системі легко модифікувати набір системних викликів і контролювати їхнє використання.
У більшості ОС системні виклики обслуговуються за централізованою схемою, заснованої на існуванні диспетчера системних викликів. При будь-якому системному виклику додаток виконує програмне переривання з визначеним і єдиним номером вектора.
Диспетчер системних викликів являє собою програму, що зберігає зміст регістрів процесора в системному стеці, перевіряє, чи попадає запитаний номер виклику в підтримуваний ОС діапазон і передає керування процедурі ОС, адреса якої заданий у таблиці адрес системних викликів.
Процедура реалізації системного виклику витягає із системного стека аргументи і виконує задану дію. Після завершення роботи системного виклику керування повертається диспетчеру, при цьому він одержує також код завершення цього виклику. Диспетчер відновлює регістри процесора, поміщає у визначений регістр код повернення і виконує інструкцію повернення з переривання, що відновлює непривілейований режим роботи процесора.
Для додатка системний виклик зовні нічим не відрізняється від виклику звичайної бібліотечної функції мови C, зв'язаної з об'єктним кодом додатка і виконується в користувальницькому режимі. І така ситуація дійсно має місце. Для всіх системних викликів у бібліотеках, наданих компілятором C, маються так називані «заглушки». Кожна заглушка оформлена як C-функція, при цьому вона містить трохи асемблерних рядків, потрібних для виконання інструкції програмного переривання. Таким чином, користувальницька програма викликає заглушку, а та, у свою чергу, викликає процедуру ОС.
Для прискорення виконання деяких досить простих системних викликів, необхідна робота цілком виконується бібліотечною функцією. Така функція не є системним викликом, а являє собою «чисту» бібліотечну функцію, що виконує усю свою роботу в користувальницькому режимі у віртуальному адресному просторі процесу. Для прикладного програміста системні виклики і бібліотечні функції виглядають одноманітно. Прикладний програміст має справу з набором функцій прикладного програмного інтерфейсу API, що складає із бібліотечних функцій, частина з яких використується для завершення роботи системними викликами, а частина - ні.
Операційна система може виконувати системні виклики в синхронному чи асинхронному режимах. Синхронний системний виклик означає, що процес, який зробив виклик, припиняється доти, поки системний виклик не виконає всю роботу, що вимагається від нього. Після цього планувальник переводить процес у стан, готовності і при черговому виконанні процес гарантовано може скористатися результатами системного виклику, що завершився до цього часу. Синхронні виклики називаються також блокуючими, тому що процес, що викликав системну дію, блокується до його завершення.
Асинхронний системний виклик не приводить до перекладу процесу в режим чекання. Після виконання деяких початкових системних дій керування повертається прикладному процесу.
Більшість системних викликів в операційних системах є синхронними, тому що цей режим рятує додаток від роботи із з'ясування моменту появи результату виклику.