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


Семафор– це змінна спеціального типу, яка доступна паралельним процесам для виконання двох операцій: зайнято (P - операція); відкрито (V – операція). Семафор відіграє роль допоміжного критичного ресурсу і операції V та P є нероздільними. Крім того P і V виключають одна іншу.

Семафори працюють таки чином, що спочатку аналізують стан критичного ресурсу, який ідентифікується станом семафору, потім здійснюється допуск до критичного ресурсу або відмова від нього. При відмові в доступі до критичного ресурсу використовується режим пасивного очікування. В цьому випадку процес знаходиться в заблокованому стані. Він не перевіряє семафор безперервно, як у стані активного очікування. В той час процес може виконувати необхідну дію. Допустимими значеннями семафору є тільки цілі числа. Семафори бувають двійкові (приймають значення 0, 1), або n – значення (в іншому випадку).

Приклад:

var S: semaphore

begin

init Sem(S, 1)

parbegin

PR1: while true do

begin

P(S)

CS1

V(S)

end

and

PR2: while true do

begin

P(S)

CS2

V(S)

end

parend

 

Семафор S має початкове значення 1. Якщо процеси PR1, PR2 будуть намагатися виконати операцію P(S), то це зробить успішно тільки один процес. Якщо це зробив процес PR2, тоді він закриває семафор S, після чого виконується його критичний інтервал. Процес PR1 в цій ситуації буде заблокований на семафорі S. Після виконання операції V(S) процесу PR2 семафор S відкривається, показуючи можливість використання одного сумісного ресурсу. Цією операцією процес PR1 буде переведений із заблокованого стану в стан готовності.

Вирішення задачі “виробник – споживач” за допомогою семафорів.

Для вирішення цієї задачі розподілювальними змінними є лічильники вільних та зайнятих буферів пам’яті, які повинні бути захищені зі сторони обох процесів. Тобто дії по відправленні і отриманні повідомлень повинні бути синхронізовані. Семафори S – free, S – fil – в даному випадку є числовими, семафор S – exp – двійковим.

Приклад.

var S-free, S-fil, S-exp: semaphore;

begin

InitSem (s-free, N);

InitSem (s-fil, 0);

InitSem (s-exp, 1);

parbegin

PROCEDURE: while true do

begin

{підготовка повідомлень}

P(S-free);

P(S-fil);

{послати повідомлення}

V(S-fil);

V(f-exp);

end;

and

CONSUMER: while true do

P(S-fil);

P(S-exp);

{отримати повідомлення}

V(S-free);

V(S-exp);

{обробка повідомлень}

parend

end

 

Семафори S – free, S – fil використовуються як лічильники вільних та зайнятих областей пам’яті (буферів) відповідно. Двійковий семафор S – exp призначений для гарантії того, що в кожен момент часу тільки один процес може працювати зі своїм критичним ресурсом в своїй критичній секції. В початковий момент часу ініціалізація семафорів лічильників відбувається таким чином, що кількість вільних буферів S – free – n, кількість зайнятих = 0.

Операція P(S – free) зменшує значення S - free на одиницю. Операція V(S – free) збільшує значення лічильника S - free на одиницю.

Перед відправою повідомлення процес виробник зменшує значення S – fil на одиницю, а після відправки повідомлення збільшує значення S – fil на одиницю. Так само перед отриманням повідомленням процес споживач зменшує значення S – fil на одиницю шляхом виконання операції P(S – fil), а після отримання повідомлення збільшує значення семафору S – free в результаті виконання операції V(S – free).

 

Вирішення задачі читачів – письменників за допомогою семафорів – самостійно!



Дата добавления: 2016-07-27; просмотров: 2599;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.008 сек.