- •Файловые системы
- •Понятие процессов в ос образ процесса
- •Распределенная память или общая память
- •Именованные/Неименованные каналы
- •Программный поток. Понятие и использование
- •Сегментная и страничная организация памяти. Виртуальная память
- •Сокеты tcp и udp
- •Объекты синхронизации
- •Состояние процессов
- •Принципы завершения процессов
Понятие процессов в ос образ процесса
Ядро являє собою якусь програму, яка є резидентом і обслуговує всі таблиці, які використовуються для управління ресурсами і процесами комп'ютера.
Насправді операційна система тільки управляє чином процесу або сегментами коду і даних, що визначають середовище виконання, а не самим процесом. Сегмент коду містить реальні інструкції центрального процесора, до яких входять як рядки, написані і скомпільовані користувачем, так і код, згенерований системою, що забезпечує взаємодію між програмою і операційною системою. Дані пов'язані з процесом, теж є частиною образу процесу, деякі з яких зберігаються в регістрах [регістри це області пам'яті, до яких центральний процесор може оперативно отримувати доступ]. Для прискорення доступу регістри зберігаються всередині центрального процесора.
Для оперативного зберігання робочих даних існує динамічна область пам'яті / купа [heap] /. Ця пам'ять виділяється динамічно та використання її від процесу до процесу змінюється. За допомогою купи програміст може надати процесу додаткову пам'ять.
Автоматично, при запуску програми, змінні розміщуються в стеку [стек служить сховищем для тимчасового зберігання змінних і адрес повернення з процедур]. Зазвичай при виконанні або в режимі очікування виконання процеси знаходяться в оперативній пам'яті комп'ютера. Досить велика її частина резервується ядром операційної системи, і тільки до залишилася її частини можуть отримати доступ користувачі. Одночасно в оперативній пам'яті може знаходиться декілька процесів. Пам'ять, яка використовується процесором, розбивається на сегменти, звані сторінками / page /. Кожна сторінка має певний розмір, який фіксує операційна система залежно від типу комп'ютера. Якщо всі сторінки використовуються і виникає потреба в новій сторінці, то та сторінка яка використовується менше за інших поміщається в область підкачки / swap area /, а на її місці створюється нова. Але якщо область підкачки не була визначена, то за допомогою спеціальних команд можна розмістити область підкачки у файлі. Але є такі сторінки які завжди повинні знаходиться в оперативній пам'яті, які називаються витісняє / nonpreemptable pages /. Зазвичай такі сторінки використовуються ядром, або програмами підкачки. Головна особливість в посторінково використанні пам'яті полягає в тому, що процес може використовувати більше пам'яті, ніж є насправді.
Процеси можуть функціонувати в двох режимах: системному і користувача. Робота в системному режимі означає виконання процесом системних викликів. Він найбільш важливий, тому що в ньому виконується обробка переривань, викликаних зовнішніми сигналами і системними викликами, а також управлінням доступом до диска, розподіл додаткової динамічної пам'яті та інших ресурсів системи. Процес функціонує в режимі користувача, коли виконується код, заданий користувачем.
Для кожного процесу створюється свій блок управління, що міститься у системну таблицю процесів, що знаходяться в ядрі. Ця таблиця є масив структур блоків управління процесами. У кожному блоці містяться дані:
слово стану процесу
пріоритет
величина кванта часу, виділеного системним планувальником
ступінь використання системним процесором
ознака диспетчеризації
ідентифікатор користувача, якому належить процес
ефективний ідентифікатор користувача
реальний і ефективний ідентифікатори групи
група процесу
код процесу і ідентифікатор батьківського процесу
розмір образу, що розміщується в області підкачки
розмір сегментів коду і даних
масив сигналів, які очікують обробки.
Щоб система функціонувала належним чином, ядру необхідно відстежувати всі ці дані.
Створення процесу. Процес породжується за допомогою системного виклику fork (). При цьому виклику відбувається перевірка на наявність вільної пам'яті, доступний для розміщення нового процесу. Якщо Вашої пам'ять доступна, то створюється процес-нащадок поточного процесу, що представляє собою точну копію викликає процесу. При цьому в таблиці процесів для нового процесу будується відповідна структура. Нова структура створюється також у таблиці користувача. При цьому всі її змінні ініціалізувалися нулями. Цьому процесу присвоюється новий унікальний ідентифікатор, а ідентифікатор батьківського процесу запам'ятовується в блоці керування процесом.
Ви скажете: все це чудово, але якщо новий процес - завжди копія існуючого, то яким чином в системі працюють різні програми? І звідки береться найперша з них?
Процеси, що виконують різні програми, утворюються завдяки застосуванню наявних в стандартній бібліотеці Unix функцій "сімейства exec": execl, execlp, execle, execv, execve, execvp. Ці функції відрізняються форматом виклику, але в кінцевому підсумку роблять одну й ту ж річ: заміщають всередині поточного процесу виконуваний код на код, що міститься у вказаному файлі. Файл може бути не тільки двійковим виконуваним файлом Linux, а й скриптом командного інтерпретатора, і двійковим файлом іншого формату [наприклад, класом java, виконуваним файлом DOS]
Таким чином, операція запуску програми, яка в DOS і Windows виконується як єдине ціле, в Linux [і в Unix взагалі] розділена на дві: спочатку здійснюється запуск, а потім визначається, яка програма буде працювати. Чи є в цьому сенс і чи не дуже великі накладні витрати? Адже створення копії процесу передбачає копіювання дуже значного обсягу інформації.
Сенс у даному підході безумовно є. Дуже часто програма повинна зробити деякі дії ще до того, як почнеться власне її виконання. Наприклад, створити неіменовані канал для спілкування з іншими процесами. Такі канали створюються системним викликом pipe, мова про яку піде нижче. Реалізується це дуже просто - спочатку "відокремлюються" процеси, потім проробляються необхідні операції / виклик pipe () / і тільки після цього викликаний exec.
Аналогічного результату [як показує, зокрема, приклад Windows NT] можна було б досягти і при запуску програми за один крок, але більш складним шляхом. Що ж до накладних витрат, то вони найчастіше виявляються пренебрежимо малими: при створенні копії процесу його індивідуальні дані фізично нікуди не копіюються. Замість цього використовується техніка, відома під назвою copy-on-write / копіювання при записі /: сторінки даних обох процесів особливим чином позначаються, і тільки тоді, коли один процес намагається змінити вміст будь-якої своєї сторінки, вона дублюється.
Завершення процесу. Для завершення процесу використовується системний виклик exit (), при якому звільняються усі використовувані ресурси, такі як пам'ять і структури таблиць ядра. Крім того, завершуються і процес-нащадки, породжені даним процесом.
Потім з пам'яті видаляються сегменти коду і даних, а сам процес переходить у стан зомбі [в поле Stat такі процеси позначаються буквою "Z". Зомбі не займає процесорного часу, але рядок у таблиці процесів залишається, і відповідні структури ядра не звільняються. Після завершення батьківського процесу "осиротілий" зомбі на короткий час стає нащадком init, після чого вже "остаточно вмирає"]. І, нарешті, батьківський процес повинен очистити всі ресурси, які займає дочірніми процесами.
Якщо батьківський процес з якоїсь причини завершиться раніше дочірнього, останній стає "сиротою" / orphaned process /. Такі "Сироти" також автоматично "усиновлюються" програмою init, що виконується в процесі з номером 1, яка і приймає сигнал про їх завершенні.
Також, процес може впасти в "сон", який не вдається перервати: у полі Stat це позначається буквою "D". Процес, що знаходиться в такому стані, не реагує на системні запити і може бути знищений тільки перезавантаженням системи.
Взаємодія процесів. Найпоширенішим засобом взаємодії процесів є сокети / sockets /. Програми підключаються до сокета і видають запит на прив'язку до потрібною адресою. Потім дані передаються від одного сокета до іншого відповідно з вказаною адресою.
Сигнал інформує інший процес про виникнення певних умов всередині поточного процесу, що вимагають реакції поточного процесу. Багато програм обробки сигналів для аналізу проблеми, що виникла виводять дамп пам'яті.
Канали реалізовані в двох класах. Перший з них створюється за допомогою системного виклику pipe (). При цьому для обміну інформацією між процесами ініціалізується спеціальна структура в ядрі. Зухвалому процесу два дескриптора файлу, один - для читання, а інший для запису інформації. Потім, коли процес породжує новий процес, між двома процесами відкривається комунікаційний канал. Іншим типом каналів є іменовані канали. При їх використанні з керуючою структурою у ядрі зв'язується спеціальний каталог, через який два автономних процесу можуть обмінюватися даними. При цьому, кожен процес має відкрити канал у вигляді звичайних файлів [один - для читання, інший - для запису]. Потім операції введення / виводу виконуються звичайним чином.
Черга повідомлень є механізм, коли один процес надає блок даних з встановленими прапорами, а інший процес розшукує блок даних, прапори якого встановлені в необхідних значеннях.
Семафори є засіб передачі прапорів від одного процесу до іншого. "Піднявши" семафор, процес може повідомити, що він перебуває в певному стані. Будь-який інший процес в системі може відшукати цей прапор і виконати необхідні дії.
Спільна пам'ять дозволяє процесам отримати доступ до однієї і тієї ж галузі фізичної пам'яті.
