69303

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

Лекция

Информатика, кибернетика и программирование

Створення процесів Базові принципи створення процесів Процеси можуть створюватися ядром системи під час її ініціалізації. Таке створення процесів однак є винятком а не правилом. Найчастіше процеси створюються під час виконання інших процесів.

Украинкский

2014-10-03

50.5 KB

12 чел.

Лекція № 7

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

План

  1.  Створення процесів
  2.  Ієрархія процесів
  3.  Керування адресним простором під час створення процесів
  4.  Особливості завершення процесів
  5.  Синхронне і асинхронне виконання процесів
  6.  Створення і завершення потоків

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

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

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

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

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

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

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

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

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

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

Ієрархія процесів

Після того як процес-предок створив процес-нащадок, потрібно забезпечити їхній взаємозв'язок. Є різні варіанти розв'язання цього завдання.

Можна організувати на рівні ОС однозначний зв'язок «предок-нащадок» так, щоб для кожного процесу завжди можна було визначити його предка. Наприклад, якщо процеси визначені унікальними ідентифікаторами, то для реалізації цього підходу в керуючому блоці процесу-нащадка повинен завжди зберігатися ідентифікатор процесу-предка або посилання на його керуючий блок.

Таким чином формується ієрархія (дерево) процесів, оскільки нащадки можуть у свою чергу створювати нових нащадків і т. ін. У таких системах звичайно існує спеціальний вихідний процес (в UNIX-системах його називають і пі t), з якого починається побудова дерева процесів (його запускає ядро системи). Якщо предок завершить виконання процесу перед своїм нащадком, функції предка бере на себе вихідний процес.

З іншого боку, зв'язок «предок-нащадок» можна не реалізовувати на рівні ОС. При цьому всі процеси виявляються рівноправними. Якщо зв'язок «предок-нащадок» для конкретної пари процесів все ж таки потрібен, за його підтримку відповідають самі процеси (процес-предок, наприклад, може сам зберегти свій ідентифікатор у структурі даних нащадка у разі його створення).

Взаємозв'язок між процесами не обмежується лише відношеннями «предок-нащадок». Наприклад, у деяких ОС є поняття сесії (session). Така сесія поєднує всі процеси, створені користувачем за час інтерактивного сеансу його роботи із системою.

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

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

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

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

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

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

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

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

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

Можна виділити два етапи виконання такого системного виклику:

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

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

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

Особливості завершення процесів

Розглянемо три варіанти завершення процесів.

Процес коректно завершується самостійно після виконання своєї задачі (для інтерактивних процесів це нерідко відбувається з ініціативи користувача, який, приміром, скористався відповідним пунктом меню). Для цього код процесу має виконати системний виклик завершення процесу. Такий виклик у POSIX-системах називають _exit(). Він може повернути процесу, що його викликав, або ОС код повернення, який дає змогу оцінити результат виконання процесу.

Процес аварійно завершується через помилку. Такий вихід може бути передбачений програмістом (під час обробки помилки приймається рішення про те, що далі продовжувати виконання програми неможливо), а може бути наслідком генерування переривання (ділення на нуль, доступу до захищеної області пам'яті тощо).

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

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

Синхронне й асинхронне виконання процесів

Коли у системі з'являється новий процес, для старого процесу є два основних варіанти дій:

продовжити виконання паралельно з новим процесом — такий режим роботи називають асинхронним виконанням;

призупинити виконання доти, поки новий процес не буде завершений, - такий режим роботи називають синхронним виконанням. (У цьому разі використовують спеціальний системний виклик, який у POSIX-системах називають waitO.)

Вибір того чи іншого режиму залежить від конкретної задачі. Так, наприклад, веб-сервер може створювати процеси-нащадки для обробки запитів (якщо наявного набору нащадків недостатньо для такої обробки). У цьому разі обробка має бути асинхронною, бо відразу після створення нащадка предок має бути готовий до отримання наступного запиту. З іншого боку, компілятор С під час запуску процесів, що відповідають етапам компіляції, має чекати завершення кожного етапу, перш ніж перейти до наступного, — у такому разі використовують синхронну обробку.

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

Особливості створення потоків

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

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

Можна створювати потоки з коду користувача за допомогою відповідного системного виклику.

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

Під час створення потоку система повинна виконати такі дії.

  1.  Створити структури даних, які відображають потік в ОС.
  2.  Виділити пам'ять під стек потоку.

3. Встановити лічильник команд процесора на початок коду, який буде виконуватися в потоці; цей код називають процедурою або функцією потоку, покажчик на таку процедуру передають у системний виклик створення потоку. Слід відзначити, що під час створення потоків, на відміну від створення процесів немає необхідності виділяти нову пам'ять під адресний простір, тому зазвичай потоки створюються швидше і з меншими затратами ресурсів.

Локальні змінні функції потоку розташовані у стеку потоку і доступні лише його коду, глобальні змінні доступні всім потокам.

Особливості завершення потоків

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

Як і процеси, потоки можуть виконуватися синхронно й асинхронно. Потік, створивши інший потік, може призупинити своє виконання до його завершення. Таке очікування називають приєднанням потоків (thread joining, очікує той, хто приєднує). Після завершення приєднаного потоку потік, який очікував його завершення, може дістати статус виконання. Під час створення потоку можна визначити, чи підлягає він приєднанню (якщо потік не можна приєднати, його називають від'єднаним - detached). Якщо потік не є від'єднаним (nondetached або joinable, такий потік називатимемо приєднуваним), після завершення його обов'язково потрібно приєднувати, щоб уникнути витікання пам'яті.

Дамо деякі рекомендації щодо розробки багатопотокових програм.

Не можна визначати порядок виконання потоків, не подбавши про його підтримку, тому що швидкість виконання потоків залежить від багатьох факторів, більшість із яких програміст не контролює. Наприклад, якщо запустити набір потоків усередині функції f () і не приєднати всі ці потоки до завершення f(), деякі з них можуть не встигнути завершити своє виконання до моменту виходу з f (). Можливо навіть, що частина потоків не завершиться й до моменту наступного виклику функції, якщо програміст виконає його достатньо швидко.

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

Стек потоку очищається після виходу із функції потоку. Щоб цьому запобігти, не слід, наприклад, передавати нікуди покажчики на локальні змінні такої функції. Якщо необхідні змінні, значення яких мають зберігатися між викликами функції потоку, але при цьому вони не будуть доступні іншим потокам, треба скористатися локальною пам'яттю потоку (Thread Local Storage, TLS) — певним чином організованими даними, доступ до яких здійснюється за допомогою спеціальних функцій.

Питання для самоконтролю:

1. Поняття предок і нащадок.

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

3. Ієрархія процесів.

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

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

6. Варіанти завершення процесів.

7. Синхронне і асинхронне виконання процесів.

8.Особливості створення потоків.

9. Особливості завершення потоків.


 

А также другие работы, которые могут Вас заинтересовать

40149. ИНФОРМАЦИЯ В НЕПРЕРЫВНЫХ СООБЩЕНИЯХ 1.23 MB
  Представляет интерес определить собственное количество информации заключённое в непрерывном сообщении с тех же позиций что и для дискретного сообщения то есть с использованием понятия энтропии. Замену непрерывной функции времени можно осуществить последовательностью дискретов на основании теоремы Котельникова согласно которой если отсчёты непрерывного сообщения взять через интервал t=1 2Fc где Fc максимальная частота спектра реализации xt то непрерывная функция xt на интервале времени наблюдения [0T] эквивалентна...
40150. ПРОПУСКНАЯ СПОСОБНОСТЬ КАНАЛА СВЯЗИ 1.03 MB
  Рассматривая появление символа алфавита как реализацию случайной величины можно найти энтропию сообщения на входе канала связи 3. Пусть в канале связи отсутствуют помехи. Пусть в канале связи действуют помехи рис.
40151. ОСНОВЫ ТЕОРИИ КОДИРОВАНИЯ ИНФОРМАЦИИ 87.5 KB
  Кодирование линии связи заключается в преобразовании закодированного сообщения при котором обеспечивается возможность надежной синхронизации и минимум искажений при трансляции сообщения через линию связи среду передачи информации при этом число исходных комбинаций равно числу закодированных. В теоретическом плане эта возможность основывается на наличии избыточности сообщения. Под избыточностью сообщения понимают разность между максимально возможной и реальной энтропией . Максимально возможная энтропия определяется для случая когда...
40152. ПОМЕХОУСТОЙЧИВОЕ КОДИРОВАНИЕ. КЛАССИФИКАЦИЯ КОДОВ 146 KB
  По длине кодов и взаимному расположению в них символов различают равномерные и неравномерные коды. Неравномерные коды отличаются тем что кодовые комбинации у них отличаются друг от друга не только взаимным расположением символов но и их количеством при минимизации средней длины кодовой последовательности. Очевидно что средняя длина неравномерного кода будет минимизироваться тогда когда с более вероятными сообщениями источника будут сопоставляться более короткие комбинации канальных символов. Тем самым создается возможность обнаружения и...
40153. МОДУЛЯЦИЯ СИГНАЛОВ 143.5 KB
  В современных цифровых системах связи радиолокации радионавигации и радиотелеуправления также применяются различные виды импульсной модуляции.2 Радиосигналы с амплитудной модуляцией При АМ амплитуда несущего колебания меняется в такт передаваемому сообщению st Тогда общее выражение для АМ сигнала будет иметь вид: где амплитуда в отсутствии модуляции; угловая круговая частота; начальная фаза; безразмерный коэффициент пропорциональности; модулирующий сигнал. Рассмотрим простейший вид амплитудной модуляции ...
40154. РАДИОПЕРЕДАЮЩИЕ И РАДИОПРИЕМНЫЕ УСТРОЙСТВА 44.5 KB
  Назначение классификация и основные параметры Радиопередающие устройства радиопередатчики предназначены для формирования колебаний несущей частоты; модуляции их по закону передаваемого сообщения и излучения полученного радиосигнала в пространство или передачи его по физическим линиям связи. Нестабильность частоты несущих колебаний. Абсолютной нестабильностью частоты называется отклонение частоты f излучаемого радиопередатчиком сигнала от номинального значения частоты fном. Относительной нестабильностью частоты называется отношение...
40155. Основы радиоэлектроники и связи 78 KB
  В ней рассматриваются способы математического представления сообщений сигналов и помех методы формирования и преобразования сигналов в электрических цепях вопросы анализа помехоустойчивости и оптимального приема сообщений основы теории информации и кодирования. Знания полученные в результате изучения дисциплины являются базой для глубокого усвоения материала по существующим и перспективным методам передачи информации сравнительному анализу этих методов и выявлению наиболее рациональных способов повышения эффективности радиоэлектронных...
40156. ОБЩИЕ СВЕДЕНИЯ О РАДИОТЕХНИЧЕСКИХ СИГНАЛАХ И ПОМЕХАХ 1.75 MB
  Импульсный сигнал это сигнал конечной энергии существенно отличный от нуля в течение ограниченного интервала времени соизмеримого со временем завершения переходного процесса в системе для воздействия на которую этот сигнал предназначен. Конкретный вид случайного процесса который наблюдается во время опыта например на осциллографе называется реализацией этого случайного процесса. Примером такого процесса является процесс характеризующий состояние системы массового обслуживания когда система скачком в произвольные моменты времени t...
40157. ОСНОВНЫЕ ХАРАКТЕРИСТИКИ И СТАТИСТИЧЕСКИЕ МОДЕЛИ СЛУЧАЙНЫХ СИГНАЛОВ И ПОМЕХ 2.32 MB
  Для стационарного случайного процесса двумерная плотность вероятности и соответственно корреляционная функция зависят не от t1 и t2 в отдельности а только от их разности = t2 t1. В соответствии с этим корреляционная функция стационарного процесса определяется выражением 3.1 где математическое ожидание стационарного процесса; х1 х2 возможные значения случайного процесса соответственно в моменты времени t1 t2 ; = t2 t1 интервал времени между сечениями; двумерная...