11. előadás Szinkronizációs feladatok. Az Ada taszkok (2).

Slides:



Advertisements
Hasonló előadás
C# nyelvi áttekintő A „Programozás C# nyelven (Illés Zoltán)”
Advertisements


Kamarai prezentáció sablon
Készítette: Boros Erzsi
Algoritmusok.
1 Számítógépek felépítése 9. előadás I/O rendszerek.
A társadalmi tényezők hatása a tanulásra
Gyakorló feladatsor eljárásokra Készítette: Rummel Szabolcs Elérhetősé:
Erőállóképesség mérése Találjanak teszteket az irodalomban
MATEMATIKA Év eleji felmérés 3. évfolyam
Összefoglalás 1. Pascal program szerkezete 2. Pascal típusai
10 állítás a gyerekek internethasználatáról
6) 7) 8) 9) 10) Mennyi az x, y és z értéke? 11) 12) 13) 14) 15)
Az új történelem érettségiről és eredményeiről augusztus Kaposi József.
Utófeszített vasbeton lemez statikai számítása Részletes számítás
Rekurzió (Horváth Gyula és Szlávi Péter előadásai felhasználásával)
A tételek eljuttatása az iskolákba
Fejlett Programozási Technológiák II. Világos Zsolt 12. gyakorlat.
Ember László XUBUNTU Linux (ami majdnem UBUNTU) Ötödik nekifutás 192 MB RAM és 3 GB HDD erőforrásokkal.
VÁLOGATÁS ISKOLÁNK ÉLETÉBŐL KÉPEKBEN.
Védőgázas hegesztések
Ellenőrző kérdések a)Auto-indexing enabled b)Auto-indexing disabled c)Nem eldönthető 1.
1. IS2PRI2 02/96 B.Könyv SIKER A KÖNYVELÉSHEZ. 2. IS2PRI2 02/96 Mi a B.Könyv KönyvelésMérlegEredményAdóAnalitikaForintDevizaKönyvelésMérlegEredményAdóAnalitikaForintDeviza.
10. előadás Párhuzamos programozási kérdések. Az Ada taszkok (1).
C++ Alapok, első óra Elemi típusok Vezérlési szerkezetek
6. előadás Parametrikus polimorfizmus. Generikus programozás. Az Ada sablonok.
5. előadás Parametrikus polimorfizmus. Generikus programozás
12. előadás Szinkronizációs feladatok (2). Védett egységek. Álvéletlenszámok. OOP az Adában.
10. előadás Párhuzamos programozási kérdések. Az Ada taszkok (1).
6. előadás Hatókör, láthatóság, élettartam. Változók leképzése a memóriára. Blokkszerkezetes nyelvek. Kivételkezelés.
5. előadás Parametrikus polimorfizmus. Generikus programozás. Az Ada sablonok.
Programozás I. Ciklusok
Szerkezeti elemek teherbírásvizsgálata összetett terhelés esetén:
Sárgarépa piaca hasonlóságelemzéssel Gazdaság- és Társadalomtudományi kar Gazdasági és vidékfejlesztési agrármérnök I. évfolyam Fekete AlexanderKozma Richárd.
NOVÁK TAMÁS Nemzetközi Gazdaságtan
DRAGON BALL GT dbzgtlink féle változat! Illesztett, ráégetett, sárga felirattal! Japan és Angol Navigáláshoz használd a bal oldali léptető elemeket ! Verzio.
Merre tovább? Tapasztalatok a kétszintű latin nyelvi érettségiről.
szakmérnök hallgatók számára
Logikai szita Pomothy Judit 9. B.
Logikai szita Izsó Tímea 9.B.
Alprogramok deklarációja, definíciója és meghívása Páll Boglárka.
LENDÜLETBEN AZ ORSZÁG A Magyar Köztársaság kormánya.
2007. május 22. Debrecen Digitalizálás és elektronikus hozzáférés 1 DEA: a Debreceni Egyetem elektronikus Archívuma Karácsony Gyöngyi DE Egyetemi és Nemzeti.
Tömbök és programozási tételek
7. Házi feladat megoldása
A pneumatika alapjai A pneumatikában alkalmazott építőelemek és működésük vezérlő elemek (szelepek)
Csurik Magda Országos Tisztifőorvosi Hivatal
A klinikai transzfúziós tevékenység Ápolás szakmai ellenőrzése
2006. Peer-to-Peer (P2P) hálózatok Távközlési és Médiainformatikai Tanszék.
Tanulói utánkövetés 2009/2010. A 2009/2010-es tanévben iskolánkban 210 tanuló végzett. 77 fő a szakközépiskola valamelyik tagozatán 133 fő szakmát szerzett.
QualcoDuna interkalibráció Talaj- és levegövizsgálati körmérések évi értékelése (2007.) Dr. Biliczkiné Gaál Piroska VITUKI Kht. Minőségbiztosítási és Ellenőrzési.
Termelő-fogysztó modell. A probléma absztrakt megfogalmazása: informális leírás. Adott egy N elemű közösen használt tároló, N  1. Adott a folyamatoknak.
Objektum orientált programozás
1. Melyik jármű haladhat tovább elsőként az ábrán látható forgalmi helyzetben? a) A "V" jelű villamos. b) Az "M" jelű munkagép. c) Az "R" jelű rendőrségi.
Párhuzamosság, kritikus szakasz, szemaforok Operációs rendszerek.
BINÁRIS FA Definició: A fa olyanösszefüggő gráf, amelyben nincs kör
A Visual Basic nyelvi elemei
> aspnet_regiis -i 8 9 TIPP: Az „Alap” telepítés gyors, nem kérdez, de később korlátozhat.
A KÖVETKEZŐKBEN SZÁMOZOTT KÉRDÉSEKET VAGY KÉPEKET LÁT SZÁMOZOTT KÉPLETEKKEL. ÍRJA A SZÁMOZOTT KÉRDÉSRE ADOTT VÁLASZT, VAGY A SZÁMOZOTT KÉPLET NEVÉT A VÁLASZÍV.
A TÁRSADALMI JÓL- LÉT KÉRDÉSEINEK ÖSSZEHASONLÍTÁSA EGYES SZOLGÁLTATÓ SZEKTOROKBAN Készítette: Folmegné Czirák Julianna
1 Az igazság ideát van? Montskó Éva, mtv. 2 Célcsoport Az alábbi célcsoportokra vonatkozóan mutatjuk be az adatokat: 4-12 évesek,1.
Adva S  parbegin S 1 ...  S n parend; Párhuzamos programszerkezet két vagy több olyan folyamatot tartalmaz, amelyek egymással közös változó segítségével.
Kommunikáció és szinkronizáció. 1.) Kommunikáció: Lehetőség arra, hogy egyik folyamat befolyásolja a másik folyamat lefutását. Kommunikáció eszközei: közös.
5. előadás Parametrikus polimorfizmus. Generikus programozás. Az Ada sablonok.
Excel programozás (makró)
Félcsoport (semigroup) = ({s},{ *: s s  s [infix]}. semigroup is a type specification = sorts: s oprs: *: s s  s [infix] eqns: m 1, m 2, m 3  s (m 1.
11. előadás Szinkronizációs feladatok. Az Ada taszkok (2).
12. előadás Szinkronizációs feladatok (2). Védett egységek
10. előadás Párhuzamos programozási kérdések. Az Ada taszkok (1).
Szálszinkronizáció.
Előadás másolata:

11. előadás Szinkronizációs feladatok. Az Ada taszkok (2).

2 Szinkronizációs feladatok n Bizonyos erőforrásokat nem szabad konkurrensen használni n Biztosítsuk, hogy egyszerre csak egy taszk használja n Kritikus szakasz, kölcsönös kizárás n Szemafor, monitor, író/olvasó, termelő/fogyasztó, evő és ivó filozófusok

3 Kritikus szakasz n Critical section n Egy tevékenységsorozat a taszkon belül – Például bizonyos erőforrások használata n Garantáljuk, hogy egyszerre csak egy taszk van a kritikus szakaszában n Olyan, mint amikor egy sínszakaszt védünk attól, hogy több vonat is ráhajtson n Egy megoldás: szemafor

4 Szemafor n E.W. Dijkstra, 1968 n Belépés a kritikus szakaszba, ha a P művelet megengedi n Kilépéskor a V művelettel a szemafort szabadra állítjuk n P = passeren (áthaladni) V = vrijmaken (szabaddá tenni)

kritikus szakasz előtti utasítások Szemafor.P; -- blokkol: megvárjuk, amíg beenged kritikus szakasz utasításai Szemafor.V; kritikus szakaszok közötti utasítások Szemafor.P;...-- kritikus szakasz utasításai Szemafor.V; kritikus szakasz utáni utasítások Szemaforral védett kritikus szakaszok

6 Blokkoló utasítás n A szemafor P művelete felfüggeszti a hívó folyamatot, amíg az út szabaddá nem válik n A hívó folyamat blokkolódik, vár a P hívás befejeződésére n Az Ada implementációban ezt egy randevúval írhatjuk le a legkényelmesebben

7 task Szemafor is entry P; entry V; end Szemafor; task body Szemafor is begin loop accept P; accept V; end loop; end Szemafor; Szemafor Ada taszkkal megvalósítva

8 Probléma a szemaforral n A szemafor nagyon alacsony absztrakciós szintű eszköz n Könnyű elrontani a használatát n Akár a P, akár a V művelet meghívását felejtjük el, a program megbolondul n Nem lokalizált a kód, sok helyen kell odafigyeléssel használni

9 Kölcsönös kizárás n A szemafor segítségével kritikus szakaszokat tudunk leprogramozni n Csak egy folyamat tartózkodhat a kritikus szakaszában n A kritikus szakaszra (a kritikus erőforráshoz való hozzáférésre) kölcsönös kizárást (mutual exclusion) biztosítottunk

10 Monitor n C.A.R. Hoare, 1974 n Egy másik eszköz a kölcsönös kizárás biztosítására n Sokkal magasabb szintű, mint a szemafor n Az objektum-elvű szemlélethez illeszkedik n A kritikus adatokhoz való hozzáférés csak a szinkronizált műveleteken keresztül – egységbe zárás (encapsulation) – adatelrejtés n Megvalósítás: feltételváltozó, wait, signal n Java

11 Egy monitor Ada taszkkal task Kizáró is entry Kiír( Str: String ); end Kizáró; task body Kizáró is begin loop accept Kiír(Str: String) do Ada.Text_IO.Put_Line(Str); end Kiír; end loop; end Kizáró; kritikus tevékenység

12 Monitorok és az Ada n Ha nem csak egy művelete van? – select utasítás – Bonyolultabb implementáció... n Van speciális nyelvi elem, amivel még könnyebb ilyeneket csinálni: védett egységek n A kölcsönös kizárásnál megengedőbb szinkronizáció? – író-olvasó feladat? – evő vagy ivó filozófusok?

13 Monitor versus Szemafor n A monitor magasabb szintű eszköz n A szemaforokkal rugalmasabban készíthetők kritikus szakaszok – nem kell előre elkészíteni az összes kritikus szakaszt – több kritikus erőforrás használatát könnyebb kombinálni egy kritikus szakaszon belül

14 A select utasítás n A hívóban is és a hívottban is szerepelhet n A randevúk szervezéséhez segítség n Többágú hívásfogadás n Feltételhez kötött hívásfogadás n Időhöz kötött hívásfogadás n Nem blokkoló hívásfogadás n Termináltatás n Időhöz kötött hívás n Nem blokkoló hívás n „Aszinkron select”

15 Többágú hívásfogadás select accept E1 do... end E1; -- esetleg egyéb utasítások or accept E2; -- itt is or accept E3( P: Integer ) do... end E3; -- itt is end select; n A hívott választ egy hívót valamelyik várakozási sorból n Ha mindegyik üres, vár az első hívóra: bármelyik randevúra hajlandó

16 Több műveletes monitor task body Monitor is Adat: Típus;... begin loop select accept Művelet_1(... ) do... end; or accept Művelet_2(... ) do... end;... end select; end loop; end;

17 Végtelen taszk n Az előző taszk végtelen ciklusban szolgálja ki az igényeket n Sosem ér véget n A szülője sem ér véget soha n Az egész program „végtelen sokáig” fut n Ha már senki sem akarja használni a monitort, akár le is állhatna...

18 Termináltatás n A select egyik ága lehet terminate utasítás – Csak így szerepelhet terminate egy Ada programban n Ha már senki nem akarja használni, akkor termináljon – Ez azt jelenti, amit az előbb mondtunk n Emlékezzünk vissza a terminálási szabályokra n Akkor „választódik ki” a terminate ág, ha már soha többet nem jöhet hívás az alternatívákra

19 A terminate használata select accept E1; or accept E2(... ) do... end; or accept E3 do... end; or terminate; end select;

20 Egy taszk terminál, ha n komplett, és az összes tőle függő taszk terminált már; n abnormális állapotba jutott és törlődött a várakozási sorokból; n terminate utasításhoz ért, és a taszk olyan programegységtől függ, amely már komplett, és a leszármazottai termináltak már, komplettek, vagy szintén terminate utasításnál várakoznak;

21 task body Monitor is Adat: Típus;... begin loop select accept Művelet_1(... ) do... end; or accept Művelet_2(... ) do... end;... or terminate; end select; end loop; end; A monitor javítva

22 Feltételhez kötött hívásfogadás n A select egyes ágaihoz feltétel is rendelhető n Az az ág csak akkor választódhat ki, ha a feltétel igaz select accept E1 do... end; or when Feltétel => accept E2 do... end;... end select;

23 A feltétel használata n A select utasítás végrehajtása az ágak feltételeinek kiértékelésével kezdődik n Zárt egy ág, ha a feltétele hamisnak bizonyul ebben a lépésben n A többi ágat nyitottnak nevezzük n A nyitott ágak közül nem-determinisztikusan választunk egy olyat, amihez van várakozó hívó n Ha ilyen nincs, akkor várunk arra, hogy valamelyik nyitott ágra beérkezzen egy hívás n Ha már nem fog hívás beérkezni, és van terminate ág, akkor lehet terminálni (terminálási szabályok) n A feltételek csak egyszer értékelődnek ki

24 Általánosított szemafor (1) task type Szemafor ( Max: Positive := 1 ) is entry P; entry V; end Szemafor; n Maximum Max számú folyamat tartózkodhat egy kritikus szakaszában

25 Általánosított szemafor (2) task body Szemafor is N: Natural := Max; begin loop select when N > 0 => accept P; N := N-1; or accept V; N := N+1; or terminate; end select; end loop; end Szemafor;

26 Általánosított szemafor (3) task body Szemafor is N: Natural := Max; begin loop select when N > 0 => accept P do N := N-1; end P; or accept V do N := N+1; end V; or terminate; end select; end loop; end Szemafor;

27 A randevú ideje n Érdemes a randevút olyan rövidre venni, amilyen rövid csak lehet n Csak a kommunikáció, meg ami még muszáj... n Rövid ideig tartjuk csak fel a hívót, a randevú után megint működhetnek aszinkron módon a folyamatok („konkurrensen”) n Kivétel: szimulációs feladatok, amikor épp azt akarjuk szimulálni, hogy a két fél „együtt csinál valamit”

28 Időhöz kötött hívásfogadás n Ha nem vár rám hívó egyik nyitott ágon sem, és nem is érkezik hívó egy megadott időkorláton belül, akkor hagyjuk az egészet... n Tipikus alkalmazási területek – timeout-ok beépítése (pl. holtpont elkerülésére) – ha rendszeres időközönként kell csinálni valamit, de két ilyen között figyelni kell a többi taszkra is

29 select accept E1; or when Feltétel => accept E2 do... end; or delay 3.0; -- esetleg egyéb utasítások end select; n A delay után Duration típusú érték van Időhöz kötött hívásfogadás: példa

30 loop select when Feltétel => accept E do... end; or delay 3.0; end select; end loop; n Rendszeresen újra ellenőrzi a feltételt, hátha megváltozott (egy másik folyamat hatására) Timeout: egy másik példa

31 Rendszeres tevékenység n Óránként egyszer kell csinálni valamit – pl. naplózni n Közben randevúzgatni kell a hívókkal n delay until utasítás n Használhatjuk az idő kezelésére az Ada.Calendar predefinit csomagot

32 task body Rendszeres is T: Time := Clock + 3.0; begin loop select accept Randevú do … end Randevú; or delay until T; T := T + 3.0; Rendszeres_Tevékenység; end select; end loop; end Rendszeres; Rendszeres tevékenység: példa

33 Nem blokkoló hívásfogadás n Ha most azonnal nem akar velem egy hívó sem randevúzni, akkor nem randevúzom: nem várok hívóra, futok tovább... n Csak a hívó blokkolódjon n Tipikus alkalmazási területek – Valamilyen számítás közben egy jelzés megérkezését ellenőrzöm – Rendszeres időközönként randevúzni vagyok hajlandó, de egyébként valami mást csinálok – Holtpont elkerülése (kiéheztetés veszélye mellett)

34 select accept E1; or when Feltétel => accept E2 do... end; else Csináljunk_Valami_Mást; end select; n Ha minden nyitott ág várakozási sora üres, akkor csináljunk valami mást Nem blokkoló hívásfogadás: példa

35 select accept E1; or when Feltétel => accept E2 do... end; else delay 3.0; -- nem csinálunk semmit 3 mp-ig end select; n Nem ugyanaz, mint az időhöz kötött hívásfogadás! Egy szimulációban előfordulhat

36 loop select accept E1; else null; end select; end loop; accept E1; A „busy waiting” nem szerencsés busy waiting ugyanaz blokkolással

37 Időhöz kötött hívás n A hívóban szerepel „or delay” a select utasításban n Ilyen select-ben csak két ág van – a hívást tartalmazó – és az időkorlátot megadó (timeout) select Lány.Randi; -- és esetleg egyéb utasítások or delay 3.0; -- és esetleg egyéb utasítások end select;

38 Nem blokkoló hívás n A hívóban szerepel else ág a select utasításban n Ilyen select-ben csak két ág van – a hívást tartalmazó – és az alternatív cselekvést megadó select Lány.Randi; -- és esetleg egyéb utasítások else Csináljunk_Valami_Mást; end select;

39 Aszinkron select n Megszakítható tevékenység megadása n Megszakítás: – időkorlát – esemény (sikeres hívás) n Nagy számításigényű tevékenység abortálása n Ada 95

40 Aszinkron select: példa (időkorlátos) select delay 5.0; Put_Line("Calculation does not converge"); then abort -- This calculation should finish in 5.0 seconds; -- if not, it is assumed to diverge. Horribly_Complicated_Recursive_Procedure(X, Y); end select;

41 Aszinkron select: példa (fiús) loop select Terminal.Wait_For_Interrupt; Put_Line("Interrupted"); then abort -- This will be abandoned upon terminal interrupt Put_Line("-> "); Get_Line(Command, Last); Process_Command(Command(1..Last)); end select; end loop;

42 A select összefoglalása (1) n Hívóban is és hívottban is lehet – de hívóban legfeljebb egy „or delay” vagy egy „else” ágat tartalmazhat a híváson kívül (kivéve az aszinkron select esetét) – a hívottban több alternatív ág is lehet, esetleg feltétellel – egy select-en belül nem lehet a taszk hívó is és hívott is n or delay: időkorlát szabása n else: blokkolás kiküszöbölése n terminate: a hívott termináltatása, ha már senki nem fogja hívni

43 A select összefoglalása (2) n Az or-ral elválasztott ágak első utasítása – accept – when Feltétel => accept – delay – terminate n Utánuk bármi lehet még az ágban n Az else ágban bármi lehet n A hívottban legfeljebb egy lehet az „or delay”, a „terminate” és az „else” közül n A hívóban még szigorúbb szabályok...

44 Kivételek n Taszkok törzse is tartalmazhat kivételkezelő részt n Taszkokkal kapcsolatos predefinit kivétel Tasking_Error n Ha a főprogramot kivétel állítja le: kiíródik n Ha más taszkot kivétel állít le: csendben elhal

45 Kivételek terjedése n A taszkok egy „processzen” belül n Közös memória (oprendszer) n Minden taszknak saját végrehajtási verem n Az automatikus változók így szeparáltak n A kivételek terjedése: a végrehajtási verem felgöngyölítésével n A kivételek egy-egy taszkra hatnak

46 Mikor hol? n Ha kivétel lép fel taszk indításakor, akkor a szülőjében Tasking_Error váltódik ki – deklarációs: a szülő begin-je után közvetlenül – allokátoros: az allokátor kiértékelésének helyszínén n Ha komplett/abnormális/terminált taszk belépési pontját hívjuk, a hívóban Tasking_Error váltódik ki a hívás helyszínén n Ha egy randevú kivétellel zárul, akkor a kivétel mindkét randevúzó félre átterjed

47 Termelő-fogyasztó feladat n Egy folyamat adatokat állít elő, egy másik adatokat dolgoz fel n Kommunikáció: egy adatokat tartalmazó sor – Termelő => sor => fogyasztó – Levelesláda, futószalag; a Tároló általánosítása – Aszinkron kommunikáció n Korlátos vagy korlátlan sor (buffer) n Általánosítás: több termelő, több fogyasztó

48 Termelő folyamat task type Termelő ( Sor: Sor_Access ); task body Termelő is Adat: Típus; begin … loop Előállít( Adat ); Betesz( Sor.all, Adat ); end loop; end Termelő;

49 Fogyasztó folyamat task type Fogyasztó ( Sor: Sor_Access ); task body Fogyasztó is Adat: Típus; begin … loop Kivesz( Sor.all, Adat ); Feldolgoz( Adat ); end loop; end Fogyasztó;

50 A sor (buffer, FIFO) n Több folyamat használja egyidőben n Közös változó n Védeni kell, például monitorral (blokkolhatjuk a termelőket/fogyasztókat) – Ha üres, nem lehet kivenni belőle – Ha tele van (korlátos eset), nem lehet beletenni – Egy időben egy műveletet lehet végrehajtani n Ha több elem van benne, esetleg lehet Betesz || Kivesz

51 Szálbiztos sor n Osztott_Sorok sabloncsomag: – Sor típus – Szálbiztos (taszkok közötti kommunikációhoz) – Támaszkodik a Sorok-ra – Plusz szinkronizációs aspektus (monitor) n Sorok sabloncsomag: – Sor típus – Hagyományos, nem szálbiztos

52 Taszkok elrejtése (1) generic type Elem is private; package Osztott_Sorok is type Sor(Max_Méret: Positive) is limited private; procedure Betesz( S: in out Sor; E: in Elem ); procedure Kivesz( S: in out Sor; E: out Elem ); private task type Sor( Max_Méret: Positive) is entry Betesz( E: in Elem ); entry Kivesz( E: out Elem ); end Sor; end Osztott_Sorok; megvalósítás : monitorral

53 with Sorok; package body Osztott_Sorok is procedure Betesz( S: in out Sor; E: in Elem ) is begin S.Betesz(E); end; procedure Kivesz( S: in out Sor; E: out Elem ) is begin S.Kivesz(E); end; task body Sor is … end Sor; end Osztott_Sorok; Taszkok elrejtése (2)

54 task body Sor is package Elem_Sorok is new Sorok(Elem); use Elem_Sorok; S: Elem_Sorok.Sor(Max_Méret); begin loop … end loop; end Sor; Taszkok elrejtése (3)

55 loop select when not Üres(S) => accept Betesz( E: in Elem ) do Betesz(S,E); end Betesz; orwhen not Tele(S) => accept Kivesz( E: out Elem ) do Kivesz(S,E); end Kivesz; orterminate; end select; end loop; Taszkok elrejtése (4)

56 Az evő filozófusok problémája n Dijkstra: dining philosophers n Erőforráshasználat modellezése – Erőforrások: villák – Folyamatok: filozófusok n Holtpont kialakulása n Általánosítás: ivó filozófusok

57 Holtpont n Deadlock n Ha a folyamatok egymásra várnak n Tranzakciók n Elkerülés – Például a szimmetria megtörésével n Erőforrások lekötése rendezés szerint n Véletlenszerű időkorlátok n Felismerés és megszüntetés (abort)

58 A villák (erőforrások) modellezése task type Villa is entry Felvesz; entry Letesz; end Villa; task body Villa is begin loop accept Felvesz; accept Letesz; end loop; end Villa;

59 A filozófusok (folyamatok) Villák: array (1..5) of Villa; task type Filozófus ( Bal, Jobb: Positive ); Platon: Filozófus(1,2); Arisztotelész: Filozófus(2,3); Descartes: Filozófus(3,4); Kant: Filozófus(4,5); Hegel: Filozófus(5,1);

60 Az erőforrások lekötése rendezés szerint task body Filozófus is Kisebb: Positive := Positive’Min(Bal, Jobb); Nagyobb: Positive := Positive’Max(Bal, Jobb); begin loop -- gondolkodom Villák(Kisebb).Felvesz; Villák(Nagyobb).Felvesz; -- eszem Villák(Kisebb).Letesz; Villák(Nagyobb).Letesz; end loop; end Filozófus; Blokkolhatna k

61 Véletlenszerű időkorlát (1) task body Filozófus is procedure Éhes_Vagyok is … end Éhes_Vagyok; begin loop -- gondolkodom Éhes_Vagyok; -- eszem Villák(Bal).Letesz; Villák(Jobb).Letesz; end loop; end Filozófus;

62 Véletlenszerű időkorlát (2) procedure Éhes_Vagyok is Ehetek: Boolean := False; begin while not Ehetek loop Villák(Bal).Felvesz; select Villák(Jobb).Felvesz; Ehetek := True; ordelay Véletlen_Idő; Villák(Bal).Letesz; end select; end loop; end Éhes_Vagyok;

63 Véletlenszámok n Álvéletlenszámok (pseudo-random numbers) n Valamilyen (determinisztikus) algoritmussal n Float vagy diszkrét típusú – Ada.Numerics.Float_Random (csomag) – Ada.Numerics.Discrete_Random (sablon csomag) n Generator, Reset, Random stb. n Szimulációkhoz n Taszkok esetén: szinkronizáltan

64 Monitorral védetten task body Véletlen is G: Ada.Numerics.Float_Random.Generator; begin Reset(G); loop select accept Random ( F: out Float ) do F := Random(G); end Random; orterminate; end select; end loop; end Véletlen; task Véletlen is entry Random ( F: out Float ); end Véletlen;

65 A véletlenszerű várakozáshoz Villák: array (1..5) of Villa; task Véletlen is entry Random( F: out Float ); end; … function Véletlen_Idő return Duration is F: Float; begin Véletlen.Random(F); return Duration(F); end Véletlen_Idő; task type Filozófus ( Bal, Jobb: Positive ); …

66 Író-olvasó feladat n Van egy több folyamat által használt erőforrás n Lehet változtatni („írni”) és lekérdezni („olvasni”) n Az olvasások mehetnek egyidőben n Az írás kizárólagos n A monitornál megengedőbb

67 Megvalósítás Adában n Taszkok segítségével – Bonyolult – Kell pár select bele – Igazságosság, pártatlanság (fairness) n Védett egységgel

68 Kiéheztetés n Livelock, starvation n Nincs holtpont (deadlock) n Fut a rendszer n De: egy folyamat mindig rosszul jár n Nem képes elvégezni a feladatát n Példa: ügyetlen „író-olvasó” megvalósításnál – Az olvasók könnyen kiéheztethetik az írókat n Példa: ügyetlen „evő filozófusok” megvalósításnál – Szimmetria megtörése a filozófusok beszámozásával – A kisebb sorszámú előnyt élvez a nagyobb sorszámúval szemben

69 Belépésipont-családok n Belépési pontokból álló tömb type Prioritás is (Magas, Közepes, Alacsony); task Kijelző is entry Üzenet(Prioritás) ( Szöveg: in String ); end Kijelző; accept Üzenet(Magas) ( Szöveg: in String ) do... end; Kijelző.Üzenet(Magas)(”Nemsokára ZH!”);

70 Egymásba ágyazott randevúk n Egy taszk törzsében bárhol elhelyezhető accept utasítás – de csak a törzsben, alprogramjában már nem n Akár még egy randevún belül is – „accept E” –ben nem lehet másik „accept E” n Sőt, egy hívás is lehet randevún belül n Nagyon veszélyes, több taszk is várni kezd – Holtpont is könnyen kialakulhat n Megfontoltan csináljunk csak ilyet – Pl. kössük időkorláthoz a belső randevút

Appendix

72 Író-olvasó: Ada taszk segítségével (1) task Scheduler is entry Start_Reading; entry Start_Writing; entry Stop_Reading; entry Stop_Writing; end Scheduler; n Szemafor-szerű

73 Író-olvasó: Ada taszk segítségével (2) task body Reader_Writer is begin loop Scheduler.Start_Reading; -- itt olvashatom az erőforrást Scheduler.Stop_Reading; … Scheduler.Start_Writing; -- itt írhatom az erőforrást Scheduler.Stop_Writing; end loop; end Reader_Writer ;

74 Író-olvasó: Ada taszk segítségével (3) task body Scheduler is Nr_Of_Readers: Natural := 0; Writing: Boolean := False; begin loop select… accept Start_Reading … or… accept Start_Writing … … or terminate; end select; end loop; end Scheduler;

75 Író-olvasó: Ada taszk segítségével (4) select when not Writing => accept Start_Reading; Nr_Of_Readers := Nr_Of_Readers + 1; orwhen (not Writing) and then (Nr_Of_Readers = 0) => accept Start_Writing; Writing := True; oraccept Stop_Reading; Nr_Of_Readers := Nr_Of_Readers - 1; oraccept Stop_Writing; Writing := False; or terminate; end select; az írók éhezhetnek

76 Író-olvasó: Ada taszk segítségével (5) select when (not Writing) and then Start_Writing’Count = 0) => accept Start_Reading; Nr_Of_Readers := Nr_Of_Readers + 1; orwhen (not Writing) and then (Nr_Of_Readers = 0) => accept Start_Writing; Writing := True; oraccept Stop_Reading; Nr_Of_Readers := Nr_Of_Readers - 1; oraccept Stop_Writing; Writing := False; or terminate; end select; az olvasók éhezhetnek

77 Író-olvasó: Ada taszk segítségével (6) n Egy ügyesebb stratégia: – Egy sorban tároljuk a bejövő olvasási és írási kérelmeket – A sor elején álló olvasókat (az első íróig) engedjük egyszerre olvasni – Ha a sor elején író áll, akkor engedjük írni n Ebben nincs kiéheztetés n Bizonyos olvasó folyamatokat nem engedek olvasni, amikor pedig épp „olvasási szakasz” van

78 Micimackós szimuláció (1) with Text_Io; use Text_Io; procedure Mézvadászat is task type Mehecske; task Mehkiralyno; task Micimacko is entry Megcsipodik; end Micimacko; task Kaptar is entry Mezetad(Falat: out Natural); end Kaptar;

79 task body Kaptar is Mez: Natural := 3; begin loop selectaccept Mezetad (Falat: out Natural) do if Mez > 0 then Mez := Mez-1; Falat := 1; else Falat := 0; end if; end Mezetad; orterminate; end select; end loop; end Kaptar; Micimackós szimuláció (2)

80 task body Micimacko is Nyelem: constant Duration := 1.0; Turelem: Natural := 10; Falat: Natural; Elfogyott: Boolean := False; Nincs_Tobb_Csipes: Boolean; begin while (not Elfogyott) and then (Turelem>0) loop … end loop; if Turelem=0 then Put_Line("Na, meguntam a méheket..."); end if; end Micimacko; Micimackós szimuláció (3)

81 while (not Elfogyott) and then (Turelem>0) loop Kaptar.Mezetad(Falat); if Falat=0 then Put_Line("Nincs több mézecske?"); Elfogyott := True; exit; else Turelem := Turelem+Falat; Put_Line("Nyelem, nyelem, majd bele szakadok"); end if; select accept Megcsipodik; Turelem := Turelem-1; -- további csípések (következő oldal) or delay Nyelem; end select; end loop; Micimackós szimuláció (4)

82 -- további csípések (előző oldalról) Nincs_Tobb_Csipes := False; while (not Nincs_Tobb_Csipes) and then (Turelem>0) loop select accept Megcsipodik; Turelem := Turelem-1; else Nincs_Tobb_Csipes := True; end select; end loop; Micimackós szimuláció (5)

83 task body Mehkiralyno is Mehlarva: Natural := 10; Mehkeszites: constant Duration := 1.0; type Meh_Access is access Mehecske; Meh: Meh_Access; begin while Mehlarva > 0 loop delay Mehkeszites; Meh := new Mehecske; Mehlarva := Mehlarva-1; end loop; end Mehkiralyno; Micimackós szimuláció (6)

84 task body Mehecske is Odarepul: constant Duration := 1.0; begin delay Odarepul; Micimacko.Megcsipodik; Put_Line("Jol megcsiptem Micimackot!"); exception when Tasking_Error => Put_Line("Hova tunt ez a Micimacko?"); end Mehecske; Micimackós szimuláció (7)

85 begin --- itt indulnak a taszkok null; end Mézvadászat; Micimackós szimuláció (8)