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