
- •Поняття операційної системи
- •Операційна система як розширена машина
- •Операційна система як менеджер ресурсів
- •Історія розвитку операційних систем
- •Перше покоління (1945-1955): електронні лампи і комутаційні панелі
- •Друге покоління (1955-1965): транзистори і системи пакетної обробки
- •Третє покоління (1965-1980): інтегральні схеми і багатозадачність
- •Четверте покоління (з 1980 року по наші дні): персональні комп'ютери
- •Історія minix 3
- •Основні концепції
- •Процеси
- •Оболонка
- •Системні виклики
- •Системні виклики для управління процесами
- •Системні виклики для управління сигналами
- •Системні виклики для управління файлами
- •Системні виклики для управління каталогами
- •Системні виклики для захисту
- •Системні виклики для управління часом
- •Структура операційної системи
- •1.5.2. Багаторівневі системи
- •1.5.3. Віртуальні машини
- •1.5.4. Екзоядра
- •1.5.5. Модель клієнт-сервер
- •2.1.1. Модель процесів
- •2.1.2. Створення процесів
- •2.1.3. Завершення процесів
- •2.1.4. Ієрархії процесів
- •2.1.5. Стани процесів
- •2.1.6. Реалізація процесів
- •2.1.7. Програмні потоки
- •2.2. Взаємодія між процесами
- •5.1. Файли
- •5.1.1. Іменування файлів
- •5.1.2. Структура файлу
- •5.1.3. Типи файлів
- •5.1.4. Доступ до файлів
- •5.1.5. Атрибути файлів
- •5.1.6. Операції з файлами
- •5.2. Каталоги
- •5.2.1. Прості каталоги
- •5.2.2. Ієрархічні системи каталогів
- •5.2.3. Шляхи
- •5.2.4. Операції з каталогами
- •5.3. Реалізація файлової системи
- •5.3.1. Структура файлової системи
- •5.3.2. Реалізація файлів
- •5.3.4. Організація дискового простору
Системні виклики для управління сигналами
Хоча зазвичай все взаємодія між процесами заплановано, існують
ситуації, коли потрібно незаплановане взаємодію. Наприклад, якщо
користувач випадково зажадав від текстового редактора показати
вміст дуже великого файлу і помітив свою помилку, повинен існувати спосіб
перервати роботу редактора. У MINIX 3 користувач може натиснути клавіші
Ctrl C; це поєднання посилає текстового редактору відповідний сигнал.
Отримавши його, редактор припиняє роздруківку. Сигнали можуть використовуватися
і для того, щоб перехоплювати деякі апаратні виключення, наприклад
неприпустимі інструкції або переповнення при операціях з плаваючою
крапкою. Затримки також реалізуються через сигнали.
Якщо процес ніяк не анонсував своє бажання відповідати на сигнали, то,
отримавши сигнал, він просто примусово завершується. Щоб уникнути подібної
долі і розповісти про своє бажання відповідати на сигнали певного типу,
процес може використовувати системний виклик sigaction, який дозволяє
вказати нову адресу процедури для обробки сигналу і дізнатися адресу колишньої
процедури. Після того як такий виклик зроблено, при отриманні сигналу
відповідного типу (наприклад, при натисканні клавіш Ctrl C) стан процесу
буде збережено в стеці і викликаний обробник сигналу. Обробник може
працювати як завгодно довго і робити при цьому будь-які системні виклики. Але на
практиці обробники сигналів зазвичай дуже короткі. Завершивши свою роботу,
обробник робить виклик sigreturn, щоб продовжити роботу процесу з того
місця, де він був перерваний. Виклик sigaction замінює колишній системний
виклик signal, який тепер для зворотної сумісності реалізований у вигляді
бібліотечної процедури.
У MINIX 3 сигнали можна блокувати. Блокований сигнал затримується
до тих пір, поки не буде розблоковано. Тобто сигнал не передається, але й не
втрачається. Виклик sigprocmask дозволяє процесу задати набір заблокованих
сигналів, передаючи ядру бітову карту. Крім того, процес може дізнатися,
які сигнали мали місце, але були заблоковані. Для цього служить системний
виклик sigpending, який повертає набір сигналів у вигляді бітової маски.
Нарешті, системний виклик sigsuspend дозволяє процесу атомарно задати
бітову карту блокованих сигналів і призупинити своє виконання.
Замість того щоб передавати в якості оброблювача сигналу покажчик на
функцію, програма може використовувати константу SIG_IGN, щоб всі
наступні сигнали певного типу ігнорувалися. Передавши константу SIG_DFL,
можна відновити обробку сигналу за замовчуванням. За замовчуванням процес
або примусово завершується по сигналу, або сигнал просто ігнорується.
Це залежить від конкретного сигналу. Як приклад того, як використовується
константа SIG_IGN, розглянемо роботу оболонки при запуску фонового
процесу за допомогою такої команди:
command &
У цьому випадку сигнал від натискання клавіш Ctrl C не повинен впливати на роботу
фонового процесу, тому після виклику fore, але перед викликом exec оболонка
робить такі виклики:
sigaction (SIGINT, SIG_IGN, NULL);
sigaction (SIGQUIT, SIG_IGN, NULL);
Ці виклики відключають обробку сигналів SIGINT і SIGQUIT (сигнал SIGQUIT
генерується натисканням клавіш Ctrl \ і робить те ж саме, що і Ctrl C, але, якщо
його не обробляти або не блокувати, дозволяє отримати дамп пам'яті
завершеного процесу). Для звичайних процесів, що виконуються не в фоновому
режимі, ігнорувати сигнали не потрібно.
Натискання клавіш Ctrl C - не єдиний спосіб послати процесу сигнал.
Системний виклик kill дозволяє одному процесу послати сигнал іншому (у обох
процесів повинен бути однаковий ідентифікатор користувача, так як
незв'язані процеси не можуть послати один одному сигнали). Повертаючись до
розглядався прикладу, припустимо, що запущений фоновий процес
знадобилося завершити. Сигнали SIGQUIT і SIGINT цей процес ігнорують,
так що потрібно щось інше. Рішення дає програма kill, яка за
допомогою системного виклику KILL може послати сигнал будь-якому процесу. Процес
можна примусово завершити, пославши йому сигнал 9 (SIGKILL). Цей сигнал
не можна обробити або ігнорувати.
У багатьох додатках реального часу процес потрібно переривати по
закінчення деякого інтервалу часу, за який він повинен встигнути виконати
свою роботу, наприклад повторно передати пакет даних по ненадійною лінії
зв'язку. Для цієї ситуації призначений системний виклик alarm. Параметр
цього виклику описує інтервал часу, після якого процесу
передається сигнал SIGALARM. В будь-який момент часу процес може запланувати
тільки один сигнал. Якщо зробити виклик alarm, вказавши затримку 10 секунд, а
потім, після закінчення 3 секунд, ще раз зателефонувати alarm з параметром 20
секунд, прийде сигнал тільки від того виклику, який зроблений останнім. Перший
виклик скасовується. Щоб скасувати зроблений раніше виклик alarm, потрібно ще
раз зробити виклик alarm, передавши в якості аргументу 0. Якщо прийшов
сигнал SIGALARM не обробляти, то виконується дія за замовчуванням, і
процес завершується.
Іноді виникають ситуації, коли процесу нічим зайнятися до прибуття сигналу.
Наприклад, розглянемо комп'ютерну програму для перевірки швидкості читання
і уважності. Ця програма виводить деякий текст, а потім робить
виклик alarm з параметром 30 секунд. Поки учень читає текст, програма нічого
не повинна робити. Програма може виконувати порожній цикл, але це буде
безглуздою тратою процесорного часу, який може знадобитися
іншому процесу. Набагато краще використовувати системний виклик pause, який
змушує MINIX 3 призупинити виконання процесу до приходу сигналу.