На головну

Компонентний склад операційних систем. Системні виклики

  1.  II. Будова і хімічний склад хромосом еукаріотичної клітини
  2.  II. Типи економічних систем.
  3.  III. Ринок цінних паперів, як складова частина фінансового ринку.
  4.  IV. АНАЛІЗ СКЛАДУ І СТРУКТУРИ пасивів балансу.
  5.  VII. Управлінське рішення як важлива складова управлінської діяльності.
  6.  XV. Вимоги до складання меню для організації харчування дітей різного віку
  7.  А) Синдром порушення динамічної (кінетичної) складової рухів і дій при ураженні заднелобних відділів мозку.

Будь-яка складна система повинна мати зрозумілу і раціональну структуру, тобто розділятися на модулі, які мають закінчену функціональне призначення з чіткими правилами взаємодії. Функціональна складність операційної системи неминуче призводить до складності її архітектури - Структурної організації на основі різних програмних модулів. Зазвичай до складу операційної системи входять: виконувані і об'єктні модулі, бібліотеки, модулі вихідного тексту програм, програмні модулі спеціального формату (завантажувач операційної системи, драйвери введення-виведення), файли конфігурації, файли документації, модулі довідкової системи та ін. Більшість сучасних операційних систем являють собою добре структуровані модульні системи, здатні до розвитку, розширення та переносу на нові платформи. Єдиної архітектури операційних систем не існує, але існують універсальні підходи до її структурування. Загальним підходом до структуризації є поділ всіх модулів на дві групи:

1.ядро - Модулі, що виконують основні функції операційної системи: управління процесами, управління пам'яттю, управління пристроями введення-виведення і т.п. До складу ядра входять:

- Функції, які вирішують внутрішньосистемні задачі організації обчислювального процесу: переключення контекстів, завантаження / розвантаження станиць, обробка переривань;

- Функції для підтримки додатків, що створюють для них прикладну програмну середу.

Додатки можуть звертатися до ядра з запитами (системними викликами) для виконання конкретних дій, наприклад, відкриття і читання файлу, отримання системного часу і т.д. Функції ядра, які можуть викликатися додатками, утворюють інтерфейс прикладного програмування API. Функції ядра є найбільш часто виконуваними, тому швидкість їх виконання визначає продуктивність всієї системи. Для забезпечення високої швидкості роботи операційної системи всі модулі ядра або велика їх частина постійно знаходяться в оперативній пам'яті, тобто є резидентними. Зазвичай ядро ??оформляється у вигляді програмного модуля спеціального формату, що відрізняється від формату користувальницьких додатків.

2.Модулі, що виконують допоміжні функції операційної системи, Наприклад, програми архівування даних, програми дефрагментації. Допоміжні модулі оформляються або у вигляді додатків, або у вигляді бібліотек процедур. Так як деякі компоненти операційної системи оформляються у вигляді додатків (тобто у вигляді виконуваних модулів стандартного формату для операційної системи), то буває складно провести чітку межу між операційною системою і додатками (рис.2.2.). Рішення про те, чи є програма частиною операційної системи чи ні, приймає розробник. Програма може існувати певний час як користувальницький додаток, а потім стати частиною операційної системи, або навпаки. наприклад, Web-браузер компанії Microsoft спочатку постачався як окремий додаток, потім став частиною операційних систем сімейства Windows.


 
 

Допоміжні модулі операційної системи зазвичай поділяються на такі групи:

- утиліти - Програми, що вирішують окремі завдання управління і супроводу комп'ютерної системи, наприклад, програми стиснення дисків, програми архівування даних;

- системні обробні програми - Текстові або графічні редактори, компілятори, компоновщики, отладчики;

- програми надання користувачу додаткових послуг - Спеціальний варіант для користувача інтерфейсу, калькулятор, ігри;

- бібліотеки процедур, Що спрощують розробку додатків: бібліотека математичних функцій, функцій вводу-виводу і т.д.

Як і звичайні програми, для виконання своїх завдань утиліти, що обробляють програми і бібліотеки операційної системи, звертаються до функцій ядра за допомогою системних викликів (рис.2.3).

Модулі операційної системи, оформлені у вигляді утиліт, системних обробних програм і бібліотек, зазвичай завантажуються в оперативну пам'ять тільки на час виконання своїх функцій, тобто є транзитними. Постійно в оперативній пам'яті розташовуються тільки найнеобхідніші коди операційної системи, складові її ядро. Така організація операційної системи економить оперативну пам'ять комп'ютера. Важливим властивістю архітектури операційної системи, заснованої на ядрі, є можливість захисту кодів і даних операційної системи за рахунок виконання функцій ядра в привілейованому режимі. Поділ операційної системи на ядро ??і модулі-додатки забезпечує легку розширюваність. Щоб додати нову високорівневу функцію, досить розробити новий додаток.

Компонентний склад операційної системи визначається набором функцій, для виконання яких вона призначена. Всі програми, що входять до її складу, можна розбити на дві групи: керуючі програми і системні обробні програми (рис.2.4.).

 
 

1.керуюча програма (Микроядро операційної системи) - обов'язковий компонент, що виконує наступні функції:

- Планування проходження безперервного потоку завдань;

- Управління розподілом ресурсів;

- Реалізація прийнятих методів організації даних;

- Управління операціями вводу-виводу;

- Організація мультипрограммной роботи;

- Управління працездатністю системи після збоїв.

2.Управління статичними ресурсами (Завданнями) - ядро ??операційної системи здійснює попереднє планування потоку завдань для виконання і статичний розподіл ресурсів між одночасно виконуваними завданнями в процесі підготовки до виконання (ініціалізації). До таких ресурсів належать розділи пам'яті (оперативної, дискової, зовнішньої) і пристрої, що допускають тільки монопольне використання. Дані ресурси закріплюються за завданням або його частиною з моменту його ініціалізації до моменту завершення. Таке управління називається моніторингом, А програми, його здійснюють - моніторами.

3.Управління динамічними ресурсами (Завданнями) - ядро ??операційної системи здійснює динамічний розподіл ресурсів між декількома завданнями, які розв'язуються одночасно в мультипрограммном режимі для виконуваного потоку завдань. Управління виконує програма супервизор (Планувальник).

4.Управління даними - Ядро операційної системи забезпечує всі операції введення-виведення (обміну між оперативною пам'яттю і периферійними пристроями) на фізичному і логічному рівнях. Наприклад, організація необхідних інформаційних структур і таблиць, управління файловою системою і режимом прямого доступу до пам'яті, обробка помилок введення-виведення і т.д.

5.управління відновленням - Ядро операційної системи реєструє машинні збої і відмови і відновлює працездатність системи після їх виникнення, якщо це можливо.

В якості основних апаратних ресурсів комп'ютера, Що підлягають розподілу, зазвичай розглядають: час роботи процесора; адресний простір основної пам'яті; обладнання введення-виведення; файли, що зберігаються в зовнішній пам'яті. Основними підсистемами, що забезпечують розподіл зазначених ресурсів операційної системи, є:

- підсистема управління процесами (Розподіляє ресурс «процесорний час»);

- підсистема управління пам'яттю (Розподіляє ресурс «адресний простір основної пам'яті»);

- підсистема управління пристроями (Розподіляє ресурси «обладнання введення-виведення»;

- підсистема управління даними (Розподіляє ресурс «дані або файли»).

Інтерфейс між операційною системою і програмами користувача визначається набором системних викликів, що надаються операційною системою. Концепція, що лежить в основі системних викликів, практично однакова для всіх операційних систем. Механізм звернення до системних функцій є машинно-залежним і часто реалізується на асемблері, тому існують бібліотеки процедур, які роблять можливим звернення до системних процедур з програм написаних на мові С і ін. Механізм дії системних викликів можна розглянути на прикладі системного виклику read в UNIX (При використанні міжнародного стандарту POSIX), Який має три параметри:

- fd - Параметр для завдання файлу;

- buffer - Параметр, який вказує на буфер;

- nbytes - Параметр, що задає кількість байтів, яке потрібно прочитати.

Як практично всі системні виклики, він запускається з програми, написаної на мові C з тим же ім'ям, що і системний виклик read. Виклик з програми С:

count = read(fd, buffer, nbytes);

 
 

Системний виклик (і бібліотечна процедура) повертає кількість прочитаних байтів в змінної count. Зазвичай це значення збігається з параметром nbytes, Але може бути і менше, якщо, наприклад, в процесі читання процедурі зустрівся кінець файлу. Якщо системний виклик не може бути виконаний, значення лічильника count встановлюється рівним 1 і номер помилки поміщається в глобальну змінну errno. Програма завжди повинна перевіряти результат системного виклику, щоб відслідковувати появу помилки.

Системні виклики виконуються за серію кроків (рис. 2.5.). Спочатку при підготовці до виклику бібліотечної процедури read, Яка фактично здійснюється однойменною системним викликом, що викликає програма поміщає параметри в стек (кроки 1-3). компілятори С и С ++ поміщають параметри в стек в зворотному порядку. Перший і третій параметри передаються за значенням, другий - за посиланням (передається адреса буфера, на що вказує символ &). Потім по команді процесора здійснюється виклик бібліотечної процедури (крок 4).

Бібліотечна процедура зазвичай поміщає номер системного виклику в те місце, де його чекає операційна система, наприклад, регістр (крок 5). Потім вона виконує команду TRAP (Емулювати переривання) для перемикання з режиму користувача в режим ядра і починає виконання з фіксованого адреси всередині ядра (крок 6). Запускається ядра перевіряє номер системного виклику і відправляє його відповідному обробнику, як правило, при використанні таблиці покажчиків на обробники системних викликів, індексованої за номерами викликів (крок 7). Далі запускається обробник системних викликів (крок 8), по завершенню роботи якого керування передається в простір користувача до бібліотечної процедури - команді наступного за командою TRAP (Крок 9) [2]. Ця процедура передає керування програмі користувача звичайним способом, яким здійснюється повернення з викликаної процедури (крок 10).

Щоб закінчити роботу, програма користувача повинна очистити стек (крок 11), як це робиться після кожного виклику процедури. Остання команда збільшує покажчик стека, таким чином, щоб видалити параметри, поміщені в стек перед запитом read. Далі програма може продовжувати свою роботу.

В POSIX існує понад 100 системних викликів, точніше бібліотечних процедур, які виконують ці виклики. Деякі з них, які найбільш часто використовуються, наведені в таблиці 2.1.

Таблиця 2.1.

Системні виклики стандарту POSIX

 виклик  опис
 управління процесами
Pid = fork ()  Створює дочірній процес, ідентичний батьківському
Pid = waitpid (pid, & statioc, options)  Чекає завершення дочірнього процесу
s = execve (name, argv, environp)  Переміщує образ пам'яті процесу
Exit (status)  Завершує виконання процесу і повертає статус
 управління файлами
fd = open (file, how, ...)  Відкриває файл для читання, записи
s = close (fd)  Закриває відкритий файл
n = read (fd, buffer, nbytes)  Читає дані з файлу в буфер
n = write (fd, buffer, nbytes)  Пише дані з буфера в файл
Position = lseek (fd, offset, whence)  Пересуває покажчик файлу
s = stat (name, & buf)  Отримує інформацію про стан файлу
 Управління каталогами і файлової системою
s = mkdir (name, mode)  Створює новий каталог
s = rmdir (name)  Видаляє порожній каталог
s = link (name1, name2)  Створює новий елемент з ім'ям
s = unlink (name)  Видаляє елемент каталогу
s = mount (special, name, flag)  Монтує файлову систему
s = umount (special)  Демонтує файлову систему
 різні
s = chdir (dimame)  Змінює робочий каталог
s = chmod (name, mode)  Змінює біти захисту файлу
s = kill (pid, signal)  Посилає сигнал процесу
Seconds = time (& seconds)  Отримує час, що минув з 1 січня 1970 року

системний виклик fork (Розгалуження) є єдиним способом створення нового процесу в UNIX. Він створює точну копію вихідного процесу, включаючи дескриптори файлу, регістри і т.п. після виклику fork вихідний процес і його копія (батьківський і дочірній) розвиваються окремо один від одного. Всі змінні мають однакові величини під час виклику fork, Але як тільки батьківські дані скопійовані для створення дочірнього процесу, наступні зміни в одному з них вже не впливають на інший.

У більшості випадків після виклику fork дочірньому процесу необхідно виконати програмний код, відмінний від призначеного для батьківського процесу. Наприклад, оболонка читає команди з терміналу, запускає дочірній процес, чекає, поки дочірній процес виконає команду і читає наступну команду після завершення роботи дочірнього процесу. Чекаючи, поки дочірній процес закінчить роботу, батьківський процес виконує системний виклик waitpid, Який очікує завершення дочірнього процесу (або всіх дочірніх процесів, якщо їх на даний момент кілька). Для того щоб Waitpid(pid, & statioc, options) Чекав закінчення дочірнього процесу, задається перший параметр виклику рівним -1. коли waitpid виконаний, покажчик, що задається другим параметром, встановлюється на статус завершення дочірнього процесу (нормальне або аварійне завершення і вихідне значення). Третій параметр визначає різні необов'язкові настройки.

Коли друкується команда, оболонка створює дочірній процес, який повинен виконати команду користувача. Він робить це за допомогою системного виклику execve(name, argv, environp), Що заміняє його образ пам'яті файлом, названим в першому параметрі. У загальному випадку у команди execve є три параметри: ім'я файлу, який буде виконуватися, покажчик на масив аргументів і покажчик на масив змінних оточення. Різні бібліотечні програми дозволяють пропускати параметри або визначати їх іншими способами.

При копіюванні файлу з одного файлу в інший (file1 в файл file2) використовується команда:

ср filel file2

Після створення оболонкою дочірнього процесу останній знаходить і виконує файл ср і передає йому імена вихідного і цільового файлів. Основний модуль програми ср містить визначення:

main(argc, argv, envp)

параметр argc вказує кількість записів в командному рядку, включаючи ім'я програми. параметр argv є покажчиком на масив покажчиків. елемент i масиву вказує на i-у запис в командному рядку. параметр envp - Покажчик на масив строкових змінних оточення виду: ім'я = величина, які використовуються для передачі програмі інформації типу терміналу або ім'я каталогу.

В UNIX під процеси відводиться частина пам'яті, яка, в свою чергу, ділиться на три сегменти: текстовий (Код програми), сегмент даних (змінні) і сегмент стека. Сегмент даних збільшується від низу до верху, а стек збільшується зверху вниз. Між ними знаходиться частина невикористаного адресного простору. Стек автоматично займає потрібну йому частину ділянки пам'яті, але розширення сегмента даних виконується явно. Для цього використовується спеціальний системний виклик brk, Що задає нову адресу для межі сегменту даних.

Багато системні виклики мають відношення до файлової системи. Щоб прочитати або записати файл, його спочатку потрібно відкрити за допомогою виклику open(file, how, ...). Для цього виклику вказується ім'я файлу (задається абсолютний шлях до файлу або посилання на робочий каталог) і код, що означає, що файл відкривається для читання, записи або того й іншого. Повертається дескриптор файлу вживається при читанні або запису. Файл закривається за допомогою виклику close, Який робить дескриптор файлу доступним при наступному відкритті (open).

Незважаючи на те, що більшість програм читає і записує файли за допомогою послідовного доступу, деяким прикладним програмам необхідна можливість доступу до будь-якої, випадково обраної частини файлу. Пов'язаний з кожним файлом покажчик містить поточну позицію в файлі. Коли читання (запис) здійснюється послідовно, він зазвичай вказує на байт, який повинен бути прочитаний (записаний) наступним. виклик lseek(fd, offset, whence) Може змінити значення позиції покажчика, так що наступний виклик read або write почне операцію в іншій ділянці файла. Перший параметр є ідентифікатором файлу, другий - визначає позицію в файлі, третій - вказує, чи є другий параметр позицією у файлі щодо початку файлу, щодо поточної позиції або щодо кінця файлу. виклик lseek повертає абсолютну позицію в файлі після зміни покажчика.

Для кожного файлу UNIX зберігає такі дані: тип файлу (звичайний, спеціальний, каталог і ін.), розмір, час останнього зміни і іншу інформацію. Програма може запросити цю інформацію через системний виклик stat(name, & buf), Перший параметр якого визначає потрібний файл, другий - вказує на структуру, куди потрібно помістити інформацію.

виклики mkdir и rmdir відповідно створюють і видаляють порожні каталоги. виклик link дозволяє одному файлу з'являтися під двома або більше іменами, часто в різних каталогах. Цей виклик зазвичай використовується, коли кілька програмістів, які працюють в одній команді, повинні спільно використовувати один загальний файл. виклик mount дозволяє об'єднувати в одну дві файлові системи. Наприклад: на жорсткому диску знаходиться коренева файлова система, що містить виконувані версії загальних команд і найбільш часто використовувані файли. Користувачеві потрібно прочитати файли з дискети. За допомогою системного виклику mount файлова система з гнучкого диска приєднується до кореневої файлової системи, наприклад:

mount( "/dev/fdO"," /mnt", 0);

Перший параметр визначає ім'я спеціального блокового файлу на диску О, другий - місце в дереві, куди буде вмонтована файлова система, третій - показує яка вбудована файлова система монтується: для читання і запису або тільки для читання. Після виконання виклику mount доступ до файлу на диску Про можна отримати, вказавши його шлях з кореневого або робочого каталогу. Коли файлова система не потрібна, її демонтують за допомогою системного виклику umount.

 




 Глава 1. Введення |  Обчислювальні та операційні системи. загальні поняття |  Види інтерфейсів. Технології реалізації інтерфейсів |  Історія створення і розвитку операційних систем |  Класифікація операційних систем |  Вимоги, що пред'являються до сучасних операційних систем |  Загальна структура операційної системи Windows 2000 |  Загальна структура операційної системи Windows XP |  Архітектура операційної системи UNIХ |  Апаратна залежність і переносимість операційних систем |

© um.co.ua - учбові матеріали та реферати