
- •Поняття операційної системи
- •Операційна система як розширена машина
- •Операційна система як менеджер ресурсів
- •Історія розвитку операційних систем
- •Перше покоління (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,
званий оболонкою (shell). Хоча оболонка не входить в операційну систему, але у
всю користується багатьма функціями операційної системи і тому є
хорошим прикладом того, як можуть застосовуватися системні виклики. Крім
цього, оболонка надає основний інтерфейс між користувачем, сидячим
за своїм терміналом, і операційною системою, якщо, звичайно, користувач не
використовує графічний інтерфейс. Існують цілий ряд оболонок, включаючи
csh, ksh, zsh і bash. Всі вони підтримують описувану тут функціональних
функціональність вихідної оболонки (sh).
Коли-небудь користувач входить в систему, запускається оболонка.
Стандартним вхідним і вихідним пристроєм для оболонки є термінал.
Оболонка починає роботу з друку запрошення (prompt) - знака долара,
мовця користувачеві, що оболонка очікує введення команди. Після цього
користувач може вводити команди, наприклад:
date
В цьому випадку оболонка створює дочірній процес і запускає програму date.
Поки дочірній процес працює, оболонка чекає його завершення. Після
завершення дочірнього процесу оболонка знову друкує запрошення і намагається
прочитати наступну введену рядок. Користувач може перенаправити
стандартний висновок даних у файл:
date> file
Таким же чином можна перевизначити пристрій, з якого читаються
вхідні дані:
sort <filel> file2
Ця команда наказує програмі сортування вважати дані з файлу filel
і вивести результат в файл file2.
Вихідні дані однієї програми можна використовувати як вхідні
даних для іншої, з'єднавши їх каналом, наприклад:
cat filel file2 file3 I sort> / dev / lp
Ця команда наказує програмі cat об'єднати (concatenate) три файлу
і послати вихідні дані програмі sort, яка розставить всі рядки в
алфавітному порядку. Результат роботи програми sort перенаправляється в файл
/ Dev / lp, зазвичай позначає принтер.
Якщо користувач вводить після команди знак &, оболонка не чекає закінчення
виконання команди. В цьому випадку вона негайно виводить нове
запрошення. Наприклад:
cat filel file2 file3 I sort> / dev / lp &
В результаті виконання цієї команди сортування запуститься як фонове
завдання, дозволяючи користувачеві в ході сортування продовжувати нормальну ра-
роботу. Оболонка має безліч інших цікавих особливостей, для обговорення та
обговорення яких у нас тут, на жаль, недостатньо місця. Тим, хто хоче
освоїти операційну систему MINIX більш детально, можна порекомендувати
більшість книг для початківців користувачів UNIX.
Системні виклики
Озброївшись загальним розумінням того, як MINIX 3 працює з процесами
і файлами, можна приступити до вивчення інтерфейсу між операційною
системою і користувацькими програмами, тобто системних викликів. Хоча
це обговорення зачіпає конкретно стандарт POSIX (міжнародний стан-
стандарт 9945-1), а отже, MINIX 3, UNIX та LINUX, більшість інших
сучасних операційних систем підтримує системні виклики, виконую-
виконують ті ж самі функції, хоча деталі можуть відрізнятися. Так як фактичний
механізм звернення до системних функцій є у високому ступені ма-
машинно-залежним і часто має реалізовуватися на асемблері, існують
бібліотеки процедур, які роблять можливим звернення до системних процеду-
процедурам з програм на С і на інших мовах з тим же успіхом.
Слід пам'ятати про те, що будь однопроцесорний комп'ютер здатний ви-
виконувати лише одну команду за раз. Якщо процес виконує програму в поль-
режимі користувача і вимагає підтримки з боку операційної системи
(Наприклад, при читанні даних з файлу), необхідно переривання або систем-
системний виклик для того, щоб передати операційній системі управління. Опера-
Операційна система визначає запитане процесом дію за переданими
параметрам, виконує системний виклик і повертає керування команді,
наступної за викликом. У цьому сенсі системний виклик схожий на виклик проце-
процедури, проте на відміну від процедури системний виклик здійснює вхід в отрута-
ядро або інші привілейовані компоненти операційної системи.
Для того щоб прояснити механізм системних викликів, коротко розглянемо сис-
системний виклик read. Як згадувалося раніше, у нього є три параметри: перший
служить для завдання файлу, другий вказує на буфер, третій визначає ко-
кількість байтів, яке потрібно прочитати. Виклик з програми на С може
виглядати так:
count = read (fd, buffer, nbytes);
Системний виклик (і бібліотечна процедура) повертає кількість дійсності
дійсно прочитаних байтів в змінної count. Зазвичай ця величина збігаючись-
збігається з параметром nbytes, але може бути менше, якщо, наприклад, в процесі чте-
читання процедурі зустрівся символ кінця файлу.
Якщо системний виклик не може бути виконаний або через неправильні пара-
параметрів або через дискової помилки, значення лічильника count встановлює-
встановлюється рівним -1, а номер помилки поміщається в глобальну змінну errno.
Програми завжди повинні перевіряти результат системного виклику, щоб від-
відстежувати появу помилки.
У загальній складності операційна система MINIX 3 підтримує 53 системних
виклику. Вони перераховані в табл. 1.1 і для зручності розбиті на шість груп.
Крім згаданих, існує ще кілька системних викликів, проте вони
мають настільки спеціальне призначення, що ми вирішили опустити їх. У подальші-
наступних розділах ми коротко розглянемо кожен виклик, щоб зрозуміти, що він робить.
В цілому, виконуються цими системними викликами функції визначають біль-
більшу частину можливостей операційної системи, так як можливості управ-
управління ресурсами на персональних комп'ютерах зведені до мінімуму (по крайней
мірі, в порівнянні з великими машинами, що обслуговують безліч поль-
користувачів).
Таблиця 1.1. Основні системні виклики MINIX (fd позначає дескриптор
файлу, п - число байтів)
Виклик Опис
Управління процесами
pid = fork () Створює дочірній процес, ідентичний батьківському
pid = waitpid (pid, & statloc, options) Очікує завершення дочірнього процесу
s = wait (& status) Стара версія waitpid
s = execve (name, argv, envp) Переміщає образ пам'яті процесу
exit (status) Завершує виконання процесу і повертає статус
size = brk (addr) Встановлює розмір сегмента даних
pid = getpid () Повертає ідентифікатор процесу, який зробив виклик
pid = getpgrp () Повертає ідентифікатор групи процесів для зробив виклик
pid = setsid () Відкриває новий сеанс і повертає для нього
ідентифікатор групи процесів
I = ptrace (req, pid, addr, data) Використовується для налагодження
Сигнали
s = sigaction (sig, & act, & oldact) Встановлює реакцію на сигнал
s = sigreturn (& context) Повертається з обробника сигналу
s = sigprocmask (how, & set, & old) Визначає або встановлює маску сигналів для процесу
s = sigpending (set) Визначає набір блокованих сигналів
s = sigsuspend (sigmask) Встановлює маску сигналів для процесу
і призупиняє його
s = kill (pid, sig) Посилає сигнал процесу
residual = alarm (seconds) Встановлює сигнальний таймер
s = pause () Припиняє процес до приходу наступного сигналу
Управління файлами
fd = creat (name, mode) Застарілий спосіб створити файл
fd = mknod (name, mode, addr) Створює звичайний, спеціальний або відноситься
до каталогу індексний вузол
fd = open (file, how, ...) Відкриває файл для читання, запису або того й іншого
s = close (fd) Закриває відкритий файл Виклик Опису
n = read (fd, buffer, nbytes) Читає дані з файлу в буфер
n = write (fd, buffer, nbytes) Пише дані з буфера в файл
pos = lseek (fd, offset, whence) пересуває покажчик файлу
s = stat (name, & buf) Отримує інформацію про стан файлу
s = fstat (fd, & buf) Отримує інформацію про стан файлу
fd = dup (fd) Закріплює за відкритим файлом новий дескриптор
s = pipe (& fd [O]) Створює канал
s = ioctl (fd, request, argp) Спеціальні дії з файлом
s = access (name, amode) Перевіряє доступність файлу
s = rename (old, new) Перейменовує файл
s = fcntl (fd, cmd, ...) Захоплює файл і виконує інші дії
Управління каталогами і файлової системою
s = mkdir (name, mode) Створює новий каталог
s = rmdir (name) Видаляє порожній каталог
s = Iink (name1, name2) Створює новий елемент з ім'ям пагле2, який вказує
на namel
s = unlink (name) Видаляє елемент каталогу
s = mount (special, name, flag) Монтує файлову систему
s = umount (special) демонтує файлову систему
s = sync () Скидає всі кешовані блоки на диск
s = chdir (dirname) Змінює робочий каталог
s = chroot (dirname) Змінює кореневий каталог Захист
s = chmod (name, mode) Змінює біти захисту файлу
uid = getuid () Визначає код користувача для викликав
gid = getgid () Визначає код групи для викликав
s = setuid (uid) Встановлює код користувача для викликав
s = setgid (gid) Встановлює код групи для викликав
s = chown (name, owner, group) Змінює ідентифікатор власника файлу
oldmask = umask (complmode) Змінює режим маскування Управління часом
seconds = time (& seconds) Отримує час, що минув з 1 січня 1970
s = stime (tp) Встановлює час, що минув з 1 січня 1970
s = utime (file, timep) Встановлює час останнього доступу до файлу
s = times (buffer) Визначає час роботи користувача процесу
і системи
Особливу увагу слід звернути на те, що перетворення викликів POSIX-
процедур в системні виклики не є взаємно однозначним. Стандарт
POSIX визначає ряд процедур, які повинні підтримувати сумісні
системи, але він не вказує, чи є вони системними викликами,
бібліотечними викликами або чим-небудь ще. В деяких випадках POSIX процедури підтримуються в MINIX 3 бібліотечними функціями. Іноді необхідні
процедури є всього лише різновидами один одного, і один системний
виклик обробляє відразу декілька бібліотечних викликів.