Zarządzanie procesami
Transkrypt
Zarządzanie procesami
{u}| q bufor w buforze – trzeba proces "producent" G o : 3 :1D 9 : 3 > o c b db ml k jf ` ] gf ih \ ^ \e a d d a c b a VW YZX ^ ] ` ^_ ^] \ [ U O & O T M $ $ , * RS "Q P N % M KL <2 E E / / 5 B : . -7 :D > : / : 0 B.D F :; 3 : ;. 3 C / 2 3 9 B : 0D > - 6 ? 5 C . > ?A JI> 7 B 2 < @ 0 @H < =-7 G drukarka, ale bez spool-ingu) = = : =-7 2 5 A B : . -7 H W 10/ < 1:89 . > :- 3 6 ? 5 . > =-7 <; . -7 5163 14/ 20 3 -. $ " ! ! " ' & " , " + ) * ( ' & " % $ # ! • procesy qz pxy proces "konsument" uwv uts gdy bufor pusty wstrzymuj konsumenta r 0 -7 - A 5 • <B 2 • przez ( pq u > 0 @H – u < =17n – u~ • zasobów krytycznych, czyli takich do problem producenta & konsumenta) : wstrzymuj producenta - <;: 7 9 6 7 78 5 >*= 0 3 5 7 6 2 l1: ax:= licznik l2: ax:= ax + 1 l3: licznik:= ax 3 56 -, 7 2 /0 * Proces P1: for i:=1 to 10 do begin licznik:=licznik+1 end )* ' ' Odp synchronizacja procesów odpowiednich momentach (i wznawianie) + 4 32 1 . -, Proces P0: for i:=1 to 10 do begin licznik:=licznik+1 end + + + • % $# # " ! • • &% • • ( $ z dzielenie" peracyjnej zasobem krytycznym) P0 i P1 licznik:=0 l1: ax:= licznik l2: ax:= ax + 1 l3: licznik:= ax P0 i P1 licznik=20 # B < & & ! B $ $E " $ < # " &D & $ ! B & to jeden z nich zostanie wpuszczony • ograniczone czekanie & $ < # $ # B C " $ # $C # < = ? A@ $# # < $ < ; 1 31 7+ * , . 4 2 8 + 5 ) 71 7 8 , 2 *) * 8 ) 2 1 7+ 3. - 8 1 7 8 , 8 2 , : 9 + 1 ) + 1 3+ * * 3 + 71 *) * 2 . - , ) 2 / 1 0 + 2 / -., + ) 2 6 5 - , 3+ * 4 *) 3 * * – mamy n procesów: P0, P1, ... , P{n-1} zasobu krytycznego; – fragmenty te nazywamy sekcjami krytycznymi (np. w problemie prod&kons & " ' % ( # $ # (posiadany) przez co prod&kons, zmienna "licznik", lista elementów) "! – zasób krytyczny F # • => 7 – • • zasobu krytycznego = problem sekcji krytycznej def problemu sekcji krytycznej ia: • wzajemne wykluczanie procesów * '& *32/4 (+*) .-, 5/& 2 46 0 7& 5* %& (1 398 -0 : 71 ;& 1< 51 46 = 0& (1 &% 32/ & * 4 '(+*) 51 46 .-, 2 7& /& 0 5* $ Proces P0: repeat sekcja krytyczna ! #" ! #" i A: 0 kodzie programu ( 41 ) ; )1 @: & ' 5 A37 'B 41 @% & 1 C? ; (1 DE@ / - / D ) > - 9&@ ? – – 5@* FI3G H )& 6 K3J =82 NLK M & ;* 5* 0 ; 71 :1 4 (21 4 2 O 5 7?7 D :%9 *3/ - 0 * <0 ;* /& -; @; P @% R *3/ &2 %* 1 Q3; 7 (&@ 2 ST & 7 %1@ *2 -4 :1 4 ;* • • ) jej zadaniem jest wstrzymywanie procesu sek. kryt.) until false algorytm Petersena tylko dla 2 procesów P0 i P1 !!! – zmienne pomocnicze (globalne/ dzielone) : [zainicjowane zerami !] flag: array[0..1] of integer, turn: integer; algorytm Petersena aktywne czekanie (to wada !) until false " ! #! -% + + ! # 3 1 2 1 4+ ! $ ! % % 0 4 !$ - $ P0 i P1 ! ! # ! ! , #! # ! ! ! # . # + / ! # # ! " $ # ! • ograniczone czekanie – #! $ # " $ ! $ # ! $! ! " % ! # " $ ! # ! ! , + . ! # & ( - &' * ) ! • wzajemne wykluczanie • gdy P0 przebywa w sekcji krytycznej a P1 • gdy P0 i P1 • – flag[1]=1 and turn=0) i (flag[0]=1 and turn=1 # until false flag[1]:=1; turn:=1; while flag[0]=1 and turn=1 do nic; sekcja krytyczna flag[1]:=0; flag[0]:=1; turn:=0; while flag[1]=1 and turn=0 do nic; sekcja krytyczna flag[0]:=0; Proces P1: repeat Proces P0: repeat P0 i P1 !) ( E D C , A ; : B A , 9 M P J O H N F T T H OT M N M S J F O G MJ JH L @ < : = 2 ? : 1 ./ < + K F F R L J Q H H G 1. procesor wykonuje P1 2. P0 wchodzi do sekcji krytycznej (turn=0) 3. procesor wraca do P1 F = P0 i P1 9 * 2 = <* J+ I : F 1 ; 3 89 7 + 5 34 + - 6 1 . 2- - 0 > until false . ./ ,- until false * ) + %&$ $ turn:=1; flag[1]:=1; while flag[0]=1 and turn=1 do nic; sekcja krytyczna flag[1]:=0; turn:=0; flag[0]:=1; while flag[1]=1 and turn=0 do nic; sekcja krytyczna flag[0]:=0; Proces P1: repeat Proces P0: repeat # " ! ' drobna zmiana w algorytmie Petersena • algorytm Petersena c.d. P0 : 1 ? 8 4 < @ + 6 .*1 : - .51 2 < 9 ; 82 2 4 6 - @A9? D D D 03 2 /2 .G4 C? F ) ; - 4 3 )>* = 7.6 4 2 : 5 < ; ? ;() ) * 9 6 * ) 2 + : - i krytycznej 32 ) - ;() H D 0 6 C - 1 ()* 0 9 8 ? ) C ! 7.6 4 - 6 E D ? 5.1 32 4 8 0 9 2.1 ( * 0 C 3 - , * ? 0/ -.+, 4 B, ()* / * – – w obszarze sek. kryt & $ %& !" $# ' • • 4 K + 6 @ * 2 D 0 ; C ? ) 6 E D ? J - : * 4 GF B ) 32 ; 2 B G / * - 4 G I.29 32 – intel 8086: cli -przerwania zakazane, sti –przerwania dozwolone sek.kryt. zasobu B – Q 9 * ? 0 < 62 * ;( C Proces Pi: repeat * 9 * ? 0 < 62 * C while TestAndSet(zamek) do nic; sekcja krytyczna zamek:=false; ;( def rozkazu TestAndSet: function TestAndSet(var cel:boolean) :boolean; begin TestAndSet:=cel; cel:=true; end R VUST : zamek:=false; NOP LM specjalne rozkazy procesora, np. TestAndSet(): * l k Vgf ` ^e\ c d ^b` Y Z Z` ] _ ^]\ V[Z until false e Y hi cj a [ aY ] .YX Uwaga 1 Uwaga 2: nie ma gwarancji ograniczonego czekania ! W • problem producenta/ konsumenta • aktywnym czekaniem ilosc bufor proces "producent" proces "konsument" czyt pisz n Proces Producent: repeat produkuje element "elem" while ilosc=n do nic; bufor[pisz]:=elem; pisz:=(pisz+1) mod n; ilosc:=ilosc+1; until false Proces Konsument: repeat while ilosc=0 do nic; elem:=bufor[czyt]; czyt:=(czyt+1) mod n; ilosc:=ilosc-1; konsumuje element "elem" until false wzajemne wykluczanie !!! (to jest sekcja krytyczna) 1 B 18 ( % F G IJ 9 M T%S R H QM U QM E F P N V A HB F : F N < • E K M OJ 9 E F P N A HB F : F N < E L K M OJ L E B CB ? < mamy n- procesów P0, P1, ..., P{n-1 sekcji krytycznej ... zmienne globalne: wybrane: array[0..n-1] of boolean numer: array[0..n-1] of integer specjalna relacja "<": (a,b) < (c,d) a<c lub (a=c i b<d) • ' 1 &0 ; H G D % F D 2 )( # 0 7 # % & ) => % A @ " 0 2 ' ; : 9 • , ( !' dla wielu procesów 5 0 2 3 / * & + 2 # % 0 / 1 + .( 6 5 % 2 ' ' ( # , ! 2 0 , 0 -, ( ) *+ % ( # ! ) !2 ) 4 !" • &' % $ # algorytm piekarni Pi: W wybrane[i]:=prawda; numer[i]:=max(numer[0], numer[1], ..., numer[n-1])+1; ; for k:=0 to n-1 do numer[i]:=0; begin while wybrane[k] do nic; while numer[k]<>0 and (numer[k],k)<(numer[i],i) do nic; end; Pi: I I I < 7 5 8 3 @ 8 D < 6 E = 5 8 ; nieminimalnych) < H< 9 7 < 38 7 6 F < ? 5 : 7 ; C @ < < 9 8 ; 5 A 8 3 5 ; 8 ; ; C 3 8 G 7 6D DA ten sam numerek ! procesów ? (odp 8 = D8 5 8 @ 9 9 5 : 8 7 C :B : 4 3 5 ; B @ @ 9 ? 5 8 5 8 3 9 ? B 9 9 5 : 9 5 : ; C :B 8 7 5 A: @ 3 4 5 8 3 = : ? 8 9 A : = : ? 8 9 4 4 ; 8 – : =: 5 :< 9 =: > : 5 8 3 < : 9 87 6 5 : 5 ; 43 – – ? = – 7 4 % 2 . * / + )* ! # $ # " " 1 ( 0 # - , ( ' & • S [\ ^ ]X ^ X R U T _ T R ZO O R PYX T VWU SQR OPMN KL numer[i]:=0; wybrane[i]:=prawda; numer[i]:=max(numer[0], numer[1], ..., numer[n-1])+1; ; for k:=0 to n-1 do krytycznej procesów "mniejszych" od Pi begin while wybrane[k] do nic; while numer[k]<>0 and (numer[k],k)<(numer[i],i) do nic; end; J algorytm piekarni c.d. Pi: szy w sensie specjalnej relacji "<") znej to Pi: ! # # & $ ! # fun.sys % – " ! – nie ma w nich aktywnego czekania !!! fun.sys. lub przez ! – • semafor i monitor – do synchronizowania procesów (patrz: wstrzymywanie w problemie prod/kons lub w problemie sek. kryt.) semafor – • def semafora ogólnego " ! • wait(s) je li s>0 to s:=s-1; je li s=0 to wstrzymaj dzia anie procesu [wywo uj cego wait(s)] • signal(s) je li s procesy wstrzymane podczas wait(s) to wznów jeden z nich; je li nie ma to s:=s+1 • s:=i inicjowanie semafora warto ci "i" - 7 6 / 45 3 semafor FIFO/ semafor losowy: - ( $+ ) *+, ) $ (& % # 8 $ 0 &/ -. 0 - # # - +, 0 ( $ (- * 2 $1 $ 3 ; ) - 0 &/ -. + ( + 0 2, 9 : ) # *+, $ ( &'% – ch na sem." – FIFO: wznawiamy pierwszy w kolejce proces, a wstrzymywane umieszczamy na jej FIFO) – losowy: wznawiamy proces losowo wybrany z kolejki / 5 • • semafor przy pomocy semafora ogólnego – nie ma aktywnego czekania ! – je li to jest semafor FIFO to oprócz wzaj.wykl. i post pu mamy(?) gwarancje ograniczonego czekania ! # " ! until false # " ! wait(s); sekcja krytyczna signal(s); # " ! until false # " ! Proces P2: repeat wait(s); sekcja krytyczna signal(s); # " ! wait(s); sekcja krytyczna signal(s); # " ! : s:=1; Proces P1: repeat Proces P0: repeat until false * )( &' $% +, (patrz: nast pny slajd ...) • semafor until false wait(s); sekcja krytyczna signal(s); until false Proces P2: repeat wait(s); sekcja krytyczna signal(s); wait(s); sekcja krytyczna signal(s); : s:=1; Proces P1: repeat Proces P0: repeat until false je li s>0 to s:=s-1; je li s=0 to wstrzymaj dzia anie procesu [wywo uj cego wait(s)] signal(s) je li s procesy wstrzymane podczas wait(s) to wznów jeden z nich; je li nie ma to s:=s+1 s:=i inicjowanie semafora warto ci "i" wait(s) semafor proces "producent" 2 . , . (* ( 1 0 ., ./ . ) < 9 until false wait(w); zapis elementu do bufora signal(p); wait(p); odczyt elementu z bufora signal(w); until false Proces Producent: repeat Proces Konsument: repeat 87 56 34 :; . + , + ) (* '( w buforze – trzeba mamy 2 semafory: w i p : w:=rozmiar_bufora; p:=0; & % $ # wstrzymuj producenta "! bufor proces "konsument" gdy bufor pusty wstrzymuj konsumenta • przy pomocy semafora ogólnego ... • problem czytelników i pisarzy – ... istnieje czytelnia oraz dwie kategorie osób: czytelnicy i pisarze; w danej chwili w czytelni mo e przebywa dowolna liczba czytelników lub dok adnie jeden pisarz – (jest to abstrakcja problemu dost pu do bazy danych) – jak to rozwi za przy pomocy semaforów ogólnych ? $ ! # " ! mamy dwa semafory ogólne R i W; R:="rozmiar czytelni", W:=1 operacja zajmowania miejsc w czytelni % % % & pisarz wychodzi for i:=1 to "rozmiar czytelni" do signal(R); signal(W); czytelnik wychodzi signal(R); pisarz wchodzi wait(W); for i:=1 to "rozmiar czytelni" do wait(R); czytelnik wchodzi wait(R); wait(W)/signal(W) ? [zakleszczenie] problem 5 filozofów – Pi ciu g odnych filozofów siedzi przy okr g ym stole, przy talerzach z ryb . Aby je ryb potrzebne s 2 widelce, jednak mi dzy dwoma s siednimi filozofami le y tylko 1 widelec. – Wszyscy filozofowie na przemian my l i jedz (w niesko czonej p tli). – Zauwa my e wprowadzenie wzajemnego wykluczania dla ka dego widelca nie rozwi zuje problemu: mo e si zdarzy e wszyscy filozofowie zaczn podnosi widelce pocz wszy od lewego - wtedy nie bed mogli podnie prawego widelca - wyst pi tzw zakleszczenie ... – jak to rozwi za ? Odp: ograniczy liczb filozofów równocze nie próbuj cych je (przy pomocy semafora ogólnego) • % % % - ) & % % % ) ( , - & + ( * & ) % ( ' ' & ' % – sem – sem ! ! $ # ! • wait(s) je li s=1 to s:=0; je li s=0 to wstrzymaj dzia anie procesu [wywo uj cego wait(s)] • signal(s) je li s procesy wstrzymane podczas wait(s) to wznów jeden z nich; je li nie ma to s:=1 • s:=i inicjowanie semafora warto ci 0 lub 1 " • signal() • problemy z semaforami: – + – – – semafor binarny • def semafora binarnego • semafor binarny c.d. – tylko konsument musi przy pomocy semafora binarnego ' / ' % $ "# ! . % ' *-$ +% % until false , ! = ) % D ? - . % D ? = C 0 = C 1 ! % . AB B& =, 1 G@, ! % . +- ) % ' 1 ? ) : 1B + %&$ *)( until false , ! / . % ' *-$ , ! +% % ) ( ! "# Proces Konsument: ); repeat wait(S); { odczyt elementu z bufora i jego konsumpcja } N:=N-1; signal(S); ); if N=0 then ' ); -A +- - - 9 ! ' ?@, ! % . : ? ,B 1 % 9 ' -> , =*$ <*; -1 F &%$ "# 1 2 Proces Producent: repeat wait(S); { produkuje element i zapisuje do bufora } N:=N+1; if N=1 then signal(S); ,&0 ? 9 % < E % : 1 9& -1 % : 1 9& + + 8&7 6&5 4*3 mamy semafory binarne: y a S– zmienne pomocnicze: N –zainicjowana 0; jest to liczba nieskonsumowanych elementów w buforze % $ • semafor binarny c.d. i )*" ( ' & " ! " N=0; procesor 0 /$ # $ "! -! 1. konsumenta przy pomocy sem. bin. " . " ! %23 " " " /$ ," . - ! , + ( ( . + ( 675 8 8 " ! 23 5 " => E B DC " G G 0G - ! 0 < until false : ! " , + ; until false ! $ < 0 : ! " , + ; " 23 F " ! %23 " 1 $ @A? 8 8 " ! $ " 23 8 , ( ' & % :. - 9 $ $ $ 9 4 " ! 3 " $ " ! $ " 23 8 4 " ! 3 1$ + ( " ," . , + ( w zaznaczonym punkcie ... ), 2. producent produkuje nowy element przy czym wykonuje N=1, 3. konsument NIE wykona ) bo N<>0 ) 4. konsument konsumuje (ostatni) element z bufora, wykonuje – ale NIE zostanie wstrzymany bo !!! 5. Proces Konsument: programowanie Proces Producent: ); repeat repeat semaforów wait(S); wait(S); { produkuje element jest trudne ... { odczyt elementu z bufora i zapisuje do bufora } i jego konsumpcja } N:=N+1; N:=N-1; ); if N=1 then signal(S); signal(S); ); if N=0 then procedurach monitora - sekcje krytyczne # C E @ A B ? > $ = <; : – W danej chwili tylko jeden C $ # D #$ 9 # 8 # 7 – . +, 23 6 5 4 - ( 0 1 /0 - '( & monitor semaforX var x: integer; c:condition; procedure waitX(); begin if x=0 then waitc(c) else x:=x-1; end; procedure signalX(); begin if empty(c) then x:=x+1 else signalc(c); end; end; )* % warunki: BACI } #$ " – • ! • monitory def monitora: . w monitorze (tj tora), <0 = = 1 - 8 9 / 5 = 4 - = = 8 5 ; 2 8 > = = / = 0 5 ; - ; - <0 1 - 89 5 89 1 : / 7 proces zostanie wstrzymany i umieszczony / 5 6 ; 56 ten inny kolejki procesów jest 4 -. / / / 2 3 / , * ) ( & • – Gdy monitor jest '( / 1 / 0 / -. +, ) / ! *' & $ & $%# " ! • wstrzymywania i wznawiania monitora przy pomocy zmiennych typu condition waitc()" oraz "signalc()". – Po wykonaniu waitc(c) gdzie "c" jest zmienna typu conditon proces jest or jest zwalniany – Po wykonaniu signalc(c) budzony jest jeden z procesów wybrany losowo z signalc()" jest usypiany i umieszczany – sta przy pomocy "empty(c)". – / – • monitory c.d. def monitora c.d: monitora) conditon. monitory c.d. monitory c.d. • przy pomocy monitorów: Kons,Prod:condition; {kolejki wstrzymanych konsumentów i producentów} procedure WstawElement(el:integer); {PRODUCENT} begin if W=0 then waitc(Prod); {wstaw "el" do bufora} W:=W-1; P:=P+1; signalc(Kons); end; procedure OdczytajElement(var el:integer); {KONSUMENT} begin if P=0 then waitc(Kons); {odczytaj element "el" z bufora} W:=W+1; P:=P-1; signalc(Prod); end; end; 1 / *0 ( -., " ( + & % * % & ()' $ # " ! monitor ProdKons; var {deklaracje bufora i jego indeksów ...} P,W:integer; prod & kons): + )( $ % * ) '&% ( !" !# $" – Linux Java, monitor01.java – • monitory c.d. pthread", monitor01.cc