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