Klasyczne problemy współbieżności Problem producenta i konsumenta Problem czytelników i pisarzy Problem pięciu filozofów
Wzajemne wykluczanie Zsynchronizować N procesów, z których każdy w nieskończonej pętli na przemian wykonuje sekcję lokalną i sekcję krytyczną (tzn. kod programu zawierający wykorzystanie zasobu dzielonego), w taki sposób, aby wykonywanie sekcji krytycznych dwóch lub więcej procesów nie pokrywało się w czasie. Przykłady zagadnień rzeczywistych: dostęp do telefonu, łazienki wózek/koszyk w sklepie samoobsługowym miejsce parkingowe winda (jednoosobowa)
Założenia do problemu wzajemnego wykluczania Skończony czas przebywania każdego z procesów w sekcji krytycznej (także wykonywania protokołów początkowego i końcowego), Brak ograniczeń zachowania procesów poza sekcją krytyczną, Różne prędkości wykonywania procesów
Problem producenta i konsumenta Synchronizacja procesów: Producent cyklicznie produkuje porcje danych i przekazuje do konsumpcji Konsument cyklicznie pobiera i konsumuje dane Porcje powinny być konsumowane w kolejności ich wyprodukowania. Możliwość oczekiwania producenta Możliwość oczekiwania konsumenta
Warianty problemu Dane przekazywane bezpośrednio do konsumpcji (wariant najprostszy) Bufor N-elementowy (wariant najpopularniejszy) Bufor nieskończony Operacje wstawiania i pobierania tego samego elementu bufora muszą się wzajemnie wykluczać. Abstrakcja rzeczywistych problemów z różnych dziedzin (handel, transport itp.)
Problem czytelników i pisarzy Konkurencja o dostęp do wspólnej czytelni Dwie grupy cyklicznych procesów, Czytelnik odczytuje informacje zgromadzone w czytelni; może to robić wspólnie z innymi czytelnikami Pisarz zapisuje informacje w czytelni; musi pracować sam (w pustej czytelni) Skończony czas trwania operacji czytania i pisania Abstrakcja problemu synchronizacji dostępu do wspólnej bazy danych
Możliwe rozwiązania 1. Czytelnik może wejść do czytelni, gdy jest pusta lub są inni czytelnicy; jest wstrzymany, gdy w czytelni jest pisarz. Pisarz może wejść do czytelni, gdy jest pusta. Możliwość zagłodzenia pisarzy 2. Jeżeli pisarz czeka na wejście do czytelni, to nie może wejść tam żaden czytelnik Możliwość zagłodzenia czytelników 3. Do czytelni wchodzą naprzemiennie pisarze i czytelnicy. Z danym czytelnikiem mogą wejść wszyscy oczekujący w danej chwili czytelnicy
Problem 5 filozofów Wzorcowy przykład obrazujący zagłodzenie i blokady
Problem 5 filozofów - rozwiązania 1. Głodny filozof czeka, aż będzie wolny lewy widelec, podnosi go, czeka na wolny prawy, podnosi go i zaczyna jeść. Po jedzeniu odkłada oba równocześnie. Możliwość blokady 2. Głodny filozof czeka, aż oba widelce będą wolne i podnosi je równocześnie. Możliwość zagłodzenia 3. Zatrudniamy lokaja, który dyskretnie nadzoruje filozofów, aby w danym czasie nie więcej niż 4 chciało jeść (= konkurowało o widelce). Jeśli 5 filozofów chciałoby jeść naraz, lokaj powstrzymuje jednego. Podnoszenie widelców jak w rozwiązaniu 1. Wyklucza blokadę i zagłodzenie
Mechanizmy umożliwiające wzajemne wykluczanie Mechanizmy niskopoziomowe przerwania arbiter pamięci instrukcje specjalne Mechanizmy wysokopoziomowe synchronizacji synchronizacji i komunikacji
Mechanizm przerwań zgłoszenie przerwania powrót do programu Zwykły proces Procedura obsługi przerwania
Mechanizm przerwań (2) System jednoprocesorowy: procesor wykonuje wszystkie procesy oraz system operacyjny, maskowanie blokowanie przerwań przychodzących zgłoszenie przerwania procesor w trybie obsługi systemu operacyjnego, so wykonuje sekcję krytyczną programowanie związane z ingerencją w obszar systemu operacyjnego w systemach wieloprocesorowych nie gwarantuje wzajemnego wykluczania
Arbiter pamięci Zapewnia wzajemne wykluczanie przy dostępie do pojedynczego słowa pamięci Szeregowanie żądań (kolejność nieznana dla programisty) -systemy wieloprocesorowe -systemy jednoprocesorowe wyposażone w DMA
Rozwiązanie problemu wzajemnego wykluczania Każdy z procesów P1 i P2 wykonuje w nieskończonej pętli program składający się ze strefy krytycznej (kryt1 i kryt2) oraz strefy lokalnej (lok1, lok2) Wykonywanie kryt1 i kryt2 nie może odbywać się równocześnie W systemie istnieje arbiter wspólnej pamięci
Próba pierwsza Arbiter zawiera zmienną cyfrę wskazującą proces, dla którego udostępniana jest wspólna pamięć. Proces wychodzący zapisuje w zmiennej numer drugiego procesu Aktywne czekanie
Próba pierwsza - kod Program pierwszaproba; var czyjakolej: integer procedure p1; begin repeat while czyjakolej=2 do (* nic *); kryt1; czyjakolej:=2; lok1; forever (równoważne repeat... until false) end;... p2 analogicznie begin (program główny) czyjakolej:=1; cobegin p1;p2; coend end. Modelowanie procesów współbieżnych 16
Próba pierwsza - cechy + Spełniony warunek wzajemnego wykluczania, + Niemożliwość wystąpienia blokady, + Niemożność wystąpienia zagłodzenia, Zbyt ścisłe powiązanie między procesami (prawo wejścia do strefy krytycznej przekazywane wprost) Niewygodne przy dużej różnicy częstotliwości działania w strefie krytycznej. Awaria jednego z procesów (również w strefie lokalnej) automatycznie blokuje drugi.
Próba druga Dwa oddzielne klucze do strefy krytycznej (dwie zmienne przypisane procesom) Proces sprawdza zmienną drugiego jeśli 1, to zmienia swoją na 0 i wchodzi do strefy krytycznej Wychodzący proces zmienia wartość swojej zmiennej na 1
Próba druga - kod Program drugaproba; var c1,c2: integer procedure p1; begin repeat while c2=0 do (* nic *); c1:=0; kryt1; c1:=1; lok1; forever end;... p2 analogicznie begin (program główny) c1:=1; c2:=1; cobegin p1;p2; coend end.
Próba druga - cechy Program nie jest poprawny nie spełnia wymogów bezpieczeństwa wzajemnego wykluczania Przeplot Wartość c1 Wartość c2 Początkowo 1 1 P1 sprawdza c2 1 1 P2 sprawdza c1 1 1 P1 zeruje c1:=0 0 1 P2 zeruje c2:=0 0 0 P1 wchodzi do kryt1 0 0 P2 wchodzi do kryt2 0 0
Próba trzecia Proces sprawdzający zmienną drugiego jest gotowy do wejścia do strefy krytycznej swoją zmienną zeruje przed testowaniem drugiej. Rozszerzenie pojęcia przebywania w strefie krytycznej.
Próba trzecia - kod Program trzeciaproba; var c1,c2: integer procedure p1; begin repeat c1:=0; while c2=0 do (* nic *); kryt1; c1:=1; lok1; forever end;... p2 analogicznie begin (program główny) c1:=1; c2:=1; cobegin p1;p2; coend end.
Próba trzecia - cechy + Spełniony warunek wzajemnego wykluczania, (P1 wewnątrz kryt1) (P2 poza kryt2) i odwrotnie Niebezpieczeństwo blokady. Przeplot Wartość c1 Wartość c2 Początkowo 1 1 P1 zeruje c1 0 1 P2 zeruje c2 0 0 P1 sprawdza c2 0 0 P2 sprawdza c1... 0 0
Próba czwarta Wprowadzenie pewności, że jeżeli P1 nie może wejść do strefy krytycznej, to może to zrobić P2. Jeżeli zmienna drugiego procesu jest równa zero, to proces oczekujący zmienia wartość swojej zmiennej na 1 i czeka.
Próba czwarta - kod Program czwartaproba; var c1,c2: integer procedure p1; begin repeat c1:=0; while c2=0 do begin c1:=1; (* przez chwilę nic nie rób *) c1:=0; end; kryt1; c1:=1; lok1; forever end;... p2 analogicznie begin (program główny) c1:=1; c2:=1; cobegin p1;p2; coend end.
Próba czwarta - cechy + Spełniony warunek wzajemnego wykluczania, Problem zbytniej rycerskości może prowadzić do zagłodzenia (mało prawdopodobne, omijane przez odstąpienie od zasady) Przeplot Wartość c1 Wartość c2 Początkowo 1 1 P1 zeruje c1 0 1 P2 zeruje c2 0 0 P1 sprawdza c2 0 0 P2 sprawdza c1 0 0 P1 nadaje wartość c1:=1 1 0 P2 nadaje wartość c2:=1 1 1 P1 zeruje c1 0 1 P2 zeruje c2 0 0
Algorytm Dekkera Kombinacja pierwszej i czwartej próby: każdy z procesów ma swoją zmienną-klucz istnieje zmienna arbitrażowa wskazująca na prawo domagania się wstępu do strefy krytycznej
Algorytm Dekkera - kod Program Dekker; var c1,c2, czyjakolej: integer procedure p1; begin repeat c1:=0; while c2=0 do if czyjakolej=2 then begin c1:=1; while czyjakolej=2 do; c1:=0;end; kryt1; czyjakolej=2; c1:=1; lok1; forever end;... p2 analogicznie begin (program główny) c1:=1; c2:=1; czyjakolej:=1; cobegin p1;p2; coend end.
Algorytm Dekkera - cechy + Spełniony warunek wzajemnego wykluczania, + Algorytm jest żywotny (złożony dowód logiczny) Niezbyt praktyczne narzędzie - Do synchronizacji N procesów potrzeba 2N-1 zmiennych (N musi być znane, zmiana pociąga za sobą zmianę programu) - Wykorzystanie zmiennych wspólnych - Aktywne czekanie
Instrukcje specjalne Przykład typowy: Test&Set(X, R) przepisuje zawartość wspólnej komórki pamięci X do lokalnego rejestru R i wyzerowanie jej (podczas jednego dostępu); początkowo ustawia się X=1 (oznacza zezwolenie na wejście do strefy krytycznej); wchodząc do strefy krytycznej proces wykonuje kod: R:=0; while R=0 do Test&Set(X,R); wychodząc, proces ponownie ustawia X:=1
Instrukcje specjalne (2) Tylko jeden proces znajdzie w R wartość 1 tylko on wejdzie do strefy krytycznej Instrukcja stosowana do wykluczania operacji semaforowych w systemach wieloprocesorowych ze wspólną pamięcią Rozwiązanie nie jest żywotne żaden proces nie ma gwarancji, że kiedyś wejdzie do strefy krytycznej. Wymaga aktywnego czekania (należy go uniknąć). Inne przykłady: - SWAP(X,R) zamienia X z R - TSB(X,L) równoważna if X then goto L else X:=true