Synchronizacja i komunikacja międzyprocesowa
Transkrypt
Synchronizacja i komunikacja międzyprocesowa
Synchronizacja i komunikacja międzyprocesowa synchronizacja – doprowadzenie dwóch lub więcej procesów do określonego stanu wykonania w tym samym momencie w czasie (proces wcześniejszy czeka na proces(y) późniejsze komunikacja – wymiana informacji pomiędzy procesami Wymiana informacji może zachodzić poprzez: • przesyłanie komunikatów, • wspólną pamięć. Wymiana poprzez wspólną pamięć wymaga aby w przypadku zapisu do pamięci tylko jeden proces miał do niej dostęp. Sekcja krytyczna – fragment sekwencji operacji wykonywanej przez jedne z procesów związany zwykle z współdzielonym zasobem (np. pamięcią) a wymagający wyłączności dostępu do tego zasobu. • • • • Zwykle tylko jeden ze współdziałających procesów może znaleźć się w sekcji krytycznej. Pozostałe procesy są wstrzymywane do momentu opuszczenia przez proces sekcji krytycznej. W chwili zakończenia wykonywania sekcji krytycznej przez jeden z procesów spośród procesów oczekujących wybierany jest jeden który jest wpuszczany do sekcji krytycznej. W pewnych sytuacjach można dopuścić, że skończona liczba n procesów może równocześnie pracować w sekcji krytycznej. Semafory Semafor jest zmienną całkowitą, na której stowarzyszone operacje: • czekaj (wait, P) • sygnalizuj (signal, V) wykonywane są w sposób niepodzielny. Zmiennej semaforowej nadaje się początkowo pewną wartość ( w szczególności 1) Realizacja operacji P(sem) czekaj aż wartość sem > 0 sem := sem – 1; Realizacja operacji V(sem) sem := sem + 1; Jeśli wartość początkowa semafora jest 1 to mamy do czynienia z tzw. semaforem binarnym (zwyczajowo operacje na nim oznaczamy PB, VB) Semafor binarny rozwiązuje problem sekcji krytycznej. sem := 1; . . . PB(sem); wykonaj sekcję krytyczną; VB(sem); Typowe problemy synchronizacji procesów Problemu producenta-konsumenta Przypadek nieograniczonego bufora: s – semafor binarny chroniący sekcji krytycznej sk – semafor konsumenta, określa ilość elementów w buforze i zawiesza procesy konsumenta w sytuacji pustego bufora s = 1; sk = 0 Producent while true do produkuj; PB(s); dodaj do bufora; V(sk) VB(s); Konsument while true do P(sk); PB(s) odczytaj z bufora; VB(s); konsumuj; Przypadek ograniczonego bufora: sp – semafor producenta, określa ilość wolnych pozycji w buforze i zawiesza procesy producenta w sytuacji pełnego bufora sp := n; Producent while true do produkuj; P(sp); PB(s); dodaj do bufora; V(sk) VB(s); Konsument while true do P(sk); PB(s) odczytaj z bufora; V(sp); VB(s); konsumuj; Problem jedzących filozofów: przy okrągłym stole siedzi n osób (działa n procesów), każda z nich do jedzenia wykorzystuje dla leżące po obu jej stronach widelce, każdy widelec jest używany przez dwóch sąsiadów przy stole, widelec może w danej chwili być używany tylko przez jedną osobę, każda z osób może znajdować się w jednym z trzech stanów: myślenie, jedzenie, oczekiwanie na widelec, • należy zapewnić odpowiednie wstrzymywanie procesów. • • • • • var sem : array[0..n-1] of semaphore; begin cycle myslenie; PB(sem[filozof]; PB(sem[filozof mod n]); jedzenie; VB(sem[filozof]; VB(sem[filozof mod n]); end; Problem zagłodzenia procesu – sytuacja, w której proces w nieskończoność oczekuje na przydzielenie zasobu, który jest wciąż przydzielany innym procesom Problem blokady procesów – sytuacja, w której dwa lub więcej procesów oczekują na zdarzenie które może być wygenerowane tylko przez procesy oczekujące