- •Тема 2.1 Базові поняття процесів і потоків
- •2.1.1 Процеси і потоки в сучасних ос
- •Моделі процесів і потоків
- •2.1.3 Складові елементи процесів і потоків
- •Тема 2.2 Багатопотоковість та її реалізація
- •2.2.1 Поняття паралелізму
- •Види паралелізму
- •Переваги і недоліки багато потоковості
- •2.2.4 Способи реалізації моделі потоків
- •2.3 Тема Стани процесів
- •2.3.1 Стан процесу
- •2.3.2 Двох -станова модель процесу
- •2.3.3 Пяти-станова модель процесу
- •2.3.4 Процес та його життєвий цикл
- •2.4.1 Керуючі блоки процесів і потоків
- •2.4.2 Образи процесу і потоку.
- •2.5 Тема Перемикання контексту й обробка переривань
- •2.5.1Організація перемикання контексту
- •2.5.2 Обробка переривань
- •2.6 Тема Створення і завершення процесів і потоків
- •2.6.1 Створення процесів
- •2.6.2 Ієрархія процесів
- •2.6.3 Керування адресним простором під час створення процесів
- •2.6.4 Особливості завершення процесів
- •2.6.5 Створення і завершення потоків
- •2.7 Тема Мультипроцесування
- •2.7.1 Підходи реалізації мультипроцесування.
- •7.2.2 Види комп’ютерних систем з використанням декількох центральних процесорів
- •2.8 Тема Види міжпроцесової взаємодії
- •2.8.1.Проблеми міжпроцесової взаємодії
- •2.8.2 Види міжпроцесової взаємодії.
- •2.8.3 Особливості міжпроцесової взаємодії.
- •2.9 Тема Базові механізми міжпроцесової взаємодії
- •2.9.1 Міжпроцесова взаємодія на базі спільної пам'яті.
- •2.9.2 Основи передавання повідомлень.
- •2.10 Тема Керування процесами у Windows xp
- •2.10.1 Складові елементи процесу
- •2.10.2 Структури даних процесу
- •2.10.3 Створення процесів
- •2.10.4.Завершення процесів
- •2.10.5 Програмний інтерфейс керування процесами Win32 арі
- •2.11 Тема Керування потоками у Windows xp
- •2.11.1 Складові елементи потоку
- •2.11.2 Структури даних потоку
- •2.11.3 Створення потоків
- •2.11.4 Особливості програмного інтерфейсу потоків
- •2.11.5 Завершення потоків у Win32 api
- •2.12 Тема Керування процесами та потоками в unix і Linux
- •2.12.1 Керування процесами в unix і Linux
- •Керування потоками в Linux
2.6.3 Керування адресним простором під час створення процесів
Оскільки основним елементом процесу є захищений адресний простір, дуже важливо вирішити проблему його розподілу під час створення нового процесу. Розглянемо два різні підходи.
Системні виклики fork() і ехес()
У першому підході адресний простір нащадка створюють як точну копію адресного простору предка. Така операція реалізована системним викликом, який у POSIX-системах називають fork().У цьому разі копіюється не тільки адресний простір, а й лічильник команд головного потоку процесу, тому після виклику fork() предок і нащадок виконуватимуть ту саму інструкцію. Розробник має визначити, у якому з двох процесів перебуває керування. Це можна зробити на підставі відмінностей між кодами повернення fork() для предка і нащадка.
Коли створення нового процесу відбувається шляхом дублювання адресного простору предка, виникає потреба у спеціальних засобах для завантаження програмного коду в адресний простір процесу. Такі засоби реалізує системний виклик, який у POSIX-системах називають ехес(). Як параметр для виклику ехес() треба вказувати весь шлях до виконуваного файла програми, який буде завантажено у пам'ять.
У системах із підтримкою fork() для того щоб запускати на виконання програми, після виклику fork() потрібно негайно викликати exec() (це називають технологією fork+exec).
Запуск застосування одним системним викликом
Другий підхід не розділяє дублювання адресного простору і завантаження коду — ці етапи тут поєднані в один. У даному разі системний виклик запускає на виконання задане застосування (зазвичай для цього йому потрібно вказати весь шлях до виконуваного файла цього застосування). Можна виділити два етапи виконання такого системного виклику:
виділення пам'яті під адресний простір нового процесу (жодна інформація при цьому з адресного простору предка не копіюється);
завантаження виконуваного коду із зазначеного файла у виділений адресний простір.
Підхід із використанням fork() і ехес() є гнучкішим, бо він дає змогу в разі необхідності обмежитись якимось одним етапом запуску застосування. Сучасні ОС переважно реалізують деяку комбінацію першого та другого підходів.
Технологія копіювання під час запису
Якщо під час створення процесу за допомогою виклику fork() щоразу завчасно виділяти пам'ять і копіювати в неї дані адресного простору предка (стек, область глобальних змінних, програмний код), то це буде доволі трудомістким завданням, особливо для процесів, що займають багато місця в пам'яті.
Для розв'язання цієї проблеми в сучасних ОС використовують технологію копіювання під час запису (copy-on-write). При цьому під час виклику fork() дані з пам'яті предка у пам'ять нащадка не копіюють, натомість відповідні ділянки пам'яті відображають в адресний простір — як нащадка, так і предка, але при цьому позначають їх як захищені від запису.
Як тільки нащадок або предок спробує змінити якусь із названих вище ділянок пам'яті, тобто щось записати у неї, виникає апаратне переривання. Система реагує на нього, виділяє пам'ять під нову область, відкриту для запису відповідному процесу, і змінює адресний простір для обох процесів (наприклад, для другого процесу відповідна ділянка пам'яті відкривається для запису). Слід зазначити, що в разі використання цієї технології ділянки пам'яті, які не змінюються (наприклад, ті, що містять код програми), можуть взагалі ніколи не копіюватися.
У багатьох сучасних системах копіювання під час запису є основною технологією керування адресним простором у разі створення процесів.
