Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СПОС_Конспект.doc
Скачиваний:
39
Добавлен:
02.05.2019
Размер:
1.13 Mб
Скачать

3.4 Створення і завершення процесів і потоків

Засоби створення і завершення процесів дають змогу динамічно змінювати в операційній системі набір застосувань, що виконуються. Засоби створення і завершення потоків є основою для створення багатопотокових програм.

Образ процесу

Адресний простір

Рис.3 2 Образи процесу і його потоків

3.4.1 Створення процесів

Базові принципи створення процесів

Процеси можуть створюватись ядром системи під час її ініціалізацїї. Наприклад, в UNIX-сумісних системахтаким процесом може бути процес ініціалізації системи init, у Windows XP – процеси підсистем середовища (Win32 або POSIX). Таке створення процесі, однак, є винятком, а не правилом.

Найчастіше процеси створюються під час виконання інших процесів.У цьому разі процес, який створює інший процес, називають предком, а створений ним процес – нащадком.

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

безпосередньо за запитом користувача (наприклад, з командного інтерпретатора, графічної оболонки або файлового менеджера).

Інтерактивні та фонові процеси

Розрізняють два типи фонових процесів з погляду їхньої взаємодії з користувачем.

  • Інтерактивні процеси взаємодіють із користувачами безпосередньо, приймаючи від них дані, введені за допомогою клавіатури, миші тощо. Прикладом інтерактивного процесу може бути процес текстового редактора або інтегрованого середовища розробки.

  • Фонові процеси із користувачем не взаємодіють безпосередньо. Зазвичай вони запускаються під час старту системи і чекають на запити від інших застосувань. Деякі з них (системні процеси) підтримують функціонування системи (реалізують фонове друкування, мережні засоби тощо), інші виклнують спеціалізовані задачі (реалізують веб-сервери, сервери баз даних тощо).фонові процеси також називають службами (services, у системах лінії windows XP) або демонами (daemons, в UNIX).

3.4.2 Керування адресним простором під час створення процесів

Оскільки основним елементом процесу є захищений адресний простір, дуже важливо вирішити проблему його розподілу під час створення нового процесу. Розглянемо два різні підходи.

Системні виклики fork() exec()

У першому підході адресний простір нащадка створюють як точну копію адресного простору предка. Така операція реалізована системним викликом, який у POSIX-системах називають fork().

У цьому разі копіюється не тільки адресний простір, а й лічильник команд головного потоку процесу, тому після виклику fork() предок і нащадок виконуватимуть ту саму інструкцію. Розробник має визначити, у

якому з двох процесів перебуває керування. Це можна зробити на підставі відмінностей між кодами повернення fork() для предка і нащадка.

Коли створення нового процесу відбувається шляхом дублювання адресного простору предка, виникає потреба у спеціальних засобах завантаження програмного коду в адресний простір процесу. Такі засоби реалізує системний виклик, який у POSIX-системах називають exec(). Як параметр для виклику exec() треба вказувати весь шлях до виконуваного файла програми, який буде завантажено у пам’ять.

У системах із підтримкою fork() для того щоб запускати на виконання програми, після виклику fork() потрібно негайно викликати exec() (це називають технологією fork+exec).

Запуск застосування одним системним викликом

Другий підхід не розділяє дублювання адресного простору і завантаження коду – ці етапи тут поєднані в один. У даному разі системний виклик запускає на виконання задане застосування (зазвичай для цього йому потрібно вказати весь шлях до виконуваного файла цього застосування). Можна виділити два етапи виконання такого системного виклику:

  • виділення пам’яті під адресний простір нового процесу (жодна інформація при цьому з адресного простору предка не копіюється).

  • Завантаження виконуваного коду із зазначеного файла у виділений адресний простір.

Підхід із використанням fork() і exec() є гнучкішим, бо він дає змогу в разі необхідності обмежитись якимось одним етапом запуску застосування. Сучасні ОС переважно реалізують комбінацію першого та другого підходів.