Лекція 2 UNIX – подібні операційні системи 2.1. Операційна система UNIX Операційна система UNIX спочатку була написана для ЕОМ DEC PDP-7 в 1969 р., в 1970 р. була переписана з машинно-залежної мови асемблера (на якому тоді писалися всі операційні системи) на мову високого рівня – С, що сильно полегшувало її перенесення на іншу ЕОМ, адаптацію відповідно до конкретних вимог користувача. Головною відмінною рисою цієї системи є її модульність і різноманітний набір системних утиліт, простота їх спільного використання. 2.2. Життєвий цикл процесу (програми) Одиницею управління і споживання ресурсів в системі служить процес (в MS-DOS – програма). Процес – послідовне (або псевдопаралельне) обчислення. Зокрема, ввід/вивід звичайно виконується синхронно, і процес припиняється до його завершення. Якщо потрібно продовжити виконання процесу паралельно з ініційованим ним вводом/виводом, в UNIX необхідно заздалегідь породити інший процес для реалізації вводу/виводу; в MS-DOS можна скористатися механізмом переривань. Кожний процес працює в своєму адресному просторі. В обох ОС процес (програма) успадковує всі файли, відкриті його батьком, поточний каталог і керуючий термінал. Процес (програма) завершуються нормальним чином зі своєї ініціативи (викликом спеціальної функції в UNIX, системним перериванням в MS-DOS) і повертають батькові код завершення, або аварійним чином – отримавши сигнал. 2.3. Сигнальний механізм Сигнальний механізм UNIX (в MS-DOS не документований і не стандартизований) дозволяє процесам і операційній системі обмінюватися інформацією в реальному масштабі часу. Сигнал генерується, коли відбувається подія, що викликає сигнал або викликається спеціальна системна функція, аргументами якої є номер сигналу і ідентифікатори процесів, яким необхідно послати даний сигнал. Одна і та ж подія може викликати посилку сигналу декільком процесам. На кожний сигнал, визначений в системі, процес повинен мати реакцію – дія, яку він виконує при отриманні сигналу. Коли викликається визначена для даного процесу і сигналу реакція, вважається, що сигнал переданий процесу, якому він був призначений. Сигнал може бути блокований від передачі процесу. Якщо реакція на згенерований блокований сигнал відмінна від ігнорування, то сигнал залишається непереданим або до зняття з нього блокування, або до установки на нього реакції ігнорування. Якщо на такий сигнал задана реакція ігнорування, то від реалізації залежить, чи буде такий сигнал негайно видалений або залишиться непереданим. Кожний процес має сигнальну маску, що визначає безліч сигналів, блокованих від передачі процесу. Допустимі три вигляду реакції на сигнал: ігнорування, перехоплення і стандартна реакція системи, перехоплення і виклик функції всередині процесу. Перехоплення і ігнорування сигналів, припинення і знищення процесу неможливі. 2.4. Багатокористувальський захист (тільки ОС UNIX) Користувачі, яким дозволено входити в ОС, перераховані в обліковій базі користувачів. Користувачі об'єднані в групи перераховані в обліковій базі груп. Кожному користувачеві і кожній групі привласнені цілочисельні ідентифікатори. Входячи в ОС, користувач повідомляє своє ім'я, за яким надається ідентифікатор і права доступу. З кожним файлом пов'язана пара ідентифікаторів: для користувача і груповий. Файл успадковує ці ідентифікатори від ефективних ідентифікаторів процесу, що створив даний файл. Файл можна читати, писати і виконувати. Якщо файл є каталогом, виконання означає пошук в ньому. Права процесів при доступі до файлу зберігаються в атрибутах захисту файлу. Ці атрибути при створенні файлу, можуть бути змінені тільки, маючи відповідні права. Перевірка прав відбувається, коли процес намагається відкрити файл для читання або запису, виконати його. Всі користувачі, що мають доступ в систему, розділені стосовно файлу на три категорії: власників (ефективний призначений для користувача, співпадає з призначеним для користувача ідентифікатором файлу), членів групи (ефективний груповий ідентифікатор процесу співпадає з груповим ідентифікатором файлу) і інших. Процес може мати привілеї, що залежать від реалізації, які дають йому додаткові права при доступі до файлу. Якщо процес не має привілеїв, то йому дозволяється доступ до файлу в трьох випадках: – процес є власником файлу і атрибути захисту файлу дозволяють дії, що запитуються власником; – ефективний груповий ідентифікатор процесу співпадає з груповим ідентифікатором файлу і його атрибути дозволяють дії, що запитуються групою; – атрибути файлу дозволяють дії, що запитується всіма процесами. Якщо жодна з умов не виконується, то процес не отримує доступ до файлу. Системні виклики ОС UNIX забезпечують: отримання інформації про користувачів і групи в обліковій базі (при наявності привілеїв) і отримання інформації про захист конкретного файлу. 2.5. Файлова система Допускаються наступні типи файлів: звичайні файли, спеціальні байт-орієнтовані і блок-орієнтовані файли, FIFO-файли. Звичайний файл – безструктурний масив з прямим доступом. Каталог забезпечує зв'язок між іменами файлів і власне файлами. Кожен елемент каталогу містить локальне ім'я файлу і посилання на конкретний файл. У UNIX різні елементи каталогів можуть посилатися на один і той же файл. Ієрархія файлів має деревовидну структуру. Для іменування файлу використовуються кореневий і поточний каталоги. Процес (програма) може змінити поточний каталог. FIFO – файл характерний тим, що дані з нього читаються тільки в тому порядку в якому вони були записані. Зовнішні пристрої також вважаються файлами, і з ними працюють за допомогою звичайних файлових операцій. З точки зору програми звичайні, байт- і блок-орієнтовані файли однакові. UNIX забезпечує зміну і отримання імені біжучого каталогу, створення, видалення, перейменування і переміщення файлів і каталогів, отримання інформації про файл або каталог (розмір, дату, час останньої модифікації; UNIX додатково забезпечує інформацію про розмежування доступу) та створення і видалення зв'язків файлу. 2.6. Базовий ввід-вивід Базовий рівень в обох системах забезпечує обмін з файлом, що інтерпретується як одномірний масив байтів з прямим послідовним доступом. Для кожного файлу система веде покажчик читання/запису. При читанні (запису) n байтів покажчик просувається вперед по файлу на n байтів в позицію символу, що читається (записується). На початку роботи з файлом його створюють або відкривають. Файли відкриті даною програмою, мають внутрішню (в межах даного процесу) нумерацію, починаючи з 0. Системний виклик, що відкриває файл, повертає номер відкритого файлу, який використовується при читанні і запису. Після того як файл відкритий, до нього застосовуються функції читання/запису. При читанні з файлу послідовно читаються чергові байти і повертається число прочитаних байтів. Воно може виявитися менше необхідного числа, якщо до кінця файлу залишилося менше байтів, ніж потрібно, або якщо пристрій не передає такого числа байтів. При запису в файл записуються чергові байти, розміщені в пам'яті процесу. Якщо значення, що повертається після запису не дорівнює числу байтів, що записуються, це свідчить про помилку. Якщо черговий байт, що записується виявляється за кінцем файлу, то забезпечується відповідне збільшення розміру файлу. Прямий доступ до файлу виконується викликом відповідної функції, що встановлює покажчик читання/запису в необхідну позицію. Позиціонування можливе в тих файлах, де воно допускається типом файлу або природою зовнішнього пристрою. Процес управляє відкритим файлом, отримуючи і задаючи значення його атрибутів і блокуючи ділянки файлу від доступу до них інших процесів. По закінченні роботи з файлом, його треба закрити. При завершенні програми, відкриті файли закриваються автоматично. Особливість каталогу полягає в тому, що запис в нього може робити тільки система, а програма – тільки читати елементи каталогу. 2.7. Стандартний буферизований ввід/вивід Стандартний буферизований ввід-вивід є надбудовою над базовим рівнем. Подібно базовому рівню, він інтерпретує файл (потік, в термінах даного рівня), як одномірний масив байтів з прямим доступом. Потоки дають можливість обмінюватися з файлом, буферизуючи дані в пам'яті процесу. При читанні з потоку відбувається зчитування блоку даних з файлу в буфер, а з буфера процесу передається стільки байтів, скільки він запитав. Коли при читанні з потоку в буфері вже немає необхідних даних, відбувається зчитування блоку даних з файлу в буфер. При запису в потік дані, що передаються процесом, зберігаються в буфері і передаються системі для запису в файл після того, як буфер заповниться, при виклику спеціальної функції або при закритті потоку.