np(s)
Transkrypt
np(s)
semafory 1 Własności formalne operacji semaforowych • Teoria aksjomatyczna Habermanna • Dowodzenie poprawności algorytmów MoŜliwość kontynuowania pracy przez dowolny proces przy wykonywaniu operacji P zaleŜy od liczby wykonań operacji P i V w przeszłości oraz od wartości początkowej semafora. 2 C(s) – wartość początkowa semafora s, C(s)>=0 ns(s)- liczba wykonań operacji V (signal) na s nw(s) liczba wywołań operacji P (wait) na s np(s) liczba przejść przez operacje P (wait) na s (procesy kontynuowały pracę po P) 3 P(s): nw(s):=nw(s) + 1; if nw(s)<= C(s)+ns(s) then np(s):=np(s)+1 Wykonanie operacji P nie pociąga za sobą zawieszenia procesu, o ile liczba wykonań tej operacji nie jest większa niŜ liczba wykonań operacji V zwiększona o wartość początkowa semafora 4 V(s): if nw(s) > C(s)+ns(s) then np(s):=np(s)+1; ns(s):=ns(s) + 1; W wyniku działania operacji V jeden proces jest reaktywowany (o ile taki był) 5 Teoria procesów współbieŜnych TWIERDZENIE: Efekt działania operacji P i V jest równowaŜny temu, Ŝe: np(s)=min(nw(s), C(s)+ns(s)) jest niezmiennikiem wykonań operacji P i V. Liczba zakończonych wykonań operacji P jest nie większa niŜ liczba wywołań tej operacji, jak i nie większa niŜ suma wartości początkowej semafora oraz liczby wykonań operacji V. 6 Dowód indukcyjny: np(s)=min(nw(s), C(s)+ns(s)) (1) np(s)= nw(s) < C(s)+ns(s) (2) lub np(s)=C(s)+ns(s) < nw(s) (3) lub np(s)=(nw(s) = C(s)+ns(s) (4) I) w stanie początkowym (1) wynika z definicji: np(s)= nw(s) = 0 i C(s)+ns(s)>=0 7 II) (1) prawdziwe i wykonanie operacji P(s) jeśli (2) to: (np(s)++, nw(s)++) np(s)= nw(s)<= C(s)+ns(s) jeśli (3) to: (nw(s)++) np(s)= C(s)+ns(s) < nw(s) jeśli (4) to: (nw(s)++) (4)=>(3) np(s)= C(s)+ns(s) < nw(s) P(s) – zachowuje niezmienniczość układu (2), (3), (4) 8 III) (1) prawdziwe i wykonanie operacji V(s) jeśli (2) to: (ns(s)++) np(s)= nw(s)< C(s)+ns(s) jeśli (3) to: (ns(s)++, np(s)++ ) np(s)= C(s)+ns(s) <= nw(s) jeśli (4) to: (ns(s)++) (4)=>(2) np(s)= nw(s) < C(s)+ns(s) V(s) – zachowuje niezmienniczość układu (2), (3), (4) 9 Poprawność semaforowego rozwiązania problemu wykluczania wzajemnego • ZałoŜenia: 1. NiemoŜliwe jest inne wejście do SK niŜ przez wykonanie operacji P; 2. NiemoŜliwe jest inne wyjście z SK niŜ przez wykonanie operacji V; 3. Po wykonaniu operacji P na pewno będzie wykonana w skończonym czasie operacja V (SK jest skończona i nie prowadzi do zakleszczenia) 10 • Do udowodnienia: 1. W danej chwili tylko jeden proces moŜe przebywać wewnątrz sekcji krytycznej; 2. śaden proces nie moŜe być zawieszany przy wejściu do sekcji krytycznej, jeśli nie ma w niej innego procesu. (1) np(s)= min(nw(s), C(s)+ns(s)) C(s)=1 => np(s)<=1+ns(s) (*) np(s) – l. procesów, które rozpoczęły wykonywanie SK ns(s) – l. procesów, które opuściły SK (2) (a) Zawieszenie procesu => np(s)< nw(s) z (*) np(s)=1+ns(s) (b) Pusta SK => np(s)=ns(s) ~((a)i(b)) 11 Dowód poprawności rozwiązania problemu producent-konsument var buf: array[1..N]of buffer lp:integer:=1; lk:integer:=1; pełny, pusty, wp,wk:semaphore:=0,N,1,1; procedure producent; begin repeat produkowanie jednostki wait (pusty) wait (wp) fill(buf[lp]);lp:=lp mod N +1; signal (wp); signal (pełny); end end procedure konsument; begin repeat wait (pełny) wait (wk) quit(buf[lk]); lk:=lk mod N +1; signal(wk); signal (pusty); end end 12 ZałoŜenia: ZałoŜenia 1. Operacje na buforze są dokonywane jedynie z procedur producent i konsument 2. O ile dowolny proces wykona pomyślnie obie operacje wait (P), to na pewno wykona równieŜ w skończonym czasie obie operacje signal(V) Do udowodnienia: 1. Dowolne dwa procesy konsumenta i producenta nigdy nie będą współpracowały jednocześnie z tym samym polem buforowym (lp i lk nie będą wskazywały na to samo pole) 2. Nie wystąpi przepełnienie buforu kolejnymi wiadomościami ani pobieranie z pustych pól 3. Nie wystąpi zakleszczenie 13 (1) Na buforze operacje mogą wykonywać co najwyŜej 2 procesy (producent i konsument) Po wait(pusty): //umieszczanie wiadomości w buforze ns(pełny) = np(pusty)-1 <= N +ns(pusty)-1 lp’=ns(pełny)+1 /ile razy zwiększano wartość lp Po wait(pełny): //odbieranie wiadomości z bufora np(pełny) = ns(pusty) + 1 <= ns(pełny) lk’=np(pełny) /ile razy zwiększano wartość lk Jeśli oba procesy jednocześnie współpracują z buforem: np(pełny) <= ns(pełny)<=N +ns(pusty)-1<=N + np(pełny)-2 -np(pełny) 0 <= ns(pełny)- np(pełny)<= N-2 +1 1 <= lp’ - lk’ <= N -1 lp i lk nie wskazują na to samo pole buforowe 14 (2) Aby nie było przepełnienia buforu (liczba wypełnień – liczba pobrań >N) ani niedomiaru (liczba pobrań> liczba wypełnień): 0 <= np(pusty)- np(pełny)<= N z producenta i twierdzenia: ns(pełny) <= np(pusty)<= N +ns(pusty) z konsumenta i twierdzenia: ns(pusty) <= np(pełny)<= ns(pełny) 15 (3) zakleszczenie: • Ŝaden producent nie przekazuje wiadomości: np(pusty)= ns(pełny) (x) • zawieszona dowolna liczba procesów producenta: np(pusty) < nw(pusty) (y) (x) i (y) => ns(pełny) = np(pusty) = N + ns(pusty) (o) • Ŝaden proces konsumenta nie współpracuje z buforem: np(pełny)= ns(pusty) (xx) • zawieszone procesy konsumenta np(pełny) < nw(pełny) (yy) (xx) i (yy) => ns(pusty) = np(pełny) = ns(pełny) (oo) (o) i (oo) – wykluczają się 16 Pięciu filozofów (1) var widelec: array[0..4] of recource; sem:array[0..4] of Boolean semaphore:=true; procedure filozof; begin repeat myślenie; wait(sem[name]); wait(sem[(name+1)mod 5]); request (widelec[name], widelec[(name+1)mod5]); jedzenie; release(widelec[name], widelec[(name+1)mod5]); signal(sem[name]); signal(sem[(name+1)mod 5]); end end 17 Pięciu filozofów (2) stany stan[i]=0 – myślenie stan[i]=1 – chęć jedzenia stan[i]=2 – jedzenie var widelec: array[0..4] of recource; sem: array[0..4] of Boolean semaphore:=false; stan: array[0..4] of integer:=0; /myślenie w: Boolean semaphore:=true; procedure test(k:integer); begin if stan[(k-1) mod 5]<>2 and stan[k]=1 and stan[(k+1) mod 5]<>2 then stan[k]:=2; signal(sem[k]); end end 18 Pięciu filozofów (2) procedure filozof; begin repeat myślenie; wait(w); stan[name]:=1; test(name); signal(w); wait(sem[name]); request (widelec[name],widelec[(name+1)mod5]); jedzenie; release(widelec[name],widelec[(name+1)mod5]); wait(w); stan[name]:=0; test((name+1)mod 5); test((name-1)mod 5); signal(w) end end; 19 Pięciu filozofów (3) jadalnia var widelec: array[0..4] of recource; sem:array[0..4] of Boolean semaphore:=true; jadalnia: semaphore:= 4; procedure filozof; begin repeat myślenie; wait(jadalnia); wait(sem[name]); wait(sem[(name+1)mod 5]); request (widelec[name], widelec[(name+1)mod5]); jedzenie; release(widelec[name], widelec[(name+1)mod5]); signal(sem[name]); signal(sem[(name+1)mod 5]); signal(jadalnia); end end 20 Pięciu filozofów (4) asymetryczne var widelec: array[0..4] of recource; sem:array[0..4] of Boolean semaphore:=true; procedure filozof4; begin repeat myślenie; wait(sem[0]); wait(sem[4]); request (widelec[0], widelec[4]); jedzenie; release(widelec[0], widelec[4]); signal(sem[4]); signal(sem[0]); end end Pozostali filozofowie wykonują kod (1) 21 Pięciu filozofów (1) – prawidłowa synchronizacja; moŜliwość zakleszczenia (2) - prawidłowa synchronizacja; bez zakleszczenia; moŜliwość zagłodzenia (3) - prawidłowa synchronizacja; bez zakleszczenia; bez zagłodzenia (4) - prawidłowa synchronizacja; bez zakleszczenia; bez zagłodzenia Inne rozwiązania • rozszerzone operacje semaforowe, • monitory • sieci Petriego 22 Warunki implementacji operacji semaforowych • Zapewnienie nieprzerywalności operacji semaforowych • Istnienie operacji zawieszenia i reaktywowania procesów poprzez bezpośredni dostęp do deskryptorów • Istnienie operacji kolejkowych Realizacja: • programowa (so) • sprzętowa (mikroprogramowe układy sterowania) 23 Modyfikacje operacji semaforowych • Rozszerzone operacje semaforowe – Jednoczesne – Uogólnione – Jednoczesne uogólnione – Agerwali – inne 24 Jednoczesne operacje semaforowe PD(s1,s2,…si,…,sn) zawieszenie procesu do czasu, gdy dla wszystkich si (i=1,…,n): si >0 for i:=1 to n do si:=si-1 end; VD(s1,s2,…si,…,sm) for j:=1 to m do sj:=sj+1 end; 25 Pięciu filozofów (5) var widelec: array[0..4] of recource; sem:array[0..4] of Boolean semaphore:=true; procedure filozof; begin repeat myślenie; PD(sem[name],sem[(name+1)mod 5]); request (widelec[name],widelec[(name+1)mod5]); jedzenie; release(widelec[name], widelec[(name+1)mod5]); VD(sem[name],sem[(name+1)mod 5]); end end 26 Uogólnione operacje semaforowe n – nieujemne całkowite wyraŜenie PN(s, n) zawieszenie procesu do czasu, gdy s>=n s:=s-n; VN(s) s:=s+n; 27 Czytający - piszący var w:semaphore:=M; procedure czytanie; begin repeat PN(w,1); czytanie; VN(w,1) end end procedure pisanie begin repeat PN(w,M); pisanie VN(w,M) end end pisanie – moŜliwe, gdy w=M (nie ma odczytu ani zapisu) czytanie – moŜliwe, gdy w>=0 (nie ma zapisu) 28 Czytający – piszący (2) var w,r:semaphore:=M; procedure czytanie; begin repeat PN(r,M); PN(w,1); VN(r,M-1); VN(r,1); czytanie; VN(w,1) end end procedure pisanie begin repeat PN(r,1); PN(w,M); pisanie; VN(w,M); VN(r,1); end end pisanie – wyŜszy priorytet 29 Jednoczesne uogólnione operacje semaforowe Cerf, Presser PA(s1,a1,s2,a2,…si,ai,sn,an) zawieszenie procesu do czasu, gdy dla wszystkich si (i=1,…,n): si > ai for i:=1 to n do si:=si-ai end; VA(s1,a1,s2,a2,…si,ai,sm,am) for j:=1 to m do sj:=sj+aj end; 30 operacje semaforowe Agerwali PE(s1,s2,…si,…sn;~sn+1,…,~sj,…,~sn+m) zawieszenie procesu do czasu, gdy dla wszystkich si (i=1,…,n): si > 0 i dla wszystkich sj (j=n+1,…,n+m): sj= 0 for i:=1 to n do si:=si-1 end; VE(s1,s2,…sk,…,sl) for k=1 to l do sk:=sk+1 end; 31 Czytający – piszący (2) var A,R,M:semaphore:=0,0,1; procedure czytanie; begin repeat PE(M;A); VE(M,R); czytanie; PE(R); end end procedure pisanie begin repeat VE(A); PE(M;R); pisanie; VE(M); PE(A); end end A – liczba procesów piszących, które chcą pisać R - liczba procesów czytających M – zapewnia wykluczanie 32