- •9.3. Створення процесів
- •Базові поняття процесів і потоків
- •1.1. Процеси і потоки в сучасних ос
- •1.2. Моделі процесів і потоків
- •1.3. Складові елементи процесів і потоків
- •2. Багатопотоковість та її реалізація
- •2.1. Поняття паралелізму
- •2.2. Види паралелізму
- •2.3. Переваги і недоліки багато потоковості
- •2.4. Способи реалізації моделі потоків
- •3. Стани процесів і потоків
- •4. Опис процесів і потоків
- •4.1. Керуючі блоки процесів і потоків
- •4.2. Образи процесу і потоку
- •5. Перемикання контексту й обробка переривань
- •5.1. Організація перемикання контексту
- •5.2. Обробка переривань
- •6. Створення і завершення процесів і потоків
- •6.1. Створення процесів
- •6.2. Ієрархія процесів
- •6.3. Керування адресним простором під час створення процесів
- •6.4. Особливості завершення процесів
- •6.5. Синхронне й асинхронне виконання процесів
- •6.6. Створення і завершення потоків
- •7. Керування процесами в unix і Linux
- •7.1. Образ процесу
- •7.2. Ідентифікаційна інформація та атрибути безпеки процесу
- •7.3. Керуючий блок процесу
- •7.5. Завершення процесу
- •7.7. Запуск програми
- •7.8. Очікування завершення процесу
- •7.9. Сигнали
- •8. Керування потоками в Linux
- •8.1. Базова підтримка багато потоковості
- •8.2. Особливості нової реалізації багато потоковості в ядрі Linux
- •8.3. Потоки ядра Linux
- •8.4. Програмний інтерфейс керування потоками posix
- •9. Керування процесами у Windows хр
- •9.1. Складові елементи процесу
- •9.2. Структури даних процесу
- •9.3. Створення процесів
- •9.4. Завершення процесів
- •9.5. Процеси і ресурси. Таблиця об’єктів процесу
- •9.6. Програмний інтерфейс керування процесами Win32 арі
- •10. Керування потоками у Windows хр
- •10.1. Складові елементи потоку
- •10.2. Структури даних потоку
- •10.3. Створення потоків
- •10.4. Особливості програмного інтерфейсу потоків
- •Висновки
- •Контрольні запитання та завдання
Висновки
♦ Процеси і потоки є активними ресурсами обчислювальних систем, які реалізують виконання програмного коду. Потоком називають набір послідовно виконуваних команд процесора. Процес є сукупністю одного або декількох потоків і захищеного адресного простору, в якому вони виконуються. Потоки одного процесу можуть разом використовувати спільні дані, для потоків різних процесів без використання спеціальних засобів це неможливо. У традиційних системах кожний процес міг виконувати тільки один потік, виконання програмного коду пов’язували із процесами. Сучасні ОС підтримують концепцію багатопотоковості.
♦ Використання потоків у застосуванні означає внесення в нього паралелізму — можливості одночасного виконання дій різними фрагментами коду. Паралелізм у програмах відображає асинхронний характер навколишнього світу, його джерелами є виконання коду на декількох процесорах, операції введення - виведення, взаємодія з користувачем, занити застосувань-клієнтів. Багатопотоковість у застосуваннях дає змогу природно реалізувати цей паралелізм і домогтися високої ефективності. З іншого боку, використання багатопотоковості досить складне і вимагає високої кваліфікації розробника.
♦ Розрізняють потоки користувача, які виконуються в режимі користувача в адресному просторі процесу, і потоки ядра, з якими працює ядро ОС. Взаємовідношення між ними визначають схему реалізації моделі потоків. На практиці найчастіше використовують схему 1:1, коли кожному потоку користувача відповідає один потік ядра, і саме ядро відповідає за керування потоками користувача.
♦ Потік може перебувати в різних станах (виконання, очікування, готовності тощо). Принципи переходу з одного стану в інший залежать від принципів планування потоків і планування процесорного часу. Перехід процесу зі стану виконання у будь-який інший стан зводиться до перемикання контексту — передачі керування від одного потоку до іншого зі збереженням стану процесора.
♦ Кожному процесу і потоку в системі відповідає його керуючий блок — структура даних, що містить усю необхідну інформацію. Під час створення процесу (зазвичай за допомогою системного виклику fork( )) створюють його керуючий блок, виділяють пам’ять і запускають основний потік. Створення потоку простіше і виконується швидше, оскільки не потрібно виділяти пам’ять під новий адресний простір.
Контрольні запитання та завдання
Усі практичні завдання вимагають розробки консольних застосувань, які отримують вихідні дані зі стандартного пристрою введення та подають результат на стандартний пристрій виведення з використанням засобів бібліотеки відповідної мови програмування. Для мови С такі засоби описані у заголовному файлі stdio.h, для мови C++ — у файлі iostream.
1. У чому основна перевага схеми підтримки потоків 1:1 порівняно з іншими схемами? Чому розробники ОС не відразу змогли її оцінити?
2. У яких ситуаціях під час розробки програмного забезпечення доцільніше використовувати модель процесів, а не модель потоків?
3. Для трьох станів потоків — виконання, готовності й очікування - перелічіть усі можливі переходи зі стану в стан і назвіть причини таких переходів. Скажіть також, які переходи неможливі, та поясніть чому. У якому зі станів потоки перебувають найдовше?
4. У чому полягає головний недолік реалізації таблиці процесів у вигляді масиву? Які альтернативні варіанти її реалізації можна запропонувати?
5. Скільки копій змінної var буде створено у разі виконання цього фрагмента коду? Яких значень буде надано цим копіям?
6. Якими будуть результати виконання таких двох програм?
7. Після одержання від браузера запиту веб-сервер створює новий процес для його обслуговування і продовжує очікувати наступних запитів. Розробник сервера виявив, що після обробки кожного запиту в системі залишається процес-зомбі. Дайте відповіді на такі запитання:
а) у чому причина появи такого процесу і наскільки серйозна ця проблема
з погляду витрат пам'яті?
б) як виправити код сервера, щоб процеси-зомбі не виникали?
8. Напишіть функцію, виклик якої призведе до знищення всіх процесів-зомбі, створених поточним процесом.
9. Розробіть простий командний інтерпретатор для Linux і Windows ХР. Він повинен видавати підказку (наприклад, «>»), обробляти введений користувачем командний рядок (що містить ім’я виконуваного файлу програми та її аргументи) і запускати задану програму. Асинхронний запуск здійснюють уведенням «&» як останнього символу командного рядка. У разі завершення командного рядка будь-яким іншим символом програма запускається синхронно. Інтерпретатор завершує роботу після введення рядка «exit». Виконання програм, запущених інтерпретатором, може бути перерване натисканням клавіші Ctrl+C, однак воно не повинне переривати виконання інтерпретатора. Для запуску програмного коду в Linux рекомендовано використовувати функцію execvp( ), що приймає два параметри prog і args, аналогічні до перших двох параметрів функції execve( ), і використовує змінну оточення PATH для пошуку шляху до виконуваних файлів.
10. Розробіть застосування для Linux і Windows ХР, що реалізує паралельне виконання коду двома потоками. Основний потік застосування Т створює потік t. Далі кожен із потоків виконує цикл (наприклад, до 30). На кожній ітерації циклу він збільшує значення локального лічильника на одиницю, відображає це значення з нового рядка і призупиняється на деякий час (потік Т- на час wT, потік t — wt ). Після завершення циклу потік Т приєднує t. Як залежать результати виконання цього застосування від значень wT і wt ? Як зміняться ці результати, якщо потік t не буде приєднано?
