Fork (розгалуження, виникнення паралельних процесів) i Join (об’єднання)

Конструкції fork i j oin ( які в операційній системі Unix відомі як fork i wait) належать до найперших паралельних мовних конструкцій (рис.Б.2).

В операційній системі Unix є можливість запускати паралельні процеси за допомогою операції fork, а закінчення їх чекати операцією wait. На відміну від співпрограм мова йде про приклад істинно паралельних процесів, що можуть за браком паралельних апаратних pecypciв оброблятись на одному процесорі в мультизадачному режимі з дискретним розподілом часу. У цьому способі паралельного програмування об’єднано дві принципово різні концепції: декларування паралельних процесів i синхронізація npoцeciв. Оскільки йдеться про концептуально різні задачі, було б доцільніше, з огляду на основи програмної інженерії, щоб вони були чітко розділені в мові програмування введенням різних мовних конструктивів.

У системі Unix виклик операції fork функціонує не так наочно, як показано на рис. Б.2. Замість цього виготовляється ідентична копія процесу, що викликається, i вона виконується паралельно йому. Змінні величини та стартова величина програмного лічильника нового процесу такі самі, як у вихідному npoцeci. Єдина можливість відрізнити ці процеси (які з них - процеси-батьки, а які процесори - діти), полягає в тому, що fork операція видає ідентифікаційний номер, який треба оцінити. Його величина для процесів-дітей дорівнює нулю, а у процесів-батьків він збігається з ідентифікаційним номером процесів в ОС Unix (число, що завжди відрізняється від нуля). Такий cпociб організації процесів не відповідає проблематиці програмування, що ставить за мету побудову зрозумілих, зручних для читання та перегляду програм.

Щоб все ж таки запустити іншу програму i чекати на її закінчення, можна обидві системні Unix-процедури виклику сконструювати мовою програмування С таким чином:

int status;

if (fork()==0) execlp("program_B",...); /* процес-дитя */

wait (&status); /* процес-дитя */

Виклик операції fork видає для батьківського процесу номер процесу-дитини як зворотній зв'язок (тут fork() не є нулем), у той час як для процесу-дитини видається величина нуль; тим самим гарантується, що процес-дитина звичайно виконує нову програму операцією execlp i це не є текстом батьківського коду. Одночасно батьківський процес виконує наступні інструкції паралельно процесу-дитині. Батьківський процес може чекати закінчення процесу-дитини операцією wait; параметр зворотного зв'язку містить статус закінчення процесу-дитини.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: