22
Конкурентно програмиране 2005 1 Конкурентно Програмиране Средства за синхронизация Семафори. Условен критичен участък Path Expressions

Конкурентно Програмиране

  • Upload
    rufina

  • View
    97

  • Download
    6

Embed Size (px)

DESCRIPTION

Конкурентно Програмиране. Средства за синхронизация Семафори. Условен критичен участък Path Expressions. Семафори. Дефиниция. Недостатъци на решението на въпроса за взаимното изключване чрез “busy waiting” алгоритми. История: въведени от Dijkstra през 1968г. - PowerPoint PPT Presentation

Citation preview

Page 1: Конкурентно Програмиране

Конкурентно програмиране 2005 1

Конкурентно Програмиране

Средства за синхронизация

Семафори. Условен критичен участък

Path Expressions

Page 2: Конкурентно Програмиране

Конкурентно програмиране 2005 2

Семафори. ДефиницияНедостатъци на решението на въпроса за взаимното изключване чрез “busy waiting” алгоритми.

История: въведени от Dijkstra през 1968г.

Основна идея: идва от железопътните семафори, които сигнализират дали коловозът е свободен.

Предназначение: механизъм за реализиране на взаимно изключване и условна синхронизация.

Дефиниция: Целочислена променлива S, приемаща само неотрицателни стойности, за която са достъпни две операции:

P(S) – Ако S>0, то S=S-1, иначе процесът, който изпълнява операцията се блокира.

V(S) – Ако има процеси, блокирани по семафора S, то един от тях се освобождава, иначе S=S+1.

Основни свойства:

- P(S) и V(S) са атомарни операции. Никаква операция не може да се изпълни между проверката S>0 и намаляването на S или блокирането на процеса.

- S задължително получава начална стойност.

- V(S) не определя кой процес ще бъде разблокиран.

Page 3: Конкурентно Програмиране

Конкурентно програмиране 2005 3

Инварианти на семафора:

(1) S >= 0

(2) S = S0 - #P(S) + #V(S)

- S0 е началната стойност на семафора;

- #P(S) е броят на завършените операции P(S);

- #V(S) е броят на изпълнените операции V(S).

Видове семафори:

Двоичен семафор – семафор, който може да приема само две стойности: 0 и 1.

Общ семафор – семафор, който може да приема произволна неотрицателна стойност.

Решавани проблеми:

- осигуряване на КУ;

- бариерна синхронизация;

- задача Производител/Потребител;

- управление на ресурси – буфер с фиксиран капацитет.

Page 4: Конкурентно Програмиране

Конкурентно програмиране 2005 4

Двоичен семафор

Дефиниция: Целочислена променлива S, която приема само стойности 0 и 1, и за която са достъпни две атомарни операции:

P(S) – Ако S>0, то S=0, иначе процесът, който изпълнява операцията се блокира.

V(S) – Ако има процеси, блокирани по семафора S, то един от тях се освобождава, иначе S=1.

Използване на двоичен семафор:

- за реализиране на взаимно изключване;

- за условна синхронизация.

Split Binary Semaphore – двоичен семафор, разделен на няколко семафора:

Двоичните семафори S1, S2…Sn формират един SPB, ако е в сила следният инвариант:

0<=S1+S2+…+Sn<=1

SPB може да се използва за условна синхронизация, което ще бъде разгледано на примера на задачата Производител/Потребител.

Еквивалентност на двоичните и общите семафори.

Page 5: Конкурентно Програмиране

Конкурентно програмиране 2005 5

Реализация на взаимно изключване със семафор MUTEX

Използване на семафор за реализиране на КУ при ползване на общ ресурс:

С ресурса се свързва двоичен семафор S и процесите изпълняват следния протокол:

mutex=1

Process P1 while (true) { nonCriticalSection1; P.mutex; criticalSection1; V.mutex; }end P1;

Process P2 while (true) { nonCriticalSection2; P.mutex; criticalSection2; V.mutex; }end P2;

Прилики и разлики при осигуряване ва взаимното изключване в случаите на:

- протоколи, основани на “busy waiting”;

- хардуерна поддръжка;

- семафори.

Процесът, блокиран по семафор пред КУ не изпълнява никакви инструкции за проверка на това кога ще му се разреши достъп.

Page 6: Конкурентно Програмиране

Конкурентно програмиране 2005 6

В сила е следният инвариант за двоични семафори:#P(S) - #V(S) <= 1

Това следва директно от дефиницията на двоичен семафор. От тук заключаваме, че са изпълнени условията за КУ: Горният протокол удовлетворява условието за взаимно изключване.Доказателство: От вида на протокола следва, че броят на процесите, които се намират в своя критичен участък е:

#CS=#P(S) - #V(S)<=1 т.е. най много един процес може да е в своя КУ в даден момент. Не може да се получи deadlock.Доказателство: За да се получи deadlock трябва два процеса да са блокирани на операцията P(mutex), което значи mutex =0 и освен това #CS=0 за да няма кой да ги събуди. Но от това следва, че #P(S) - #V(S)=0, т.е. семафорът съдържа началната си стойност mutex =1 - противоречие.

Няма гладуване в случая на два процеса.

Доказателство: Нека процесът P1 чака на семафора mutex, следователно процесът P2 е в своя КУ, когато P2 излезе от него ще сигнализира P1, който на свой ред ще влезе в КУ.

При липса на състезание няма гладуване.

Доказателство: Липсата на състезание означава, че процесът който проверява семафора го намира свободен (mutex =1) и продължава към критичния си участък.

Page 7: Конкурентно Програмиране

Конкурентно програмиране 2005 7

Проблемът за справедливостта – свойство на прогреса:

Този проблем възниква, когато два или повече процеса чакат пред един семафор, т.е. когато се прави взаимно изключване на поне три процеса, при което е възможно гладуване.

Въз основа на семантиката семафорите могат да са: strongly fair – ако един семафор се сигнализира безкрайно често, то евентуално всеки чакащ по него процес ще получи достъп до своя КУ; weak fair – ако един семафор се установи на стойност по-голяма от 0, то евентуално всеки чакащ процес ще получи достъп до своя КУ.

Въз основа на реализацията семафорите могат да бъдат: - blocked-set – операцията V(S) събужда един (кой да е) от чакащите процеси; blocked-queue – операцията P(S) добавя нов чакащ процес на края на опашката, а V(S) разблокира процеса от началото на опашката.

При всички дефиниции е гарантирано свойството взаимно изключване. Същото се отнася за отсъствието на deadlock.

Не така стои въпросът с индивидуалното гладуване. При blocked-set семафор и наличие на поне три процеса е възможно гладуване.

Съотношение брой използвани семафори/ниво на конкурентност: При наличие на няколко общи за процесите ресурси е възможно използване на различен брой семафори за реализиране на взаимно изключване:

- единствен семафор за всички ресурси – управлението е по-просто за сметка на намалена степен на конкурентност;

- отделен семафор за всеки ресурс, даже за отделна компонента /елемент на масив, поле на запис/ - по-сложно управление за сметка на увеличена степен на конкурентност.

Page 8: Конкурентно Програмиране

Конкурентно програмиране 2005 8

Задача Производител/Потребител

Това е абстракция на проблема за комуникация на конкурентни процеси и нужната за целта условна синхронизация.

Производителят, посредством своя вътрешна операция produce произвежда данна, която трябва да бъде предадена на Потребителя.

Потребителят получава данната, която обработва в своя вътрешна операция consume.

Варианти на задачата:

- Един Производител и един Потребител:

- синхронно изпълнение;

- асинхронно изпълнение с използване на буфер за данните:

- буфер за една данна – SPB;

- буфер с капацитет >1 – условна синхронизация;

- Много Производители / много Потребители:

- буфер за една данна – SPB;

- буфер с капацитет >1 – условна синхронизация.

Page 9: Конкурентно Програмиране

Конкурентно програмиране 2005 9

При синхронната реализация на задачата Производителят, който е готов да предаде данната чака, докато Потребителят е готов да я получи и тогава се извършва обмен.

При асинхронна реализация се използва буфер, като проблемът е синхронизация на достъпа до буфера:

- никоя данна да не се изгуби;

- никоя данна да не се получи два пъти.

Първи вариант – буфер с капацитет 1 с използване на SPB.

- Семафорите се използват за индикация, че:

- процесът е достигнал своя КУ;

- е изменено състоянието на буфера.

- SPB се използва за реализация на КУ така:

- начално точно един семафор има стойност 1;

- всеки процес започва с операция Р по един от семафорите и завършва с операция V;

- кодът между Р и V операциите се изпълнява в режим на взаимно изключване, тъй като всички семафори имат стойност 0 докато не се изпълни първата операция V.

Page 10: Конкурентно Програмиране

Конкурентно програмиране 2005 10

Производител/Потребител с едноелементен буфер - SPB

SPB empty=1; full=0;

Process Producer while (true) { produceData(); P.empty; depositData(); V.full; }end Producer;

Process Consumer while (true) { P.full; fetchData(); V.empty; consumeData(); }end Consumer;

При много процеси Производители и Потребители протоколът на работа с буфера остава без изменение.

Да се докаже, че е осигурено ВИ.

Може ли да се твърди нещо за реда, в който работят процесите?

Page 11: Конкурентно Програмиране

Конкурентно програмиране 2005 11

Производител/Потребител с неограничен буфер – управление на ресурси

При решаване на задача за управление на ресурси се използва семафор-брояч, стойността на семафора във всеки момент показва броя на достъпните единици от съответния ресурс.

data [] buffer = new data[infinite];integer head =0, tail = 0; Semaphore elements = new Semaphore(0);

Process Producer data d; while (true) { d=produce(); buffer[tail]=d; tail=tail+1; V.elements; }end Producer;

Process Consumerdata d; while (true) { P.elements; d=buffer[head]; head=head+1; consume(d); }end Consumer;

Синхронизация се налага по условието брой_елементи > 0, което се постига със семафора elements, който съдържа във всеки момент броя на наличните в буфера данни.

Взаимно изключване при ползване на буфера не се налага – защо?

Page 12: Конкурентно Програмиране

Конкурентно програмиране 2005 12

При капацитет >1 се повишава производителността, тъй като се намаляват случаите на блокиране на процесите.

Разглеждаме случая на един Производител и един Потребител и кръгов буфер, който се ползва при дисциплина на опашка.

Инвариант: #Elements = N - #FreeSpaces

data [] buffer = new data[N];integer head =0, tail = 0; Semaphore elements = new Semaphore(0);Semaphore spaces = new Semaphore(N);

Process Producer data d; while (true) { d=produce(); P.spaces; buffer[tail]=d; tail=(tail+1)% N; V.elements; }end Producer;

Process Consumerdata d; while (true) { P.elements; d=buffer[head]; head=(head+1 )% N; V.spaces; consume(d)}end Consumer;

Взаимно изключване при използване на буфера не е необходимо – защо?

Page 13: Конкурентно Програмиране

Конкурентно програмиране 2005 13

Производител/Потребител с буфер с капацитет N – много процеси

Разглеждаме случая на много Производители и много Потребители и кръгов буфер, който се ползва при дисциплина на опашка.

data [] buffer = new data[N];integer head =0, tail = 0; Semaphore mutexD = new Semaphore(1);Semaphore mutexF = new Semaphore(1);Semaphore elements = new Semaphore(0);Semaphore spaces = new Semaphore(N);

Process Producer data d; while (true) { d=produce(); P.spaces; P.mutexD; buffer[tail]=d; tail=(tail+1)% N; V.mutexD; V.elements; }end Producer;

Process Consumerdata d; while (true) { P.elements; P.mutexF; d=buffer[head]; head=(head+1 )% N; V.mutexF; V.elements; consume(d); }end Consumer;

Взаимно изключване при използване на буфера се налага при ползване на общите променливи head и tail и се осигурява от семафорите mutexD и mutexF съответно.

Page 14: Конкурентно Програмиране

Конкурентно програмиране 2005 14

Бариерна синхронизация със семафори

Бариера, синхронизираща два процеса: никой процес не може да мине след бариерата докато и двата не стигнат до нея. С всеки процес се свързва синхронизационен флаг, който се реалиизра със семафор

Semaphore arrive1 = new Semaphore(0);Semaphore arrive2 = new Semaphore(0);

Process Worker1 . . . . . . V.arrive1; // процесът сигнализира пристигането си // при бариерата P.arrive2; // процесът чака другия процес . . . . . . end Worker1;

Process Worker2 . . . . . . V.arrive2; // стига до бариерата P.arrive1; // чака другия процес . . . . . . end Worker2;

Page 15: Конкурентно Програмиране

Конкурентно програмиране 2005 15

Семафори – реализация. Обобщение

Реализация на семафори:

- със средствата на ОС. Различия в случаите на:

- еднопроцесорна система;

- многопроцесорна система – необходимост от осигуряване на атомарен достъп до данните на ядрото, свързани с представяне на семафори.

- в планировчика на процесите;

- с механизма на предаване на съобщения.

Обобщение:

- Многофункционален механизъм: използва се за взаимно изключване, синхронизация, управлени на ресурси. Процесите чакат блокирани.

- Недостатъци и ограничения при използване на семафори за синхронизация:

- не може процесът да бъде принуден да ползва семафор;

- няма връзка между даден семафор и ресурса, за който той се отнася, което е особено неприятно в случай на много семафори;

Page 16: Конкурентно Програмиране

Конкурентно програмиране 2005 16

- трябва да се спазва определен протокол: P операция по семафора, използване на общия ресурс, V операция за същия семафор. Няма гаранция, че протоколът ще бъде спазен, или че процесът няма да блокира докато го изпълнява;

- позволена е произволна употреба на ресурса;

- неспазването на протокола може да доведе до несъстоятелност на данните или до deadlock;

- трябва да се координира кода на критичните участъци, които се отнасят до един и същ ресурс, защото чрез него процесите си влияят;

- трудно се създават и управляват по-голям брой семафори;

- смисълът на използваните операции Р и V не е ясен извън контекста;

- програми с използване на семафори трудно се проверяват за коректност.

Page 17: Конкурентно Програмиране

Конкурентно програмиране 2005 17

Условен критичен участък ( CCR) – Hoare 1972

Структуриран подход за решаване на въпроса за взаимното изключване и условната синхронизация.

Общите данни се групират в ресурси, като една данна не може да принадлежи на повече от един ресурс.

Ресурсът се обработва само в УКУ, свързан със самия него.

Всички УКУ, свързани с един ресурс се изпълняват в режим на взаимно изключване.

Условната синхронизация се постига чрез добавяне на булево условие към УКУ.

resource R: V1, V2…Vn

region R when B do S

Действие: Процесът се забавя пред УКУ докато условието В стане истина, после се изпълнява тялото S. Изчисляването на условието и изпълнението на тялото на УКУ са непрекъсваеми от други УКУ, които се отнасят до същия ресурс. Механизмът за забавяне трябва да е справедлив.

Предимства на УКУ в сравнение със семафорите:

- добавя се синтактично ниво на контрол, разделя се ВИ от условната синхронизация.

- процесът не може да забрави да освободи ресурса.

Page 18: Конкурентно Програмиране

Конкурентно програмиране 2005 18

Трудности при реализацията – в какво състояние да чакат процесите – блокирани или не. Как да става проверката на условието, в което може да участват данни от самия процес.

Как се симулира използване на двоичен семафор за осигуряване на ВИ:

Семафор:

Семафор S контролира ресурса X

P(S);

use_X

V(S);

Условен КУ:

УКУ r контролира ресурса X

region r when true do

use_X

Задача Производител-Потребител с едноелементен буфер:

resource buffer: { data d; boolean full=false; }

Process Producer while (true) { produceData(); region buffer when ( !full ) do { depositData(); full=true; } }end Producer;

Process Consumer while (true) { region buffer when ( full ) do { fetchData(); full=false; } consumeData(); }end Consumer;

Page 19: Конкурентно Програмиране

Конкурентно програмиране 2005 19

Path Expressions

Механизъм за синхронизация, подобен на мониторите.

Прилика с мониторите: модулност и капсулация на данните.

Разлики спрямо мониторите:

- всички ограничения за изпълнение на операциите се задават на едно място;

- взаимното изключване при изпълнение на оперциите се задава явно.

Общ вид:

Name

path path-expression end

declaration of shared data

operations

end

Взаимното изключване при изпълнение на операциите не е по премълчаване и ако не се специфицира явно операциите могат да се изпълняват конкурентно.

Условната синхронизация се постига чрез задаване на path expression.

Page 20: Конкурентно Програмиране

Конкурентно програмиране 2005 20

Дефиниция на Path Expression

Това са изрази, подобни на регулярните изрази.

- Елементарен израз е името на операция, а неговото значение е изпълнението на тази операция.

- Нека R и S са два израза, тогава:

- R|S е също израз и неговото значение е изпълнението на R и S в режим на взаимно изключване;

- R,S е също израз и значението му е, че R и S могат да бъдат изпълнени конкурентно;

- R:S е израз, чието значение е последователното изпълнение на R и S;

- R* е израз със значение – конкурентно изпълнение на произволен брой копия на R;

- R[n] е израз със значение конкурентно изпълнение на най-много n екземпляра на R;

- (R) е израз, чието значение съвпада с това на израза R.

- Други изрази от този вид няма.

Page 21: Конкурентно Програмиране

Конкурентно програмиране 2005 21

Примери

Взаимно изключване при изпълнение на мониторни процедури:

path (P1|P2|…|Pn) [1] end

Което описва изпълнение на мониторните операции P1, P2,…,Pn в режим на взаимно изключване, по една във всеки момент.

Конкурентно изпълнение:

path (P1,P2,…,Pn) end

Изброените операции могат да се изпълняват конкурентно без никакви ограничения.

Задача Читатели/Писатели

path (Reader* | Writer) [1] end

Изразът опсва изпълнение, при което във всеки момент може да има или единствен активен Писател, или произволен брой активни Читатели.

Задача Производител/Потребител с едноелементен буфер:

path (deposit : feth) [1] end

Описва изпълнение, при което всяка операция feth трябва да се предшества от операция deposit, като в даден момент се изпълнява по една операция.

Page 22: Конкурентно Програмиране

Конкурентно програмиране 2005 22

Задача Производител/Потребител с краен буфер:

path (deposit [1] : feth [1]) [n] end

Изразът описва изпълнение на операциите deposit в режим на взаимно изключване, същото се отнася за операциите feth.

Всяка операция feth трябва да се предшества от операция deposit, което блокира операцията feth при опит да се изпълни за празен буфер. Броят на завършените операции deposit не може да надхвърля n + броя на завършените операции feth, което предотвратява записването в пълен буфер.

Предимство на механизма Path Expressions е компактното описание на взаимното изключване и условната синхронизация едновременно.

Недостатъкът му е, че някои синхронизационни условия се задават с много комплицирани изрази, или изобщо не могат да бъдат описани.