1 / 22

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

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

rufina
Download Presentation

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

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Конкурентно Програмиране Средства за синхронизация Семафори. Условен критичен участък Path Expressions Конкурентно програмиране 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) не определя кой процес ще бъде разблокиран. Конкурентно програмиране 2005

  3. Инварианти на семафора: (1) S >= 0 (2) S = S0 - #P(S) + #V(S) - S0 е началната стойност на семафора; - #P(S) е броят на завършените операции P(S); - #V(S) е броят на изпълнените операции V(S). • Видове семафори: Двоичен семафор – семафор, който може да приема само две стойности: 0 и 1. Общ семафор – семафор, който може да приема произволна неотрицателна стойност. • Решавани проблеми: - осигуряване на КУ; - бариерна синхронизация; - задача Производител/Потребител; - управление на ресурси – буфер с фиксиран капацитет. Конкурентно програмиране 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 може да се използва за условна синхронизация, което ще бъде разгледано на примера на задачата Производител/Потребител. • Еквивалентност на двоичните и общите семафори. Конкурентно програмиране 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”; - хардуерна поддръжка; - семафори. • Процесът, блокиран по семафор пред КУ не изпълнява никакви инструкции за проверка на това кога ще му се разреши достъп. Конкурентно програмиране 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) и продължава към критичния си участък. Конкурентно програмиране 2005

  7. Проблемът за справедливостта – свойство на прогреса: Този проблем възниква, когато два или повече процеса чакат пред един семафор, т.е. когато се прави взаимно изключване на поне три процеса, при което е възможно гладуване. • Въз основа на семантиката семафорите могат да са: strongly fair – ако един семафор се сигнализира безкрайно често, то евентуално всеки чакащ по него процес ще получи достъп до своя КУ;weak fair – ако един семафор се установи на стойност по-голяма от 0, то евентуално всеки чакащ процес ще получи достъп до своя КУ. • Въз основа на реализацията семафорите могат да бъдат: - blocked-set – операцията V(S) събужда един (кой да е) от чакащите процеси;blocked-queue – операцията P(S) добавя нов чакащ процес на края наопашката, а V(S) разблокира процеса от началото на опашката. • При всички дефиниции е гарантирано свойството взаимно изключване. Същото се отнася за отсъствието на deadlock. • Не така стои въпросът с индивидуалното гладуване. При blocked-setсемафор и наличие на поне три процеса е възможно гладуване. • Съотношение брой използвани семафори/ниво на конкурентност: При наличие на няколко общи за процесите ресурси е възможно използване на различен брой семафори за реализиране на взаимно изключване: - единствен семафор за всички ресурси – управлението е по-просто за сметка на намалена степен на конкурентност; - отделен семафор за всеки ресурс, даже за отделна компонента /елемент на масив, поле на запис/ - по-сложно управление за сметка на увеличена степен на конкурентност. Конкурентно програмиране 2005

  8. Задача Производител/Потребител • Това е абстракция на проблема за комуникация на конкурентни процеси и нужната за целта условна синхронизация. • Производителят, посредством своя вътрешна операцияproduce произвежда данна, която трябва да бъде предадена на Потребителя. • Потребителят получава данната, която обработва в своя вътрешна операцияconsume. • Варианти на задачата: - Един Производител и един Потребител: - синхронно изпълнение; - асинхронно изпълнение с използване на буфер за данните: - буфер за една данна – SPB; - буфер с капацитет >1 – условна синхронизация; - Много Производители / много Потребители: - буфер за една данна – SPB; - буфер с капацитет >1 – условна синхронизация. Конкурентно програмиране 2005

  9. При синхронната реализация на задачата Производителят, който е готов да предаде данната чака, докато Потребителят е готов да я получи и тогава се извършва обмен. • При асинхроннареализация се използва буфер, като проблемът е синхронизация на достъпа до буфера: - никоя данна да не се изгуби; - никоя данна да не се получи два пъти. • Първи вариант – буфер с капацитет 1 с използване на SPB. - Семафорите се използват за индикация, че: - процесът е достигнал своя КУ; - е изменено състоянието на буфера. - SPB се използва за реализация на КУ така: - начално точно един семафор имастойност 1; - всеки процес започва с операция Р по един от семафорите и завършва с операция V; - кодът между Р и V операциите се изпълнява в режим на взаимно изключване, тъй като всички семафори имат стойност 0 докато не се изпълни първата операция V. Конкурентно програмиране 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; • При много процеси Производители и Потребители протоколът на работа с буфера остава без изменение. • Да се докаже, че е осигурено ВИ. • Може ли да се твърди нещо за реда, в който работят процесите? Конкурентно програмиране 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 Consumer data d; while (true) { P.elements; d=buffer[head]; head=head+1; consume(d); } end Consumer; • Синхронизация се налага по условието брой_елементи > 0, което се постига със семафораelements, който съдържа във всеки момент броя на наличните в буфера данни. • Взаимно изключване при ползване на буфера не се налага – защо? Конкурентно програмиране 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 Consumer data d; while (true) { P.elements; d=buffer[head]; head=(head+1 )% N; V.spaces; consume(d) } end Consumer; • Взаимно изключване при използване на буфера не е необходимо – защо? Конкурентно програмиране 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 Consumer data 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 съответно. Конкурентно програмиране 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; Конкурентно програмиране 2005

  15. Семафори – реализация. Обобщение • Реализация на семафори: - със средствата на ОС. Различия в случаите на: - еднопроцесорна система; - многопроцесорна система – необходимост от осигуряване на атомарен достъп до данните на ядрото, свързани с представяне на семафори. - в планировчика на процесите; - с механизма на предаване на съобщения. • Обобщение: - Многофункционален механизъм: използва се за взаимно изключване, синхронизация, управлени на ресурси. Процесите чакат блокирани. - Недостатъци и ограничения при използване на семафори за синхронизация: - не може процесът да бъде принуден да ползва семафор; - няма връзка между даден семафор и ресурса, за който той се отнася, което е особено неприятно в случай на много семафори; Конкурентно програмиране 2005

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

  17. Условен критичен участък ( CCR) – Hoare 1972 • Структуриран подход за решаване на въпроса за взаимното изключване и условната синхронизация. • Общите данни се групират в ресурси, като една данна не може да принадлежи на повече от един ресурс. • Ресурсът се обработва само в УКУ, свързан със самия него. • Всички УКУ, свързани с един ресурс се изпълняват в режим на взаимно изключване. • Условната синхронизация се постига чрез добавяне на булево условие към УКУ. resource R: V1, V2…Vn region R when B do S • Действие: Процесът се забавя пред УКУ докато условието В стане истина, после се изпълняватялото S. Изчисляването на условието и изпълнението на тялото на УКУ са непрекъсваеми от други УКУ, които се отнасят до същия ресурс. Механизмът за забавяне трябва да е справедлив. • Предимства на УКУ в сравнение със семафорите: - добавя се синтактично ниво на контрол, разделя се ВИ от условната синхронизация. - процесът не може да забрави да освободи ресурса. Конкурентно програмиране 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; Конкурентно програмиране 2005

  19. Path Expressions • Механизъм за синхронизация, подобен на мониторите. • Прилика с мониторите: модулност и капсулация на данните. • Разлики спрямо мониторите: - всички ограничения за изпълнение на операциите се задават на едно място; - взаимното изключване при изпълнение на оперциите се задава явно. • Общ вид: Name path path-expression end declaration of shared data operations end • Взаимното изключване при изпълнение на операциите не е по премълчаване и ако не се специфицира явно операциите могат да се изпълняват конкурентно. • Условната синхронизация се постига чрез задаване на path expression. Конкурентно програмиране 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. - Други изрази от този вид няма. Конкурентно програмиране 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, като в даден момент се изпълнява по една операция. Конкурентно програмиране 2005

  22. Задача Производител/Потребител с краен буфер: path (deposit [1] : feth [1]) [n] end Изразът описва изпълнение на операциите deposit в режим на взаимно изключване, същото се отнася за операциите feth. • Всяка операция feth трябва да се предшества от операция deposit, което блокира операцията feth при опит да се изпълни за празен буфер. Броят на завършените операции deposit не може да надхвърля n + броя на завършените операции feth, което предотвратява записването в пълен буфер. • Предимство на механизма Path Expressionsе компактното описание на взаимното изключване и условната синхронизация едновременно. • Недостатъкът му е, че някои синхронизационни условиясе задават с много комплицирани изрази, или изобщо не могат да бъдат описани. Конкурентно програмиране 2005

More Related