Основні функціональні компоненти операційної системи – файлова система, взаємодія процесів (IPC – interprocess communications), система введення.виведення і управління пристроями|устроями|.
Файлова система – регламент, що визначає спосіб організації, зберігання і іменування даних на носіях інформації. Вона визначає формат фізичного зберігання інформації, яку прийнято групувати у вигляді файлів. Конкретна файлова система визначає довжину імені файлу, максимальний можливий розмір файлу, набір атрибутів файлу. Деякі файлові системи надають|уявляють| сервісні можливості|спроможності|, наприклад, розмежування доступу або шифрування файлів.
Файлова система зв'язує носій інформації, з одного боку, і API для доступу до файлів – з|із| іншого. Коли прикладна програма звертається|обертається| до файлу, вона не має ніякого|жодного| уявлення про те, яким чином розташована|схильна| інформація в конкретному файлі, так само, як і на якому фізичному типі носія (CD, жорсткому диску, магнітній стрічці або блоці флэш-пам'яті) він записаний. Все, що знає програма – це ім'я файлу, його розмір і атрибути. Ці дані вона одержує|отримує| від драйвера файлової системи. Саме файлова система встановлює, де і як буде записаний файл на фізичному носії (наприклад, жорсткому диску).
Проте|однак| файлова система не обов'язково безпосередньо|прямо| пов'язана з фізичним носієм інформації. Існують віртуальні і мережеві|мережні| файлові системи, які є|з'являються,являються| лише способом доступу до файлів, що знаходяться|перебувають| на видаленому|віддаленому| комп'ютері.
Пакет IPC (interprocess communication) в системі UNIX включає три основні механізми: механізм повідомлень - |сполучень| дає процесам можливість|спроможність| посилати іншим процесам потоки сформатованих даних, механізм розділення|поділу| пам'яті - дозволяє процесам спільно використовувати окремі частини|частки| віртуального адресного простору, а семафори – синхронізувати своє виконання з|із| виконанням паралельних процесів.
Крім цих механізмів для міжпроцесової| взаємодії використовуються потоки введення/виведення|виведення|, змінні оточення, канали і сокети, пам'ять, що розділяється, і сигнали.
Кожен процес, що запускається, система забезпечує |деяким| інформаційним простором, який цей процес може змінювати|зраджувати|. Правила користування цим простором прості: у ньому можна задавати іменовані сховища даних (змінні оточення), в які можна записувати|занотовувати| будь-яку текстову інформацію (привласнювати значення змінної оточення), і згодом цю інформацію прочитувати (підставляти значення змінної).
У Unix дочірній процес створюється як точна копія батьківського. Проте|однак|, якщо дочірній процес використовує значення деяких змінних з числа передаваних йому з|із| оточенням, то батьківський процес може наперед|заздалегідь| вказати, яким з|із| копійованих в оточенні змінних потрібно змінити|поміняти| значення. Т.ч., одна і та ж програма при однаковому використанні, але|та| в зміненому оточенні, може видавати різні результати.
Сокети представляють|уявляють| альтернативний інтерфейс обміну даними як в рамках|у рамках| однієї системи, так і між процесами, запущеними|занедбаними| на різних машинах. Інтерфейс сокетів дозволяє явно розділити у взаємодії двох процесів серверну і клієнтську частину|частку|. Серверний процес ініціалізував сокет і чекає вхідних з'єднань|сполучень,сполук| від інших процесів. Клієнтський процес встановлює з'єднання|сполучення,сполуку|, і з цієї миті по каналу, що утворився, можна передавати потік даних в обидві сторони. Основне застосування|вживання| сокетів – взаємодії процесів в мережі|сіті|.
Система введення/виведення|виведення| в ОС Unix, у відмінність від |відзнаку| більшості опреаційних систем, орієнтована на роботу з|із| потоками, а не із|із| записами. Потік – послідовність байтів що закінчується роздільником. Поняття потоку дозволяє простіше добитися незалежності від пристроїв|устроїв| і уніфікації файлів з|із| фізичними пристроями|устроями| і конвейєрами. Т.ч. в ОС Unix команди введення/виведення|виведення|, вживані до файлів і фізичних пристроїв|устроїв|, одні і ті ж. Фізичні пристрої|устрої| представлені|уявлені| спеціальними файлами в єдиній структурі файлової системи.
Механізм перенаправлення введення/виведення|виведення| є|з'являється,являється| одним з елегантніших, могутніших і одночасно простих механізмів в ОС Unix. Для того, що б забезпечити гнучкіше використання програм введення і виведення|виведення|, бажано забезпечити їм введення з|із| файлу або з|із| виведення інших програм і направити|спрямувати,скерувати| їх виведення|виведення| у файл або на введення інших програм.
Реалізація цього механізму заснована на наступних|слідуючих| властивостях ОС Unix:
- будь-яке введення/виведення|виведення| трактується як введення з|із| деякого файлу і виведення|виведення| в деякий файл. Клавіатура і монітор теж|також| інтерпретуються як файли:
- доступ до будь-якого файлу проводиться|виробляється,справляється| через його дескриптор:
1) файл з|із| дескриптором 0 називається файлом стандартного введення (stdin);
2) файл з|із| дескриптором 1 називається файлом стандартного виведення|виведення| (stdout);
3) файл з|із| дескриптором 2 називають файлом стандартного виведення діагностичних повідомлень|сполучень| (stderr);
- програма, запущена|занедбана| в деякому процесі, успадковує|наслідує| від процесу, що її породив, всі дескриптори відкритих|відчинених| файлів.
Файл стандартного введення – клавіатура, файли стандартного введення і виведення діагностичних повідомлень|сполучень| – екран терміналу.
При запуску будь-якої команди можна повідомити інтерпретатор:
- який файл або виведення якої програми повинні служити файлам стандартного введення для програми, що запускається;
- який файл або введення якої програми повинні служити файлам стандартного виведення|виведення|;
- який файл або введення якої програми повинні служити файлам виведення діагностичних повідомлень|сполучень|.
Все, що потрібне для нормального функціонування механізму перенаправлення введення/виведення|виведення|, - дотримуватися угоди про використання дескрипторів stdin, stdout і stderr.
Управління зовнішніми пристроями|устроями| – це одна з найважливіших функцій будь-якої ОС. Система повинна забезпечувати ефективний і зручний доступ до периферійних пристроїв|устроїв|, а також забезпечувати можливість|спроможність| уніфікованої розробки ПЗ| для зовнішніх пристроїв|устроїв|, що знов|знову,щойно| підключаються. Розглянемо|розгледимо|, як ця проблема розв'язується|вирішується| в ОС Unix. Для доступу до зовнішніх пристроїв|устроїв| в ОС Unix використовується універсальна абстракція файлу. Крім справжніх|теперішніх,даних| файлів (звичайних|звичних| файлів або каталогів), які реально займають|позичають,посідають| пам'ять на магнітних дисках, файлова система містить|утримує| так звані спеціальні файли, яким насправді відповідають зовнішні пристрої|устрої|. Це рішення|розв'язання,вирішення,розв'язування| дозволяє природним чином працювати в одному і тому ж інтерфейсі з|із| будь-яким файлом або зовнішнім пристроєм|устроєм|.
Файлова система ОС Linux
Поняття файлу є|з'являється,являється| одним з найбільш важливих|поважних| для OC Linux. Всі файли, з|із| якими можуть маніпулювати користувачі, розташовуються у файловій системі, що є деревом, проміжні вершини якого відповідають каталогам, і листям – файлам і порожнім|пустим| каталогам. Реально на кожному логічному диску (розділі фізичного диска) розташовується окрема ієрархія каталогів і файлів.
Існує досить багато різних файлових систем. Файлові системи розрізняються швидкістю доступу, надійністю зберігання даних, ступенем|мірою| стійкості при збоях, деякими додатковими можливостями|спроможностями|. Сучасні ОС підтримують по декілька типів файлових систем (крім файлових систем, використовуваних для зберігання даних на жорсткому диску, також файлові системи CD і DVD і ін). Хоча б для кожної ОС звичайно існує одна «традиційна» файлова система, яка пропонується за умовчанням, є|з'являється,являється| універсальною і підходить|пасує,личить| абсолютній більшості користувачів.
Важлива|поважна| властивість файлових систем – підтримка журналізації. Журналіруєма файлова система веде постійний облік|урахування| всіх операцій запису на диск. Завдяки цьому після|потім| збою електроживлення файлова система завжди автоматично повертається в робочий стан.
Існує декілька типів файлових систем, які повною мірою підтримують всі можливості|спроможності|, необхідні для повноцінної роботи Linux (всі необхідні типи і атрибути файлів, зокрема права доступу).
Ext2/3
Цей тип файлової системи розроблений спеціально для Linux і традиційно використовується на більшості Linux-систем. Фактично в назві «Ext2/3» об'єднані|з'єднані| назви двох варіантів цієї файлової системи. Ext3 відрізняється від Ext2 тільки|лише| підтримкою журналізації, в іншому вони однакові і легко можуть бути перетворені одна в іншу у будь-який момент без втрати даних. Звичайно вибирається варіант з|із| журналізацією (Ext3), через його більшу надійність.
ReiserFS
Файлова система цього типа схожа скоріше|скоріше,скоріш| на базу даних: усередині неї використовується своя власна система індексації і швидкого пошуку даних, а уявлення|вистава,подання,представлення| у вигляді файлів і каталогів – тільки|лише| одна з можливостей|спроможностей| використання такої файлової системи. Традиційно вважається|лічиться|, що ReiserFS відмінно|чудово| підходить|пасує,личить| для зберігання величезного числа маленьких файлів. Підтримує журналізацію.
XFS
Файлова система, найбільш відповідна|придатна| для зберігання дуже великих файлів, в яких постійно що-небудь дописується або змінюється. Підтримує журналізацію.
SWAPFS
Цей тип файлової системи знаходиться|перебуває| на особливому положенні|становищі| – він використовується для організації на диску області підкачки (swap). Область підкачки використовується в Linux для організації віртуальної пам'яті, коли програмам недостатньо наявній у наявності оперативній пам'яті, частина|частка| робочої інформації тимчасово розміщується на жорсткому диску.
JFS
Розроблена IBM для файлових серверів з|із| високим навантаженням, при розробці особлива увага приділялась продуктивності та надійністі, що і було досягнуто. Підтримує журналізацію.
У Linux підтримується, окрім|крім| власних, не мало форматів файлових систем, використовуваних іншими ОС. Якщо спосіб запису на ці файлові системи відомий і не дуже|занадто| хитромудрий, то чи працює запис, і читання, а інакше – тільки|лише| читання (чого не рідко буває досить|достатньо|). Файлові системи перерахованих нижче типів звичайно присутні на розділах диска, що належать іншим ОС.
FAT12/FAT16/FAT32
Ці файлові системи використовуються в MS-DOS і різних версіях Windows, а так само на багатьох знімних носіях (зокрема, на дискетах і USB-Flash). Linux підтримує читання і запис на ці файлові системи.
NTFS
Файлова система NTFS спочатку з'явилася|появилася| в системах Windows NT, але|та| може використовуватися і іншими версіями Windows. У Linux NTFS підтримується тільки|лише| на читання.
Як вже було сказано, файлова система Linux, на відміну від файлових систем MS-DOS і Microsoft Windows, є|з'являється,являється| єдиним деревом. Корінь цього дерева – каталог root |значиться|. Частини|частки| дерева файлової системи можуть фізично розташовуватися в різних розділах різних дисків або взагалі на інших комп'ютерах – для користувача це прозоро. Процес приєднання файлової системи, розташованої|схильної| на окремому пристрої|устрої| або розділі, до загального|спільного| дерева називається монтуванням |. Файли будь-якої файлової системи стають доступними тільки|лише| після|потім| монтування цієї файлової системи. Файли не змонтованої файлової системи не є|з'являються,являються| видимими ОС. Для монтування файлової системи використовується системний виклик mount.
Для роботи Linux необхідно створити на жорсткому диску принаймні два розділи кореневої (тобто той, який міститиме|утримуватиме| каталог /) і розділ підкачки (віртуальної пам'яті, swap). Розмір останнього, як правило, складає від одноразової|однократної| до двократної величини ОП комп'ютера.
Оскільки для файлової системи Linux не важливо|поважно|, яким чином частини|частки| дерева каталогів розташовані на розділах дисків, у|в,біля| вас є можливість|спроможність| використовувати кожний з наявних розділів диска під будь-який каталог файлової системи. Наприклад, корисно розділити призначені для користувача дані і системи.
Таким чином, формується 4 розділи:
Swap
Розділ для віртуальної пам'яті (необхідно вказати тип розділу Linux swap), що приблизно удвічі|вдвічі| перевершує за розміром об'єм|обсяг| ОП.
Кореневий (root) розділ
Це найважливіший|поважніший| розділ. Він не тільки|не лише| містить|утримує| найбільш важливі|поважні| дані і програми системи, але|та| так само служитиме точкою монтування для інших розділів. Потреба в об'ємі|обсязі| кореневого розділу невелика, звичайно достатньо|досить| 300Мб. Проте|однак|, якщо ви плануєте|планеруєте| встановлювати комерційні додатки|застосування|, які звичайно розміщуються в /opt, то розмір доведеться|припаде| збільшити. Інший варіант – завести окремий розділ для /opt.
Usr
Статичні дані: велика частина|частка| пакетів встановлює свої виконувані файли в /usr. Перевагою розміщення їх в окремому розділі є|з'являється,являється| те, що їх можна легко розділяти по мережі|сіті| з|із| іншими машинами. Розмір залежить від пакетів, які будуть встановлені|установлені|, але|та| коливається|вагається| в межах від 100 Мб для максимальної установки до декількох гігабайт для повної|цілковитої| установки. Варіант 1-2 Гб (залежно від розміру диска) швидше за все|скоріш за все| підійде.
Home
Домашні|хатні| каталоги користувачів. Тут зберігаються персональні каталоги всіх користувачів машини. Тут також звичайно зберігаються каталоги з|із| даними для HTTP сервера. Тут розмір каталога залежить від кількості працюючих користувачів (і сервісів) і від їх потреб. Варіантом цього рішення|розв'язання,вирішення,розв'язування| є|з'являється,являється| відмова від використання окремого розділу для /usr і розміщення його в звичайному|звичному| каталозі в кореневому розділі /.
Файлова система Linux містить|утримує| наступні|слідуючі| каталоги першого рівня:
Bin
Основні програми, необхідні для роботи в системі: командній оболонці shell, основні утиліти.
Boot
Каталог, який містить|утримує| ядро системи – головну програму, що завантажує і використовує всі інші.
Dev
Каталог, в якому містяться|утримуються| псевдофайли пристроїв|устроїв|. З погляду Linux всі фізичні пристрої|устрої|, як головні, так і периферійні, є файли особливого типа, в які система може записувати|занотовувати| дані і з|із| яких може їх прочитувати. Користувач не повинен працювати з|із| цими файлами, оскільки запис неправильних даних у файл пристрою|устрою| може пошкодити пристрій|устрій| або дані, що зберігаються на ньому.
Etc
У цьому каталозі містяться|утримуються| системні конфігураційні файли – текстові файли, які прочитуються при завантаженні|загрузці| системи і запуску програм і визначає їх поведінку. Настройка і адміністрування Linux зрештою|врешті решт| зводиться до редагування цих файлів, навіть якщо вони виконуються за допомогою графічних засобів|коштів| конфігурації системи.
Home
У структурі файлової системи Linux кожен користувач має окремий особистий|особовий| каталог для своїх даних (т.з. домашній|хатній| каталог), і всі призначені для користувача каталоги виділені в окремий загальний|спільний| каталог /home.
Lib
Системні бібліотеки, модулі ядра.
Mnt
Каталоги для монтування файлових систем змінних пристроїв|устроїв| і зовнішніх файлових систем.
Proc
Файлова система на віртуальному пристрої|устрої|, її файли містять|утримують| інформацію про поточний стан системи.
Root
Каталог адміністратора системи.
Sbin
Системні утиліти.
Usr
Програми бібліотеки доступні користувачу.
Var
Робочі файли програм, різні тимчасові дані: черги (листи на відправку|, файли на друк|печатку| і ін.), системні журнали|часописи| (файли, в які записується|занотовується| інформація про події, що відбуваються|походять| в системі).
Tmp
Тимчасові файли
Linux підтримує численні|багаточисельні| утиліти, що дозволяють працювати з|із| файловою системою і доступні як команди командного інтерпретатора. Ось|от| деякі з них (найбільш споживані):
ср| имя1 имя2 - копіювання файлу имя1 у файл имя2
rm имя1 - знищення файлу имя1
mv имя1 имя2 - перейменування файлу имя1 у файл имя2
mkdir ім'я - створення|створіння| нового каталога ім'я
rmdir ім'я - знищення каталога ім'я
ls ім'я - видача вмісту каталога ім'я
cat ім'я - видача на екран вмісту файлу ім'я
chown ім'я режим - зміна режиму доступу до файлу
Процеси в системі Unix. Створення процесів. Завершення роботи процесів. Планування процесів. Процеси-зомбі
Загалом, процес – це програма разом з її даними на стадії виконання. Концептуально процес розглядається|розглядується| як носій даних, що виконує операції по обробці цих даних. Як приклад|зразок| процесів можна привести виконання прикладних програм користувачів, утиліт і ін.
Процес в Unix – це програма, яка виконується в окремому віртуальному адресному просторі – це означає, що в системі Unix процеси захищені один від одного і крах одного процесу ніяк не вплине на процеси, що виконуються, і на всю систему в цілому|загалом|.
У багатозадачній розрахованій на багато користувачів системі Unix можуть одночасно функціонувати сотні і тисячі процесів. Кожен процес запускає одну програму і спочатку одержує|отримує| один потік управління. Кожен процес може породжувати дочірні процеси, які в свою чергу також можуть породжувати інші процеси. Т.ч. створюється ієрархія процесів, на вершині якої знаходиться|перебуває| процес init – процес початкового завантаження|загрузки| системи. Кожен процес ідентифікується за допомогою 16-ти розрядного| двійкового числа, яке називається ідентифікатор процесу (PID). До атрибутів процесу також відноситься ідентифікатор батьківського процесу – PPID.
Механізм породження нових процесів істотно|суттєво| розрізняється в різних ОС. У всіх ОС сімейства Unix нові процеси не з'являються|появляються| «з|із| нізвідки», а відгалужуються від вже існуючих|наявних| в системі процесів.
Коли виникає необхідність створення|створіння| нового процесу, поточний процес виконує системний виклик fork (), для створення|створіння| нового адресного простору, який повністю ідентичний його власному адресному простору. Іншими словами, після|потім| виконання цього системного виклику ми одержуємо|отримуємо| два абсолютно однакових процеси – основний і породжений. Новий процес відрізняється лише тим, що у|в,біля| нього інший PID, а батьком для нього є|з'являється,являється| процес, що запустив його.
Далі дочірній процес за допомогою системного виклику exec() запускає замість себе іншу програму, наново|заново| проініціював| свій код і дані. Параметрами exec() є|з'являються,являються| ім'я виконуваного файлу і, якщо потрібно, параметри, які будуть передані цій програмі. У адресний простір, породжений за допомогою fork(), буде завантажена програма і її виконання почнеться з точки введення (адреса функції main).
Основною проблемою організації мультипрограмного режиму в будь-якій ОС є|з'являється,являється| організація планування|планерування| – розподілу ресурсів між процесами – «паралельного» виконання декількох процесів.
Залежно від стану процесу йому повинен бути наданий той або інший ресурс. Розрізняють наступні|слідуючі| стани процесів:
- новий (тільки що створений процес);
- виконуваний (команди процесу виконуються процесором);
- готовий (процес, чекаючий звільнення|визволення| процесора);
- очікуваний|сподіваний| (процес, чекаючий завершення деякої події);
- завершений (процес, що завершив свою роботу).
Наприклад, новому процесу повинен бути наданий ресурс – адресний простір основної пам'яті.
Планування|планерування| процесів повинне забезпечити ефективне використання ресурсів, їх максимальне завантаження|загрузку|. Одним з таких методів планування|планерування| є|з'являється,являється| формування черг доступу до ресурсів. Програмно черги звичайно реалізуються як зв'язані лінійні списки. Наприклад, нові процеси зберігаються у вхідній черзі – черги завдань|задач|. Вхідна черга розташовується в зовнішній пам'яті. Процеси в цій черзі чекає ресурс – адресний простір. Готові процеси розташовуються в черзі в основній пам'яті і чекають ресурс – процесорний час. При проходженні процесу через обчислювальну систему процес мігрує з|із| однієї черги в іншу під управлінням спеціальних програм – планувальників. ОС, звичайно, має два планувальники:
- довгостроковий;
- короткостроковий|короткотерміновий|.
Принципова відмінність між ними полягає в частоті запуску. Наприклад, короткостроковий|короткотерміновий| планувальник звичайно запускається кожні 100 мс|, а довгостроковий – 1 раз в декілька хвилин.
Довгостроковий планувальник вирішує|рішає|, який з|із| процесів, що знаходиться|перебуває| у вхідній черзі, повинен бути поставлений в черзі готових процесів у разі|в разі| звільнення|визволення| пам'яті. Метою|ціллю| цього планувальника є|з'являється,являється| вибір такого процесу, який би максимально відповідав принципу неоднорідної суміші програм. Це означає, що в черзі готових процесів повинні бути процеси, орієнтовані як на переважне використання процесора, так і на переважне використання пристроїв|устрій| введення/виведення|виведення|.
Короткостроковий|короткотерміновий| планувальник вирішує|рішає|, який процес з|із| черги готових процесів повинен бути обраний на виконання процесором.
На роботу планувальників істотно|суттєво| впливає пріоритет того або іншого процесу. У системі Unix існує таке поняття, як фактор|фактор| поступливості, чим він вище, тим нижче пріоритет процесу. За умовчанням призначені для користувача процеси мають нульовий фактор |фактор| поступливості, а значить, одержує|отримує| більше процесорного часів. Для того, щоб програмно вплинути на пріоритет процесу, використовується функція nice(), єдиним аргументом який є|з'являється,являється| позитивне число, яке додаватиметься|добавлятиметься| до фактора |фактору| поступливості. Тільки|лише| програма з|із| привілеями|привілегіями| root має право знижувати фактор |фактор| поступливості процесів, задаючи в команді nice() негативне|заперечне| число.
Завершення роботи процесу звичайно здійснюється одним з двох способів:
- викликом exit() – сам процес його викликає|спричиняє|;
- при завершенні роботи main().
Завершуючи свою роботу, процес передає батьківському процесу код свого завершення через аргумент функції exit() у першому випадку або через return в другому випадку.
Можливо також аварійне завершення процесу в результаті|унаслідок,внаслідок| надходження|вступу| одного із сигналів: SIGTERM, SIGFPE, SIGSEGV, SIGKILL, SIGABRT і т.д. Програмно послати|надіслати| сигнал процесу можна за допомогою команди kill(), параметрами якої є|з'являються,являються| ідентифікатор процесу, якому відправляється|вирушає| сигнал, і номер сигналу (за умовчанням SIGTERM). Процес також може сам собі відправити запит за допомогою abort().
Процесом-зомбі називається дочірній процес в Unix-системі, що завершив своє виконання, але|та| ще присутній в списку процесів ОС, щоб дати батьківському процесу рахувати код завершення.
Процес стає «зомбі» при своєму завершенні: він звільняє|визволяє| всі свої ресурси (за винятком PID) і стає порожнім|пустим| записом в таблиці процесів, що зберігає код завершення для батьківського процесу. Батьківський процес інформується системою про завершення дочірнього за допомогою сигналу SIGCHLD, передбачається|припускається|, що після|потім| його отримання|здобуття| він рахує код повернення за допомогою системного виклику wait(), який блокує батьківський процес до тих пір, поки не буде завершений дочірній або не відбудеться помилка, після чого, запис «зомбі» буде видалений|віддалений| із|із| списку процесів. Проте|однак| програми часто ігнорують SIGCHLD (але|та| ігнорується за умовчанням), із-за чого «зомбі» залишаються до завершення батьківського процесу. Тому хорошим|добрим| стилем програмування вважається|лічиться| завжди обробляти SIGCHLD.
Створення процесу, отримання id процесу и його батька
pid_t pid1;
printf("It is parent process id = %d \n", (int)getpid());
pid1 = fork();
if (pid1 < 0)
{
printf("Error process not created \n");
exit(0);
}
if (pid1!=0)
{
wait(&child_status);
if (WIFEXITED(child_status))
printf("Процесс завершил работу нормально с кодом %d\n", WEXITSTATUS(child_status));
else
printf("Процесс завершил работу не нормально с кодом %d\n", WTERMSIG(child_status));
}
else
printf("Child process with id = %d \n his father %d \n", (int)getpid(), (int)getppid());