Особливості операційної системи UNIX b> p>
Курсова робота з дисципліни: «Інформатика» p>
2005 p>
Введення b> p>
Вперше система UNIX була описана в 1974 році в статті
Кена Томпсона і Денніса Річі в журналі "Communications of the ACM"
[Thompson 74]. З цього часу вона набула широкого поширення і завоювала
широку попу-лярность серед виробників ЕОМ, які все частіше стали оснащувати
нею свої машини. Особливою популярністю вона користується в університетах, де
досить часто бере участь у дослідному і навчальному процесі. p>
Безліч книг і статей присвячено опису окремих
частин системи; p>
серед них два спеціальних випуску "Bell System
Technical Journal "за 1978 рік [BSTJ 78] і за 1984 рік [BSTJ 84]. Під
багатьох книгах описується інтерфейс користувача, зокрема використання
електронної пошти, підготовка документа-ції, робота з командним процесором
Shell; в деяких книгах, таких як "The UNIX Programming
Environment "[Kernighan 84] і" Advanced UNIX Programming "
[Rochkind 85], описується програмний інтерфейс. Дана робота присвячена основним
особливостям системи UNIX. p>
ПЕРЕГЛЯД ОСОБЛИВОСТЕЙ СИСТЕМИ p>
За час, що минув з моменту її появи в 1969
році, система UNIX стала досить популярною і набула поширення на
машинах з різною потужністю обробки, від мікропроцесорів до великих ЕОМ,
забезпечуючи на них загальні умови виконання програм. Система ділиться на дві
частини. Одну частину складають програми та сервісні функції, те, що робить
операційне середовище UNIX такої популярної; ця частина легко доступна
користувачам, вона включає такі програми, як командний процесор, обмін
повідомленнями, пакети обробки текстів і системи обробки вихідних текстів
програм. Інша частина включає в себе власне операційну систему,
підтримує ці програми і функції. У цій роботі дається детальний опис
власне операційної системи. Основна увага концентрується на описі
системи UNIX версії V, поширенням якої займається корпорація AT & T.
Наводяться основні інформаційні структури і алгоритми, що використовуються в
операційній системі і в остаточному підсумку створюють умови для функціонування
стандартного інтерфейсу користувача. p>
1. ІСТОРІЯ p>
У 1965 році фірма Bell Telephone Laboratories,
об'єднавши свої зусилля з компанією General Electric і проектом MAC
Массачусетського технологічного інституту, приступили до розробки нової
операційної системи, що отримала назву Multics [Organick 72]. Перед системою
Multics було поставлено завдання - забезпечити одночасний доступ до ресурсів ЕОМ
великої кількості користувачів, забезпечити достатню швидкість обчислень і
зберігання даних і дати можливість користувачам у разі потреби
спільно використовувати дані. Багато розроблювачів, згодом прийняли
участь у створенні ранніх редакцій системи UNIX, брали участь у роботі над
системою Multics в фірмі Bell Laboratories. Хоча перша версія системи Multics
і була запущена в 1969 році на ЕОМ GE 645, вона не забезпечувала виконання
головних обчислювальних завдань, для вирішення яких вона призначалася, і не
було навіть ясно, коли цілі розробки будуть досягнуті. Тому фірма Bell
Laboratories припинила свою участь у проекті. P>
Після закінчення роботи над проектом Multics співробітники
Дослідницького центру з інформатики фірми Bell Laboratories залишилися без
"досить інтерактивного обчислювального кошти" [Ritchie 84a].
Намагаючись удосконалити середовище програмування, Кен Томпсон, Денніс Річі та
інші накидали на папері проект файлової системи, що отримав пізніше
подальший розвиток в ранній версії файлової системи UNIX. Томпсоном були
написані програми, що імітують поведінку запропонованої файлової системи в
режимі підкачки даних на запит, їм було навіть створено найпростіше ядро
операційної системи для ЕОМ GE 645. У той же час він написав на Фортране
ігрову програму "Space Travel" ( "Космічна подорож")
для системи GECOS (Honeywell 635), але програма не змогла задовольнити
користувачів, оскільки керувати "космічним кораблем" виявилося
складно, крім того, при завантаженні програма займала багато місця. Пізніше Томпсон
виявив маловикористовувані комп'ютер PDP-7, оснащений гарним графічним
дисплеєм і має дешеве машинний час. p>
Створюючи програму "Космічна подорож"
для PDP-7, Томпсон отримав можливість вивчити машину, проте умови
розробки програм потребували використання крос-асемблер для трансляції
програми на машині з системою GECOS і використання перфострічки для введення в
PDP-7. Для того, щоб поліпшити умови розробки, Томпсон і Річі виконали на
PDP-7 свій проект системи, що включив першу версію файлової системи UNIX,
підсистему управління процесами та невеликий набір утиліт. Врешті-решт,
нова система більше не потребувала підтримки з боку системи GECOS в
Як операційна середовища розробки і могла підтримувати себе сама. Нова
система отримала назву UNIX, за схожістю з Multics його придумав ще один
співробітник Дослідницького центру з інформатики Брайан Керніган. p>
Незважаючи на те, що ця рання версія системи UNIX вже
була багатообіцяючою-щей, вона не могла реалізувати свій потенціал до тих пір, поки
не отримала застосування в реальному проекті. Так, для того, щоб забезпечити
функціонування системи обробки текстів для патентного відділу фірми Bell Laboratories,
в 1971 році система UNIX була перенесена на ЕОМ PDP-11. Система відрізнялася
невеликим обсягом: 16 Кбайт для системи, 8 Кбайт для програм користувачів,
обслуговувала диск об'ємом 512 Кбайт і відводила під кожен файл не більше 64
Кбайт. Після свого першого успіху Томпсон хотів був написати для нової
системи транслятор з Фортрану, але замість цього зайнявся Бі мовою (B),
попередником якого з'явився мова BCPL [Richards 69]. Бі був
інтер-претіруемим мовою з усіма вадами, притаманними подібним мовам,
тому Річі переробив його на новий різновид, що одержала назву Сі (C) і роздільну
генерувати машинний код, оголошувати типи даних і визначати структуру даних.
У 1973 році система була написана заново на Сі, це був крок, нечуваний для
того часу, але мав величезний резонанс серед сторонніх користувачів.
Кількість машин фірми Bell Laboratories, на яких була інстальована
система, зросло до 25, в результаті чого була створена група з системного
супроводження UNIX всередині фірми. p>
У той час корпорація AT & T не могла займатися
продажем комп'ютерних продуктів у зв'язку з відповідною угодою,
підписаним нею з федеральним урядом в 1956 році, і поширювала
систему UNIX серед університетів, яким вона була потрібна в навчальних цілях.
Слідуючи букві угоди, корпорація AT & T не рекламувала, не продавала та
не супроводжувала систему. p>
Незважаючи на це, популярність системи стійко зростала.
У 1974 році Томпсон і Річі опублікували статтю, що описує систему UNIX, в
журналі Communications of the ACM [Thompson 74], що дало ще один імпульс до
поширенню системи. До 1977 року кількість машин, на яких
функціонувала система UNIX, збільшилася до 500, причому 125 з них працювали у
університетах. Система UNIX завоювала популярність серед телефонних компаній,
оскільки забезпечувала хороші умови для розробки програм, обслуговувала
роботу в мережі в режимі діалогу і роботу в реальному масштабі часу (за допомогою
системи MERT [Lycklama 78a]). Крім університетів, ліцензії на систему UNIX
були передані комерційним організаціям. У 1977 році корпорація Interactive
Systems стала першою організацією, що отримала права на перепродаж системи UNIX
з надбавкой8 до ціни за додаткові послуги (*
), Які полягали в адаптації системи до
функціонування в автоматизованих системах управління засновницької
діяльністю. 1977 також був відзначений "перенесенням" системи UNIX на
машину, яка відрізняється від PDP (завдяки чому став можливий запуск системи на інший
машині без змін або з невеликими змінами), а саме на Interdata 8/32. p>
Зі зростанням популярності мікропроцесорів інші компанії
стали переносити систему UNIX на нові машини, однак її простота і ясність спонукали
багатьох розробників до самостійного розвитку системи, в результаті чого
було створено кілька варіантів базисної системи. За період між 1977 і 1982 роком
фірма Bell Laboratories об'єднала кілька варіантів, розроблених в
корпорації AT & T, в один, що отримав комерційна назва UNIX версія III. p>
Надалі фірма Bell Laboratories додала у версію
III декілька нових особливостей, назвавши новий продукт UNIX версія V (*
*), І ця версія стала офіційно поширюватися
корпорацією AT & T з січня 1983 року. У той же час співробітники
Каліфорнійського університету в Берклі розробили варіант системи UNIX,
що отримав назву BSD 4.3 для машин серії VAX і відрізняється деякими
новими, цікавими особливостями. p>
На початок 1984 система UNIX була вже
інстальована приблизно на 100000 машин по всьому світу, при чому на машинах
з широким діапазоном обчислювальних можливостей - від мікропроцесорів до
великих ЕОМ - і різних виробників. Ні про який інший операційній системі
не можна було б сказати того ж. Популярність і успіх системи UNIX пояснювалися
кількома причинами: p>
Система написана на мові високого рівня, завдяки
чому її легко читати, розуміти, змінювати і переносити на інші машини. За
оцінками, зробленими Річі, перший варіант системи на Сі мав на 20-40% більший обсяг
і працював повільніше в порівнянні з варіантом на асемблері, однак переваги
ис-користування мови високого рівня набагато переважають недоліки [Ritchie
78b], стор 1965). P>
Наявність досить простого користувача
інтерфейсу, у якому є можливість надавати всі необхідні
користувачу послуги. p>
Наявність елементарних засобів, що дозволяють створювати
складні програми з простіших. p>
Наявність ієрархічної файлової системи, легкої в
супроводі і ефектив-ною в роботі. p>
Забезпечення узгодження форматів у файлах, робота з
послідовним потоком байтів, завдяки чому полегшується читання прикладних
програм. p>
Наявність простого, послідовного інтерфейсу з
периферійними пристрої-ми. p>
Система є багато користувачів, багатозадачного;
кожен користувач може одночасно виконувати декілька процесів. p>
Архітектура машини прихована від користувача, завдяки
цього полегшений про-процес написання програм, що працюють на різних
конфігурації апаратних засобів. p>
Простота і послідовність взагалі відрізняють систему
UNIX і пояснюють більшість з вищенаведених доказів на її користь. P>
Хоча операційна система і більшість команд
написані на Сі, система UNIX підтримує ряд інших мов, таких як Фортран,
Бейсік, Паскаль, p>
Ада, Кобол, Лісп і Пролог. Система UNIX може
підтримувати будь-яку мову програмування, для якого є компілятор або
інтерпретатор, і забезпечувати системний інтерфейс, що встановлює відповідність
між призначеними для користувача запитами до операційної системи і набором запитів,
прийнятих в UNIX. p>
2. СТРУКТУРА СИСТЕМИ p>
На рисунку 1.1 зображена архітектура верхнього рівня
системи UNIX. Технічні засоби, показані в центрі діаграми, виконують
функції, що забезпечують функціонування операційної системи. Операційна система
взаємодіє з апаратурою безпосередньо (*
**), Забезпечуючи обслуговування програм та їх
незалежність від деталей апаратної конфігурації. Якщо уявити систему
що складається з пластів, в нейможно виділити системне ядро, ізольоване від
призначених для користувача p>
p>
Малюнок 1.1. Архітектура системи UNIX програм.
Оскільки програми не залежать від апаратури, їх легко переносити з однієї
системи UNIX в іншу, що функціонує на іншому комплексі технічних засобів,
якщо тільки в цих програмах не мається на увазі робота з конкретним
обладнанням. Наприклад, програми, розраховані на певний p>
розмір машинного слова, набагато важче перекладати
інші машини в порівнянні з програмами, які не потребують подібних установлений. p>
Програми, подібні до командного процесора shell і
редакторам (ed та vi) і показані на зовнішньому по відношенню до ядра шарі,
взаємодіють з ядром за допомогою добре певного набору звернень до
операційній системі. Звернення до операційної системи примушують ядро до
виконання різних операцій, яких вимагає викликає програма, і
забезпечують обмін данны-ми між ядром і програмою. Деякі з програм,
наведених на малюнку, в стандартних конфігураціях системи відомі як
команди, проте на одному рівні з ними можуть розташовуватися і доступні
користувачеві програми, такі як програма a.out, стандартне ім'я для
виконуваного файлу, створеного компілятором з мови Сі. Інші прикладні
програми розташовуються вище зазначених програм, на верхньому рівні, як це
показано на малюнку. Наприклад, стандартний компілятор з мови Сі, cc,
розташовується на самому зовнішньому шарі: він викликає препроцесор для Си, асемблер
і завантажувач (компонувальник), тобто окремі програми попереднього рівня. Хоча на
малюнку наведено дворівнева ієрархія прикладних програм, користувач
може розширити ієрархічну структуру на стільки рівнів, скільки необхідно.
Справді, стиль програмування, прийнятий в системі UNIX, допускає
розробку комбінації програм, що виконують одну й ту ж, спільне завдання. p>
Багато прикладні підсистеми і програми, що становлять
верхній рівень системи, такі як командний процесор shell, редактори, SCCS
(система обра-2боткі вихідні тексти програм) і пакети програм підготовки
документації, поступово стають синонімом поняття "система UNIX".
Проте всі вони користуються послугами програм нижніх рівнів і в кінцевому рахунку
ядра за допомогою набору звернень до операційної системи. У версії V прийнято 64
типу звернень до операційної системи, з яких трохи менше половини
використовуються часто. Вони мають нескладні параметри, що полегшує їх
використання, надаючи при цьому великі можливості користувачеві. Набір
звернень до операційної системи разом з реалізують їх внутрішніми
алгоритмами складають "тіло" ядра, у зв'язку з чим розгляд
операційної системи UNIX зводиться до докладного вивчення і аналізу звернень до
системі і їх взаємодії між собою. Коротше кажучи, ядро реалізує функції,
на яких грунтується виконан-ня всіх прикладних програм в системі UNIX, і
ним же визначаються ці функції. Використання термінів "система
UNIX "," ядро "або" система ", мається на увазі ядро
операційної системи UNIX, що і повинно випливати з контексту. p>
3. ПЕРЕГЛЯД З ТОЧКИ ЗОРУ КОРИСТУВАЧА p>
3.1 Файлова система p>
Файлова система UNIX характеризується: ієрархічної
структурою, узгодженою обробкою масивів даних, можливістю створення і
видалення файлів, динамічним розширенням файлів, захистом інформації у файлах, трактуванням
периферійних пристроїв (таких як термінали і стрічкові ус-тройства) як
файлів. p>
Файлова система організована у вигляді дерева з одного
вихідною вершиною, яка називається коренем (записується: "/");
кожна вершина в деревоподібній структурі файлової системи, окрім листя,
є каталогом файлів, а фай p>
Малюнок 1.2. Приклад деревоподібній структури файлової
системи p>
ли, що відповідають дочірнім вершин, є або
каталогами, або звичайними файлами, файлами пристроїв. Ім'я файлу
передує вказівка шляху пошуку, який описує місце розташування файлу в
ієрархічній структурі файлової системи. Назва шляху пошуку складається з компонент,
розділених між собою похилою межею (/), кожна компонента являє
собою набір символів, що складають ім'я вершини (файлу), яке є
унікальним для каталогу (попередньої компоненти), в якому вона міститься.
Повне ім'я шляху пошуку починається з вказівки похилій риси і ідентифікує
файл (вершину), пошук якого ведеться від кореневої вершини дерева файлової
системи з обходом тих гілок дерева файлів, які відповідають іменам
окремих компонентів. Так, шляхи "/ etc/passwd", "/ bin/who" і
"/ usr/src/cmd/who.c" вказують на файли, які є вершинами дерева,
зображеного на рисунку 1.2, а шляхи "/ bin/passwd" і "/ usr /
src/date.c "містять невірний маршрут. Назва шляху пошуку необов'язково
повинно починатися з кореня, в ньому слід вказувати маршрут щодо
поточного для виконуваного процесу каталогу, при цьому попередні символи
"похила риска" в імені шляху опускаються. Так, наприклад, якщо ми
перебуваємо в каталозі "/ dev", то шлях "tty01" вказує
файл, повне ім'я шляху пошуку для якихого "/ dev/tty01". p>
Програми, що виконуються під управлінням системи UNIX,
не містять ніякої інформації щодо внутрішнього формату, в якому ядро
зберігає файли даних, дані в програмах представляються як бесформатний потік
байтів. p>
Програми можуть інтерпретувати потік байтів по
своїм бажанням, при цьому будь-яка інтерпретація ніяк не буде пов'язана з
фактичним способом зберігання даних в операційній системі. Так,
синтаксичні правила, що визначають завдання методу доступу до даних у файлі,
встановлюються системою і є єдиними для всіх програм, однак семантика
даних визначається конкретною програмою. Наприклад, програма форматування
тексту troff шукає в кінці кожного рядка тексту символи переходу на нову
рядок, а програма обліку системних ресурсів acctcom працює із записами
фіксованої довжини. Обидві програми користуються одними й тими ж системними
засобами для здійснення доступу до даних у файлі як до потоку байтів, і
всередині себе перетворять цей потік за відповідним форматом. Якщо будь-яка з
програм виявить, що формат даних невірний, вона приймає відповідні
заходи. p>
Каталоги схожі на звичайні файли в одному відношенні;
система представляє інформацію в каталозі набором байтів, але ця інформація
включає в себе імена файлів у каталозі в оголошеному форматі для того, щоб
операційна система і програми, такі як ls (виводить список імен і атрибутів
файлів), могли їх виявити. p>
Права доступу до файлу регулюються установкою
спеціальних бітів дозволу доступу, пов'язаних з файлом. Встановлюючи біти
дозволу доступу, можна незалежно керувати видачею дозволів на читання,
запис і виконання для трьох категорій користувачів: власників файлу,
групового користувачів та інших. Користувачі можуть створювати файли, якщо
дозволений доступ до каталогу. p>
Новостворені файли стають листям в
деревоподібній структурі файлової системи. p>
Для користувача система UNIX трактує пристрою так,
як якби вони були файлами. Пристрої, для яких призначені спеціальні
файли пристроїв, стають вершинами в структурі файлової системи. Звернення
програм до пристроїв має той же самий синтаксис, що і звернення до звичайних
файлів; семантика операцій читання і запису по відношенню до пристроїв у великій
мірою збігається з семантикою операцій читання і запису звичайних файлів. Спосіб захисту
пристроїв збігається із способом захисту звичайних файлів: шляхом відповідної
встановлення бітів дозволу доступу до них (файлів). Оскільки імена пристроїв
виглядають так само, як і імена звичайних файлів, і оскільки над пристроями і над звичайними файлами
виконуються одні й ті ж операції, більшості програм немає необхідності
розрізняти всередині себе типи оброблюваних файлів. p>
Наприклад, розглянемо програму на мові Сі (Малюнок
1.3), в якій створюється нова копія існуючого файлу. Припустимо, що
виконувана версія програми має найменування copy. Для запуску програми
користувач вводить з терміналу: p>
copy oldfile newfile p>
де oldfile - ім'я існуючого файлу, а newfile - ім'я
створюваного файлу. p>
Система виконує процедуру main, привласнюючи аргументу
argc значення кількісних-ва параметрів в списку argv, а кожному елементу масиву
argv значення парамет-ра, повідомленого користувачем. У наведеному прикладі argc
має значення 3, елемент argv [0] містить рядок символів "copy"
(ім'я програми умовно являє-ся нульовим параметром), argv [1] - рядок символів
"oldfile", а argv [2] - рядок символів "newfile". Потім
програма перевіряє, правильне чи кількість параметрів було вказано при її
запуску. Якщо це так, запускається операція open (відкрити) для файлу oldfile з
параметром "read-only" (тільки для читання), у разі успішного виконання
якої запускається операція creat (відкрити) для файлу newfile. Режим доступу до
новоствореному файлу описується числом 0666 (в вісімковий коді), що
означає дозвіл доступу до файлу для читання і запису для всіх користувачів.
Всі звернення до операційної системи у випадку невдачі повертають код -1; якщо
ж невдало завершуються операції open і creat, програма видає повідомлення і
запускає операцію exit (вийти) з поверненням коду стану, рівного 1,
завершує свою роботу і вказуючи на виникнення помилки. p>
Операції open і creat повертають ціле значення,
що є дескриптором p>
файлу та використовуване програмою в наступних посиланнях
на файли. Після цього p>
програма викликає підпрограму copy, що виконує в
циклі операцію read (читати), по якій проводиться читання в буфер порції
символів з існуючого файлу, і операцію write (писати) для запису
інформації в новий файл.Операція read щоразу повертає кількість
прочитаних байтів (0 - якщо досягнуто кінець файлу). Цикл завершується, якщо
досягнуто кінець файлу або якщо відбулася помилка при виконанні операції read
(відсутній контроль виникнення помилок при виконанні операції write).
Потім управління з підпрограми copy повертається в основну програму і
запускається операція exit з кодом стану 0 як параметр, що
вказує на успішне завершення виконання програми. p>
Програма копіює будь-які файли, вказані при її
виклик як аргумен-тов, за умови, що дозволене відкриття
існуючого файлу і створення нового файлу. Файл може містити в собі як
текст, який може бути виведений на друкуючий пристрій, наприклад, вихідний
текст програми, так і символи, які не виводяться на друк, навіть саму програму.
Таким чином, обидва виклики: p>
copy copy.c newcopy.c p>
copy copy newcopy p>
є допустимими. Існуючий файл також може
бути каталогом. Наприклад, за викликом: p>
copy. dircontents p>
копіюється вміст поточного каталогу, позначеного
символом ".", в звичайний файл "dircontents"; інформація в
новому файлі співпадає, аж до кожного байта, з вмістом каталогу, тільки
це фото звичайного типу (для створення нового каталогу призначена операція
mknod). Нарешті, будь-який з файлів p>
може бути файлом пристрою. Наприклад, програма,
викликана наступним чином: p>
# include p>
char buffer [2048]; p>
int version = 1; p>
main (argc, argv) p>
int argc; p>
char * argv []; p>
( p>
int fdold, fdnew; p>
if (argc! = 3) p>
( p>
printf ( "need 2 arguments
for copy programn); p>
exit (1); p>
) p>
fdold = open (argv [1], O_RDONLY);/* відкрити вихідний
файл тільки для читання */ p>
if (fdold == -1) p>
( p>
printf ( "cannot open file
% sn ", argv [1]); p>
exit (1); p>
) p>
fdnew = creat (argv [2], 0666);/* створити новий файл з
роздільною здатністю читання і запису для всіх p>
користувачів */ p>
if (fdnew == -1) p>
( p>
printf ( "cannot create
file% sn ", argv [2]); p>
exit (1); p>
) p>
copy (fdold, fdnew); p>
exit (0); p>
) p>
copy (old, new) p>
int old, new; p>
( p>
int count; p>
while ((count =
read (old, buffer, sizeof (buffer)))> 0) p>
write (new, buffer, count); p>
) p>
Малюнок 1.3. Програма копіювання файлу p>
copy/dev/tty terminalread p>
читає символи, що вводяться з терміналу (файл/dev/tty
відповідає терміналу p>
користувача), і копіює їх у файл terminalread,
завершуючи роботу тільки в p>
тому випадку, якщо користувач натисне .
Схожа форма запуску програми: p>
copy/dev/tty/dev/tty p>
викликає читання символів з терміналу і їх копіювання
назад на термінал. p>
3.2 середу виконання процесів p>
Програмою називається виконуваний файл, а процесом
називається послідовність операцій програми або частина програми при її
виконання. У системі UNIX може одночасно виконуватися безліч процесів
(цю особливість іноді називають мультипрограмування або багатозадачні
режимом), p>
при чому їх число логічно не обмежується, і
безліч частин програми p>
(такий як copy) може одночасно перебувати в
системі. Різні системні операції дозволяють процесам породжувати нові
процеси, завершують процеси, синхронізують виконання етапів процесу і
управляють реакцією на наступлю-ня різних подій. Завдяки різним
зверненнями до операційної p>
системі, процеси виконуються незалежно один від
одного. p>
Наприклад, процес, що виконуються в програмі,
наведеною на рисунку p>
1.4, запускає операцію fork, щоб породити новий
процес. Новий процес, p>
іменований породженим процесом, отримує значення
коду завершення операції p>
fork, дорівнює 0, і активізує операцію execl, яка
виконує програму p>
copy (Малюнок 1.3). Операція execl завантажує файл
"copy", який передпілля-жітельно знаходиться в поточному каталозі, в
адресний простір породженого p>
процесу і запускає програму з параметрами, отриманими
від користувача. В p>
разі успішного виконання операції execl управління
в викликав її процес p>
не повертається, оскільки процес виконується в новому
адресному просторі. Тим часом, процес, що запустив операцію fork
(батьківський процес), отримує нульове значення коду завершення операції,
викликає операцію wait, яка призупиняє його виконання до тих пір,
поки не закінчиться виконання програми copy, і завершується (кожна програма
має вихід в кінці головної процедури, після якої розташовуються програми
стандартних бібліотек Сі, що підключаються в процесі компіляції). Наприклад, якщо
виконувана програма називається run, користувач запускає її наступним
так: p>
main (argc, argv) p>
int argc; p>
char * argv []; p>
( p>
/* передбачено 2 аргументи: вихідний файл і новий
файл */ p>
if (fork () == 0) p>
execl ( "copy", "copy", argv [1], argv [2], 0);
p>
wait ((int *) 0) p>
printf ( "copy
donen "); p>
) p>
Малюнок 1.4. Програма породження нового процесу,
виконує копіювання файлів p>
run oldfile newfile p>
Процес виконує копіювання файлу з ім'ям
"oldfile" у файл з ім'ям p>
"newfile" і виводить повідомлення. Хоча дана
програма мало що додала до p>
програмі "copy", у ній з'явилися чотири
основних звернення до операційної p>
системі, що керують виконанням процесів: fork, exec,
wait і exit. p>
Взагалі використання звернень до операційної системи
дає можливість p>
користувачеві створювати програми, що виконують складні
дії, і як наслідок, ядро операційної системи UNIX не включає в себе
багато функцій, що є частиною "ядра" в інших системах. Такі
функції, і серед них компілятори і редактори, в системі UNIX є
програмами для користувача p>
рівня. Найбільш характерним прикладом подібної
програми може служити командний процесор shell, з яким зазвичай
взаємодіють користувачі після p>
входу в систему. Shell інтерпретує перше слово
командного рядка як ім'я p>
команди: у багатьох командах, у тому числі і в командах
fork (породити новий p>
процес) та exec (виконати породжений процес), сама
команда асоціюється p>
з її ім'ям, всі інші слова в командному рядку
трактуються як параметри p>
команди. p>
Shell обробляє команди трьох типів. По-перше, в
як ім'я команди може бути вказано ім'я файлу, що виконується в об'єктних
коді, отриманого в результаті компіляції вихідного тексту програми (наприклад,
програми p>
на мові Сі). По-друге, на ім'я команди може бути ім'я
командного файлу, який містить набір командних рядків, що обробляються shell'ом.
Нарешті, команда p>
може бути внутрішня команда мови shell (на відміну
від виконуваного файлу). Наявність внутрішніх команд робить shell мовою
програмування на додаток до функцій командного процесора; командний мова
shell включає команди організації циклів (for-in-do-done і while-do-done),
команди виконання за умовами (if-then-else-fi), оператор вибору, команду
зміни поточного для процесу каталогу (cd) і деякі інші. Синтаксис
shell'а допускає порівняння із зразком і обробку параметрів. Користувачам,
запускаючим команди, немає необхідності знати, якого типу ці команди. p>
Командний процесор shell шукає імена команд в
вказаному наборі каталогів, що можна змінити за бажанням користувача,
викликавши shell. Shell p>
зазвичай виконує команду синхронно, з очікуванням
завершення виконання команди перш, ніж визначити таку командний рядок.
Тим не менше, допускається p>
і асинхронне виконання, коли чергова командна
рядок зчитується і виконується, не чекаючи завершення виконання попередньої
команди. Про командах, виконуваних асинхронно, кажуть, що вони виконуються на
тлі інших команд. Наприклад, введення команди p>
who p>
викликає виконання системою програми, що зберігається в
фото/bin/who (*
***) І здійснює виведення списку користувачів, які
зараз працюють з системою. Поки команда who виконується, командний
процесор shell очікує завершення її виконання і тільки потім запитує в
користувача наступну команду. Якщо ж ввести команду p>
who & p>
система виконає програму who на фоні і shell готовий
негайно прийняти наступну команду. p>
У середу виконання кожного процесу в системі UNIX
включається поточний p>
каталог. Поточний для процесу каталог є
початковим каталогом, ім'я якого приєднується до всіх імен шляхів пошуку,
які не починаються з p>
похилій риси. Користувач може запустити
внутрішню команду shell'а cd p>
(змінити каталог) для переміщення по дереву файлової
системи і для зміни p>
поточного каталогу. Командний рядок p>
cd/usr/src/uts p>
робить поточним каталог "/ usr/src/uts".
Командний рядок p>
cd ../.. p>
робить поточним каталог, який на дві вершини
"ближче" до кореня (кореневого p>
каталогу): параметр ".." відноситься до
каталогу, що є батьківським для p>
поточного. p>
Оскільки shell є для користувача програмою і
не входить до складу ядра операційної системи, його легко модифікувати і
поміщати в конкретні умови експлуатації. Наприклад, замість командного
процесора Баурна p>
(названого так за ім'ям його творця, Стіва
Баурна), що є частиною p>
версії V стандартної системи, можна використовувати
процесор команд Сі, що забезпечує роботу механізму ведення історії змін
і що дозволяє Уникайте використання p>
повторного введення тільки що використаних команд. У
деяких випадках при p>
бажанні можна скористатися командним процесором
shell з обмеженими p>
можливостями, що є попередньою версією звичайного
shell'а. Система може p>
працювати з декількома командними процесорами
одночасно. Користувачі p>
мають можливість запускати одночасно безліч
процесів, процеси ж в p>
свою чергу можуть динамічно породжувати нові
процеси і синхронізувати p>
їх виконання. Всі ці можливості забезпечуються
завдяки наявності потужних p>
програмних і апаратних засобів, що складають середу
виконання процесів. p>
Хоча привабливість shell'а найбільшою мірою
визначається його можливостей-тями як мови програмування і його можливостями
в обробці аргументів, в цьому розділі основна увага концентрується на
середовищі виконання процес-сов, управління якої в системі покладено на
командний процесор Shell. p>
3.3 Елементи конструкційних блоків p>
Як уже говорилося раніше, концепція розробки системи
UNIX полягала p>
в побудові операційної системи з елементів,
які дозволили б користувачеві створювати невеликі програмні модулі,
що виступають в якості конструкційних блоків при створенні більш складних
програм. Одним з таких елементів, з якими часто стикаються користувачі
при роботі з командним p>
процесором shell, є можливість перепризначення
вводу-виводу. Говорячи p>
умовно, процеси мають доступ до трьох файлів: вони
читають з файлу стандартного вводу, записують у файл стандартного виводу і
виводять повідомлення про p>
помилки в стандартний файл помилок. Процеси,
запускаються з терміналу, звичайно p>
використовують термінал замість всіх цих трьох файлів,
проте кожен файл незалежно від інших може бути "перепризначений".
Наприклад, команда p>
ls p>
виводить список всіх файлів поточного каталогу на
пристрій (до файлу) стандартного виводу, а команда p>
ls> output p>
перепризначає вивідний потік зі стандартного виводу в
файл "output" у поточному каталозі, використовуючи вищезгаданий системний
виклик creat. Подібним же p>
чином, команда p>
mail mjb
відкриває (за допомогою системного виклику open) файл
"letter" як файлу p>
стандартного вводу і пересилає його вміст
користувачеві з ім'ям "mjb". p>
Процеси можуть перепризначати одночасно і введення, і
висновок, як, наприклад, в p>
команду: p>
nroff-mm
doc1.out 2> errors p>
де програма форматування nroff читає вступної файл
doc1, як файлу стандартного виводу задає файл doc1.out і виводить
повідомлення про помилки в p>
файл errors ( "2>" означає перепризначення
висновку, що призначався для файлу з дескриптором 2, який відповідає
стандартного файлу помилок). Програм-ми ls, mail і nroff не знають, які файли
вибрані як файли стандартного вводу, стандартного виводу і записи
повідомлень про помилки; командний процесор shell сам розпізнає символи
"<", ">"?? "2>" і призначає в
відповідно до їх вказівкою файли для стандартного вводу, стандартного виводу і
запису повідомлень про помилки безпосередньо перед запуском процесів. p>
конструкційних Другим елементом є канал,
механізм, забезпечую-щий інформаційний обмін між процесами, виконання
яких пов'язане з p>
операціями читання та запису. Процеси можуть
перепризначати вивідний потік зі p>
стандартного виводу на канал для читання з нього іншими
процесами, перепризначити на канал свій стандартний ввід. Дані, що посилаються
в канал першими p>
процесами, є вхідними для другого процесів.
Другі процеси так само p>
можуть перепризначити свій вивідний потік і так далі, в
залежності від побажань програміста. І знову, так само як і у вищезгаданому
випадку, процесам немає необхідності знати, якого типу файл використовується в
як файлу p>
стандартного виводу; їх виконання не залежить від того,
чи буде файлом стандартного виводу звичайний файл, канал або пристрій. У
процесі побудови p>
великих і складних програм з конструкційних
елементів меншого розміру p>
програмісти часто використовують канали і перепризначення
вводу-виводу при складанні і з'єднанні окремих частин. І справді, такий
стиль програмування знаходить підтримку в системі, завдяки чому нові
програми можуть працювати разом з існуючими програмами. p>
Наприклад, програма grep здійснює пошук контексту в
наборі файлів (що є параметрами програми) за наступним зразком: p>
grep main a.c b.c c.c p>
де "main" - підрядок, пошук якої
проводиться у файлах ac, bc і cc с p>
видачею в файл стандартного виводу тих рядків, в
яких вона міститься. Вміст вивідного файлу може бути наступним: p>
a.c: main (argc, argv) p>
c.c:/* here is the main loop
in the program */ p>
c.c: main () p>
Програма wc з необов'язковим параметром-l
підраховує кількість рядків у файлі p>
стандартного вводу. Командний рядок p>
grep main a.c b.c c.c | wc-l p>
викличе підрахунок числа рядків у зазначених файлах, де
буде виявлена підрядок "main"; вивідний потік команди grep
надійде безпосередньо на вхід p>
команди wc. Для попереднього прикладу результат буде
такий: 3 p>
Використання каналів часто робить непотрібним
створення тимчасових файлів. p>
4. ФУНКЦІЇ ОПЕРАЦІЙНОЇ СИСТЕМИ p>
На рисунку 1.1 рівень ядра операційної системи
зображений безпосередньо під рівнем прикладних програм користувача.
Виконуючи різні елементар-ні операції по запитах користувацьких
процесів, ядро забезпечує p>
функціонування призначеного для користувача інтерфейсу,
описаного вище. Серед функцій ядра можна відзначити: p>
Управління виконанням процесів за допомогою їх
створення, завершення чи припинення та організації взаємодії між ними. p>
Планування черговості надання що виконуються
процесам часу центрального процесора (диспетчеризація). Процеси працюють
з центральним процесором у режимі поділу часу: центральний процес-сор
виконує процес, після закінчення який починається ядром кванта часу процес
припиняється і ядро