30
Programowanie współbieżne i równoległe 1 dr inż. Marcin Wilczewski 2013

Programowanie współbieżne i równoległe · Komunikacja synchroniczna i asynchroniczna. • Synchronizacja –zapewnienie pożądanych zależności czasowych wykonujących się

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Programowanie współbieżne i równoległe · Komunikacja synchroniczna i asynchroniczna. • Synchronizacja –zapewnienie pożądanych zależności czasowych wykonujących się

Programowanie współbieżnei równoległe

1

dr inż. Marcin Wilczewski2013

Page 2: Programowanie współbieżne i równoległe · Komunikacja synchroniczna i asynchroniczna. • Synchronizacja –zapewnienie pożądanych zależności czasowych wykonujących się

Tematyka wykładu

• Wprowadzenie. Podstawowe pojęcia

• Wątki i procesy. Metody i modele synchronizacji

• Klasyczne problemy współbieżne i ich rozwiązania

•Programowanie współbieżne w Javie i C#

2

Organizacja zajęć

Laboratorium: Procesy w Uniksie, programowanie z biblioteką pthread, programowanie współbieżne w językach C#/JAVA

Ocenianie: z przedmiotu można otrzymać maksymalnie 40 punktów (30 laboratorium + 10 wykład). Zaliczenie przedmiotu na ocenę 3: >20 punktów

Page 3: Programowanie współbieżne i równoległe · Komunikacja synchroniczna i asynchroniczna. • Synchronizacja –zapewnienie pożądanych zależności czasowych wykonujących się

Paradygmaty programowania

• Programowanie proceduralne

• Programowanie obiektowe

• Programowanie współbieżne – obejmuje projektowanie i tworzenie programów, które w fazie wykonania składają się z co najmniej dwóch jednostek wykonywanych współbieżnie (każdy z nich jest procesem sekwencyjnym). Wykonywanie współbieżne może wymagać zapewnienia komunikacji/synchronizacji pomiędzy jednostkami konkurującymi o dostęp do zasobów współdzielonych

• Programowanie równoległe

3

• Programowanie równoległe

• Współbieżnie: jedna jednostka wykonania rozpoczyna swoją pracę zanim druga zakończy swoje działanie. Obliczenia współbieżne mogą być wykonywane w systemach jedno- i wieloprocesorowych

• Z czego wynika potrzeba współbieżności?

• Równoległość. Jednoczesność. Współbieżność

• Kiedy możliwe jest osiągnięcie przetwarzania równoległego?

• Nie wszystkie procesy współbieżne są równie ciekawe

Page 4: Programowanie współbieżne i równoległe · Komunikacja synchroniczna i asynchroniczna. • Synchronizacja –zapewnienie pożądanych zależności czasowych wykonujących się

Motywacja programowania równoległego i współbieżnego

• Obliczenia współbieżne stanowią szerszą klasę niż obliczenia równoległe (mogą być wykonywane zarówno w systemach jedno- jak i wieloprocesorowych)

• Komputery współcześnie produkowane to maszyny wieloprocesorowe (wielordzeniowe). Programowanie równoległe i współbieżne zapewnia wykorzystanie mocy zapewnianej na poziomie sprzętowym (fizycznym)

• Przetwarzanie równoległe zapewnia przyspieszenie obliczeń w stosunku do przetwarzania sekwencyjnego

• Przetwarzanie współbieżne (nawet w środowiskach jednoprocesorowych)

4

• Przetwarzanie współbieżne (nawet w środowiskach jednoprocesorowych) pozwalają na dekompozycję funkcjonalną zadań/programów (niezależne przetwarzanie danych, operacje IO, komunikacja z użytkownikiem, etc.)

Page 5: Programowanie współbieżne i równoległe · Komunikacja synchroniczna i asynchroniczna. • Synchronizacja –zapewnienie pożądanych zależności czasowych wykonujących się

Programy współbieżne i przeplot

• Program współbieżny złożony jest procesów sekwencyjnych wykonywanych współbieżnie

• Każdy możliwy ciąg wykonań kolejnych akcji/instrukcji procesów sekwencyjnych stanowi przeplot

• Projektując programy współbieżne nie można założyć, że pewne przeploty są niemożliwe do zrealizowania. Eliminacja możliwych, niepożądanych przeplotów powinna odbywać się na etapie projektowania rozwiązania i jest osiągana przez synchronizację

5

synchronizację

• Przykład:

1 2

A B

1 2 A B

1 A B 2

1 A 2 B

A B 1 2

A 1 2 B

A 1 B 2

P1

P2

procesy

możliwe przeploty

Page 6: Programowanie współbieżne i równoległe · Komunikacja synchroniczna i asynchroniczna. • Synchronizacja –zapewnienie pożądanych zależności czasowych wykonujących się

Przetwarzanie w środowiskach z pamięcią wspólną (1)

• W systemach z pamięcią wspólną zasób pamięci jest współdzielony przez wszystkie procesory (w szczególności przez jeden procesor)

• Konieczne jest zapewnienie bezpiecznego wykonania poszczególnych zadań przez jeden lub wiele procesorów (izolacja zadań). Dlaczego?

• Bezpieczeństwo zapewnia odpowiednia organizacja jednostek przetwarzania (procesy, wątki) w systemie operacyjnym oraz mechanizmy synchronizacji (kontroli dostępu do danych)

• W systemach z pamięcią wspólną poszczególne zadania realizowane są przez

6

• W systemach z pamięcią wspólną poszczególne zadania realizowane są przez procesy i wątki funkcjonujące w ramach jednego procesu

• Proces to jednostka sekwencyjnie wykonywanych przetwarzań (strumień sekwencyjnie wykonywanych instrukcji)/program w trakcie wykonywania. System operacyjny zapewnia wzajemną izolację procesów (zalety i wady)

• Każdy proces posiada kod, segment danych (zmienne globalne), stos (adresy powrotu z wywoływanych procedur oraz zmienne lokalne oraz rejestry

• Wątki są jednostkami przetwarzania wydzielonymi w ramach procesu. Posiadają wspólny kod oraz dane (współdzielą zmienne globalne), niezależne stosy (zmienne lokalne) i rejestry. Wątki mają dostęp do pamięci współdzielonej

Page 7: Programowanie współbieżne i równoległe · Komunikacja synchroniczna i asynchroniczna. • Synchronizacja –zapewnienie pożądanych zależności czasowych wykonujących się

Przetwarzanie w środowiskach z pamięcią wspólną (2)

• Wspólny segment danych wątków jednego procesu wykorzystywany jest do zapewnienia komunikacji (wymiany danych) pomiędzy wątkami

• Gdy tworzony jest proces domyślnie tworzony jest wątek główny, z którego ciała możliwe jest utworzenie innych wątków. Proces kończy swoje działanie, gdy działanie kończy ostatni z jego wątków

• Stany procesu: new, running, waiting, ready, terminate

• Wątki bywają niekiedy nazywane lekkimi procesami, ponieważ obciążają

7

lekkimi procesami, ponieważ obciążają system w mniejszym stopniu niż procesy:

• utworzenie wątku zajmuje mniej czasu niż utworzenie procesu

• wątki są mniej pamięciożerne

• przełączanie kontekstu wątku zajmuje mniej czasu niż przełączanie procesora pomiędzy procesami (zapisy w PCB)

Page 8: Programowanie współbieżne i równoległe · Komunikacja synchroniczna i asynchroniczna. • Synchronizacja –zapewnienie pożądanych zależności czasowych wykonujących się

Przetwarzanie w środowiskach z pamięcią wspólną (3)

• Przełączanie kontekstu wymaga zapisu i odczytu danych z bloku kontrolnego procesu (Process Control Block – PCB)

• PCB jest strukturą utrzymywaną w pamięci operacyjnej przez system operacyjny i stanowi reprezentację procesu

• PCB zawiera m. in. następujące informacje

• identyfikator procesu (Process ID – PID)

• stan procesu

8

• licznik instrukcji – konieczny do przywrócenia właściwego działania procesu po jego przerwaniu

• informacje przeznaczone dla schedulera: priorytet procesu, wykorzystany czas procesora, itd.

• …

• Przełączanie kontekstu zachodzi wyłącznie w systemach z wywłaszczaniem (z podziałem czasu).

Page 9: Programowanie współbieżne i równoległe · Komunikacja synchroniczna i asynchroniczna. • Synchronizacja –zapewnienie pożądanych zależności czasowych wykonujących się

Przetwarzanie w środowiskach z pamięcią lokalną (1)

• Zgodnie z definicją systemy z pamięcią lokalną (systemy rozproszone) to systemy, w których wykonywane procesy posiadają własne, niezależne przestrzenie adresowe

• W takich przypadkach nie istnieje pojęcie pamięci współdzielonej. Tym samym nie ma możliwości synchronizacji procesów za pomocą mechanizmów takich jak semafory, monitory, zamki, których celem jest ochrona zasobu pamięci przed niepożądanymi interakcjami różnych procesów

• W systemach rozproszonych synchronizacja współpracujących lub konkurujących

9

• W systemach rozproszonych synchronizacja współpracujących lub konkurujących procesów jest realizowana przez mechanizm komunikatów. Komunikaty mogą zawierać informacje sterujące, ale również dane (np. parametry, dane wejściowe do przetwarzania)

• Programowanie dla systemów z pamięcią lokalną nazywane jest programowaniem rozproszonym

• Pojęcie programowania rozproszonego nie ogranicza się wyłącznie do systemów, w których przestrzenie adresowe poszczególnych procesorów są fizycznie separowane. Programowanie rozproszone odnosi się również do programowania układów scentralizowanych, w których procesy z pewnych powodów nie wymieniają informacji za pomocą zmiennych współdzielonych

Page 10: Programowanie współbieżne i równoległe · Komunikacja synchroniczna i asynchroniczna. • Synchronizacja –zapewnienie pożądanych zależności czasowych wykonujących się

Przetwarzanie w środowiskach z pamięcią lokalną (2)

• Wymiana komunikatów jest wspierana przez systemy operacyjne (potoki, łącza nazwane/nienazwane, gniazdka, itd.)

• Ze względu na związki czasowe pomiędzy procesami wzajemnie się komunikującymi mechanizmy komunikacji można podzielić na

• synchroniczne – wymiana informacji następuje w trakcie spotkania, tzn. proces wysyłający komunikat jest wstrzymywany tak długo, jak długo proces odbierający nie jest gotowy do odbioru komunikatu (i na odwrót)

• asynchroniczne – spotkanie nie jest konieczne; wysłanie komunikatu może

10

• asynchroniczne – spotkanie nie jest konieczne; wysłanie komunikatu może nastąpić w dowolnej chwili (gdy spełnione są pewne dodatkowe warunki, które nie obejmują jednak gotowości odbiorcy). Wykorzystywana jest w tym przypadku strona trzecia (pośrednicząca) w postaci np. bufora, kolejki buforującej

• blokujące – wykonanie instrukcji następujące po instrukcji odbioru/wysłania danych jest możliwe dopiero po zakończeniu procesu odbioru/wysyłania

• nieblokujące – przejście do kolejnej instrukcji następuje bez oczekiwania na zakończenie wysyłania/odbierania komunikatu

Page 11: Programowanie współbieżne i równoległe · Komunikacja synchroniczna i asynchroniczna. • Synchronizacja –zapewnienie pożądanych zależności czasowych wykonujących się

Przetwarzanie w środowiskach z pamięcią lokalną (3)

• W modelu rozproszonym w zależności od sposobu współpracy procesów komunikaty mogą być przekazywane na różne sposoby:

• komunikat przeznaczony dla konkretnego procesu

• komunikat przeznaczony dla pierwszego odbiorcy (wysyłający nie musi wiedzieć, który proces konkretnie odbierze komunikat)

• komunikat przeznaczony do wszystkich (broadcast)

• Komunikaty są wykorzystywane do bezpośredniego przekazywania danych pomiędzy procesami i/lub do jawnej synchronizacji. Synchronizacja może być

11

pomiędzy procesami i/lub do jawnej synchronizacji. Synchronizacja może być realizowana np. w modelu z pojedynczym tokenem. W takim przypadku wykonanie pewnych operacji (sekcja krytyczna, bufor) jest możliwe przez ten proces, który jest aktualnie w posiadaniu tokenu

Page 12: Programowanie współbieżne i równoległe · Komunikacja synchroniczna i asynchroniczna. • Synchronizacja –zapewnienie pożądanych zależności czasowych wykonujących się

Synchronizacja i komunikacja pomiędzy procesami i wątkami

• Komunikacja – przesyłanie komunikatów (tokenów?) pomiędzy współpracującymi/współzawodniczącymi wątkami lub procesami. Komunikacja synchroniczna i asynchroniczna.

• Synchronizacja – zapewnienie pożądanych zależności czasowych wykonujących się procesów lub wątków. Synchronizacja = uporządkowanie w czasie

Kiedy synchronizacja jest niezbędna?

• Gdy procesy współdzielą wspólne struktury danych (np. zmienne globalne) lub

12

• Gdy procesy współdzielą wspólne struktury danych (np. zmienne globalne) lub współzawodniczą w dostępnie do wspólnego zasobu/struktury. Dlaczego synchronizacja jest w takich przypadkach konieczna?

• Pewne procesy dostarczają dane dla innych procesów.

Uwaga 1: Programowanie współbieżne obejmuje również zaprojektowanie i implementację komunikacji i/lub synchronizacji procesów lub wątków.

Uwaga 2: W ogólności programista nie może zakładać określonej kolejności wykonania się procesów/wątków. Należy zakładać losowość.

Page 13: Programowanie współbieżne i równoległe · Komunikacja synchroniczna i asynchroniczna. • Synchronizacja –zapewnienie pożądanych zależności czasowych wykonujących się

Poprawność programów sekwencyjnych

W przypadku programów sekwencyjnych definicja poprawności wymaga spełnienia dwóch warunków: warunku stopu oraz tego, że dla dowolnych poprawnych danych wejściowych program/algorytm po zatrzymaniu da poprawne wyniki

Poprawność programów współbieżnych

• Bezpieczeństwo – niedopuszczalność do sytuacji niepożądanej (wykluczenie stanu niepożądanego)

• Żywotność – każdy proces w końcu wykona swoją pracę (w szczególności: otrzyma dostęp do współdzielonego zasobu)

13

dostęp do współdzielonego zasobu)

Przejawy braku żywotności

• Zakleszczenie (deadlock) – globalny brak żywotności; dotyczy blokady całego systemu współbieżnego (zakleszczają się co najmniej dwa procesy/wątki). Jest łatwiejsze do wykrycia (ze względu na swój globalny charakter)

• Zagłodzenie (wykluczenie, lockout, starvation) – lokalny brak żywotności. W jakich warunkach może dojść do zagłodzenia i jak eliminować takie warunki?

W ogólności klasyczne testowanie programów nie daje dowodu na to, że dany program jest

poprawny

Page 14: Programowanie współbieżne i równoległe · Komunikacja synchroniczna i asynchroniczna. • Synchronizacja –zapewnienie pożądanych zależności czasowych wykonujących się

Zakleszczenie

14

Page 15: Programowanie współbieżne i równoległe · Komunikacja synchroniczna i asynchroniczna. • Synchronizacja –zapewnienie pożądanych zależności czasowych wykonujących się

Zakleszczenie. Warunki konieczne (niewystarczające)

• Wzajemne wykluczanie

• Cykl w grafie oczekiwania na zasoby (np. P1 zajmuje Z1, P2 zajmuje Z2, P1 oczekuje na Z2, P2 oczekuje na Z1 – generuje cykl w dwuwierzchołkowym grafie oczekiwania)

• Brak wywłaszczania – zasób (pamięć) może być zwolniony przez wątek/proces dobrowolnie, ale nie może być odebrany przez mechanizm nadzorujący

• Przetrzymywanie zasobu i oczekiwanie na inny

Różne strategie obsługi zakleszczeń

15

Różne strategie obsługi zakleszczeń

• Zapobieganie (doprowadzenie do sytuacji gdy spełnienie co najmniej jednego z powyższych warunków nie jest możliwe)

• Unikanie (niedopuszczanie do sytuacji zakleszczenia, aktywne badanie żądań dostępu do zasobów). Algorytm bankiera

• Wykrywanie i obsługa (usuwanie i przywracanie poprawnego stanu systemu, np. poprzez przerwanie działania wszystkich procesów lub wyznaczanie ofiary zakleszczenia i przerwanie wyłącznie jej procesu/wątku – pozwala to funkcjonować wszystkim pozostałym. Identyfikacja cykli w grafach oczekiwania)

• Ignorowanie problemu

Page 16: Programowanie współbieżne i równoległe · Komunikacja synchroniczna i asynchroniczna. • Synchronizacja –zapewnienie pożądanych zależności czasowych wykonujących się

Zapobieganie zakleszczeniom

• Wzajemne wykluczanie – rezygnacja z tego warunku w praktyce nie jest możliwa w systemach ze wspólną pamięcią (systemach scentralizowanych)

• Cykl w grafie oczekiwania na zasoby

• Brak wywłaszczania - wprowadzanie możliwości wywłaszczania, np. poprzez odbieranie udostępnionych zasobów procesowi, który żąda dostępu do zasobu zajętego przez inny proces. Rozwiązanie prowadzi jednak do niskiego wykorzystania zasobów i możliwości zagłodzenia procesów wykorzystujących dużą liczbę zasobów (małe prawdopodobieństwo skompletowania zestawu wymaganych zasobów).

16

(małe prawdopodobieństwo skompletowania zestawu wymaganych zasobów). Biblioteki programistyczne udostępniają metody (np. trylock()), które gwarantują niedopuszczalność sytuacji zajęcia jednego zasobu i oczekiwania na inny. W takich przypadkach zasób jest zajmowany wyłącznie, gdy jest wolny

• Przetrzymywanie zasobu i oczekiwanie na inny - rezygnacja z przetrzymywania i oczekiwania na inny zasób może się sprowadzać do wymagania by proces otrzymywał komplet wymaganych zasobów (proces otrzymuje komplet zasobów lub żadnego). Prowadzi to do problemów jak w punkcie wyżej

Page 17: Programowanie współbieżne i równoległe · Komunikacja synchroniczna i asynchroniczna. • Synchronizacja –zapewnienie pożądanych zależności czasowych wykonujących się

Szeregowanie wątków lub procesów

• Procedury systemu operacyjnego (scheduler, dispatcher, planista) odpowiadają za szeregowanie wątków lub procesów do wykonania. Wybór dokonywany jest z puli wątków gotowych do wykonania (inne możliwe stany wątków: nowy, aktywny, gotowy do wykonania, czekający, zakończony)

• Procedury szeregujące mogą stosować różne strategie szeregowania i uwzględniać różne atrybuty wątków (priorytet, stan wątku, kolejność zgłaszania żądania dostępu do zasobu, szacowanego czasu do zakończenia wykonywania, etc.)

• Zadaniem schedulera jest zapewnienie optymalnego wykorzystania zasobów w

17

• Zadaniem schedulera jest zapewnienie optymalnego wykorzystania zasobów w systemach wielowątkowych (wieloprogramowych)

• Możliwe jest planowanie z wywłaszczaniem i bez wywłaszczania

• Planowanie bez wywłaszczania – po przejściu wątku do stanu aktywnego planista pozostaje bezczynny aż do zakończenia fazy wykonywania wątku

• Planowanie wywłaszczaniem – po przejściu wątku do stanu aktywnego wątkowi mogą być odebrane zasoby po zajściu odpowiedniego zdarzenia w systemie. Wówczas zasób oddawany jest innemu wątkowi z puli wątków gotowych do wykonania

• Strategie planowania: FCFS, SJF, priorytetowe, etc.

Page 18: Programowanie współbieżne i równoległe · Komunikacja synchroniczna i asynchroniczna. • Synchronizacja –zapewnienie pożądanych zależności czasowych wykonujących się

Klasyczne problemy współbieżności. Wzajemne wykluczanie (1)

• Stanowi abstrakcję problemu przydziału dostępu do zasobu współdzielonego (np. kanału komunikacyjnego). Problem pojawia się gdy liczba chętnych do skorzystania z zasobu przekracza liczbę obiektów, które z zasobu mogą korzystać

• Zasób współdzielony – zasób, który może być w sposób wyłączny wykorzystywany przez wiele współzawodniczących procesów (w danej chwili z zasobu może korzystać jeden lub ograniczona liczba wątków/procesów)

• Sekcja krytyczna – fragment kodu (fragment procesu) , w którym następuje korzystanie z zasobu współdzielonego

18

korzystanie z zasobu współdzielonego

• Problem: należy zapewnić, by w danej chwili z zasobu mógł korzystać tylko jeden proces (lub ograniczona od góry ich liczba), a pozostałe, które chcą uzyskać do niego dostęp będą czekać na jego zwolnienie. Jaka konstrukcja programistyczna zapewnia taki efekt?

• Problem oczekiwania aktywnego i pasywnego

• Założenie do rozwiązania problemu: czas wykonania sekcji krytycznej przez każdy z procesów jest skończony (tak krótki jak to możliwe). Co w przypadku gdyby założenie wyłączyć?

• Rozwiązanie: protokoły wstępne i końcowe

Page 19: Programowanie współbieżne i równoległe · Komunikacja synchroniczna i asynchroniczna. • Synchronizacja –zapewnienie pożądanych zależności czasowych wykonujących się

Klasyczne problemy współbieżności. Wzajemne wykluczanie (2)

• Wykorzystanie instrukcji specjalnych przed wejściem do sekcji krytycznej i po wyjściu z niej

• Przykład:while true

begin

przetwarzanie lokalne

protokół wst ępny

strefa krytyczna

19

protokół ko ńcowy

end

• Sekcja krytyczna jest otoczona specjalnymi blokami kodu

• Strefy lokalne mogą być wykonywane współbieżnie przez wiele różnych procesów

• Warunek bezpieczeństwa jest realizowany przez zagwarantowanie, że dwa procesy/wątki nigdy nie znajdą się jednocześnie w swoich sekcjach krytycznych

• Wzajemne wykluczanie jest wymagane zarówno w systemach scentralizowanych jak i rozproszonych. Realizuje się je różnymi metodami (np. muteksy - w systemach scentralizowanych, tokeny - w systemach rozproszonych)

Page 20: Programowanie współbieżne i równoległe · Komunikacja synchroniczna i asynchroniczna. • Synchronizacja –zapewnienie pożądanych zależności czasowych wykonujących się

Synchronizacja niskopoziomowa. Algorytm Dekkera (1)

• Algorytm Dekkera jest algorytmem synchronizacji dwóch procesów/wątków współbieżnych bez konieczności odwoływania się do gotowych narzędzi synchronizacyjnych

• Algorytm Dekkera sprowadza się do odpowiedniego zakodowania sekcji wejściowej i wyjściowej chroniących sekcję krytyczną

• Przy założeniu dwóch procesów wymaga 3 zmiennych współdzielonych

- czyja_kolej = {1,2} . Zmienna pełni rolę arbitra rozstrzygającego, który proces może wejść do sekcji krytycznej. Ustawienie inicjalne wartości

20

który proces może wejść do sekcji krytycznej. Ustawienie inicjalne wartości zmiennej łamie symetrię pomiędzy procesami/wątkami i określa kolejność w jakiej będą one wykonywane

- dwuelementowa tablica flag k. Każdy z procesów ma dostęp do

jednego pola tablicy. Pole jest ustawiane na true , gdy dany proces chce wejść do sekcji krytycznej. Inicjalnie flagi ustawione są na false

• Każdy z procesów posiada swój identyfikator (np. identyfikator liczbowy)

Page 21: Programowanie współbieżne i równoległe · Komunikacja synchroniczna i asynchroniczna. • Synchronizacja –zapewnienie pożądanych zależności czasowych wykonujących się

Synchronizacja niskopoziomowa. Algorytm Dekkera (2)

• protokół wejściowy. P jest identyfikatorem procesu; przyjmuje wartości 1 lub 2

21

• protokół wyjściowy

Page 22: Programowanie współbieżne i równoległe · Komunikacja synchroniczna i asynchroniczna. • Synchronizacja –zapewnienie pożądanych zależności czasowych wykonujących się

Synchronizacja niskopoziomowa. Algorytm Dekkera (3)

• Podana wersja algorytmu jest poprawna dla dwóch procesów/wątków. Algorytm można uogólnić do N procesów/wątków i wówczas wymaga 2N-1 zmiennych. Liczba procesów/wątków musi być znana z góry (niepraktyczne!)

• Poważnym problemem jest aktywne czekanie (busy waiting; proces oczekuje na udostępnienie zasobu wykonując pętlę sprawdzającą jego dostępność).

• Dlaczego aktywne czekanie jest problemem? Ponieważ proces oczekujący na wejście do swojej sekcji krytycznej jest wykonywany pożytkując czas procesora na wykonywanie pustych przebiegów pętli

22

wykonywanie pustych przebiegów pętli

• W ogólności mechanizm aktywnego czekania powinien być eliminowany z rozwiązań współbieżnych. Aktywne czekanie można zastąpić mechanizmem wstrzymywania wątków/procesów

• W przypadku, gdy tylko jeden proces chce korzystać z sekcji krytycznej uzyskuje dostęp bez ograniczeń

• Procesy korzystają z sekcji krytycznej naprzemiennie (wymuszone przez ustawianie zmiennej czyja_kolej ). W przypadku, gdy jeden z procesów przerwie swoje

działanie z błędem drugi z procesów jest blokowany

Page 23: Programowanie współbieżne i równoległe · Komunikacja synchroniczna i asynchroniczna. • Synchronizacja –zapewnienie pożądanych zależności czasowych wykonujących się

Algorytm Petersona. Podejście 1

• Rozpatrzmy poniższy sposób synchronizacji za pomocą jednej zmiennej globalnej. Niech zmienna czyja_kolej jest inicjalnie ustawiona na wartość 1. Przykład:

23

• Pytanie: co dzieje się w sytuacji, gdy tylko jeden proces chce wchodzić do sekcji krytycznej?

• Można pokazać, że taki sposób rozwiązania posiada własność bezpieczeństwa, tzn. tylko jeden proces w danym momencie może przebywać w sekcji krytycznej

• Problem faworyzacji procesu na który wskazuje inicjalna wartość zmiennej czyja_kolej . Na czym polega faworyzowanie procesu?

Page 24: Programowanie współbieżne i równoległe · Komunikacja synchroniczna i asynchroniczna. • Synchronizacja –zapewnienie pożądanych zależności czasowych wykonujących się

Algorytm Petersona. Podejście 1 c.d.

• Algorytm nie spełnia warunku żywotności. Dany proces, teoretycznie, może dowolnie długo wykonywać swoją sekcję lokalną - w szczególności nieskończenie długo. W takim przypadku drugi z procesów nie wejdzie do sekcji krytycznej –zostanie zagłodzony.

• Procesy są ściśle ze sobą powiązane: wykonują się w sekwencji 1,2,1,2,1,2, etc. Jako pierwszy wykona się zawsze wątek/proces wskazywany przez inicjalne ustawienie zmiennej czyja_kolej.

• Nie jest możliwe wykonanie procesów w sekwencji …,1, 1, …. lub …, 2, 2, …

24

• Nie jest możliwe wykonanie procesów w sekwencji …,1, 1, …. lub …, 2, 2, …

• Powyższe jest problemem szczególnie w sytuacji, gdy czas wykonania sekcji lokalnych dwóch procesów znacznie się różni. W takiej sytuacji proces szybszy jest spowalniany przez proces wolniejszy (czeka na zakończenie jego pracy)

• Problem pojawia się w przypadku scenariusza, w którym tylko jeden z procesów chce uzyskiwać dostęp do sekcji krytycznej

Page 25: Programowanie współbieżne i równoległe · Komunikacja synchroniczna i asynchroniczna. • Synchronizacja –zapewnienie pożądanych zależności czasowych wykonujących się

Algorytm Petersona. Podejście 2

• Rozpatrzmy próbę synchronizacji przy wykorzystaniu dwóch zmiennych logicznych (np. tablica o dwóch elementach), gdzie każdy z wątków/procesów ustawia odpowiednie pole tablicy na wartość true w przypadku, gdy jest w sekcji krytycznej. Inicjalnie obie zmienne (pola tablicy) są ustawione na false .

25

• W tym przypadku wątki/procesy nie są ze sobą ściśle powiązane, tzn. nie muszą się wykonywać w sekwencji - wątek który nie chce lub nie może wejść do sekcji nie blokuje drugiego z wątków

• Problem: występuje złamanie warunku bezpieczeństwa � w danej chwili do sekcji krytycznej mogą wejść oba wątki

Page 26: Programowanie współbieżne i równoległe · Komunikacja synchroniczna i asynchroniczna. • Synchronizacja –zapewnienie pożądanych zależności czasowych wykonujących się

Algorytm Petersona. Podejście 2 c.d.

• Przykład przeplotu obu wątków prowadzący do naruszenia warunku bezpieczeństwa algorytmu:

26

• Wniosek: nie jest to poprawny algorytm synchronizacyjny � nie spełnia warunku bezpieczeństwa

Page 27: Programowanie współbieżne i równoległe · Komunikacja synchroniczna i asynchroniczna. • Synchronizacja –zapewnienie pożądanych zależności czasowych wykonujących się

Algorytm Petersona. Podejście 3

• W miejsce zmiennych logicznych reprezentujących fakt obecności (wejścia) wątku/procesu do sekcji wprowadźmy zmienne logiczne reprezentujące chęć wejścia wątku/procesu do sekcji krytycznej. Obie zmienne inicjalnie są ustawione na wartość false . Przykład:

27

• Wątek, który jako jedyny chce wykonywać sekcję krytyczną może tego dokonywać bez przeszkód (wątki nie są ze sobą powiązane)

• Algorytm daje program bezpieczny (spełniony jest warunek bezpieczeństwa)

• Algorytm narusza warunek żywotności � prowadzi do zakleszczeń

Page 28: Programowanie współbieżne i równoległe · Komunikacja synchroniczna i asynchroniczna. • Synchronizacja –zapewnienie pożądanych zależności czasowych wykonujących się

Algorytm Petersona. Podejście 3 c.d.

• Przykład przeplotu prowadzącego do zakleszczenia

• W przypadku powyższego przeplotu nigdy nie zostanie zrealizowany warunek

28

• W przypadku powyższego przeplotu nigdy nie zostanie zrealizowany warunek wyjścia z pętli aktywnego czekania procesów 1 i 2. Zakleszczenie

• Wniosek: nie jest to poprawny algorytm synchronizacyjny � nie spełnia warunku żywotności

Page 29: Programowanie współbieżne i równoległe · Komunikacja synchroniczna i asynchroniczna. • Synchronizacja –zapewnienie pożądanych zależności czasowych wykonujących się

Algorytm Petersona. Ostateczna postać

• Algorytm Petersona

29

• Algorytm gwarantuje bezpieczeństwo i żywotność

• Algorytm posiada wszystkie wady algorytmu Dekkera: wymaga aktywnego czekania oraz chociaż można go uogólnić na dowolne N wątków/procesów, to wymaga w takim przypadku 2N-1 zmiennych, gdzie N musi być znane a priori

Page 30: Programowanie współbieżne i równoległe · Komunikacja synchroniczna i asynchroniczna. • Synchronizacja –zapewnienie pożądanych zależności czasowych wykonujących się

Algorytm Petersona. Ostateczna postać c.d.

• Przeanalizujmy przykład

30

• Wszystko jest OK.