220 likes | 286 Vues
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 változók, üzenet küldés. 2.) Szionkronizáció: Kölcsönös kizárás. (kritikus szakasz)
E N D
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 változók, üzenet küldés. • 2.) Szionkronizáció: • Kölcsönös kizárás. (kritikus szakasz) • Feltételtől függő szinkronizáció. (megvárakoztatás állapot • alapján) • Szinkron kommunikáció. (kommunikáció szinkronizált • csatornákon keresztül) • Asszinkron kommunikáció.
A kölcsönös kizárásra Peterson által adott megoldás. A megoldás az aktív várakozás (busy wait) technikájának alkalmazását szemlélteti, közös változókkal történő megoldás esetén. yi , i= 1,2; az igénylés nyilvántartása. t: a másik folyamat letiltása. 1. yi ="true": az i.edik folyamat igényli az erőforrást, 2. yi ="false": az i.edik folyamat nem tart igényt az erőforrásra; i{1,2} . 3. t = 1 : az első megtiltja az erőforrás lekötését a 2. folyamatnak. 4. t = 2 : a második megtiltja az erőforrás lekötését az 1. folyamatnak.
y1"false"; y2"false"; t1; parbegin P1 P2 parend; P1: P2: while "true" do nem kritikus szakasz2; ( y2,t) ("true",2); while y1 t1 do nil od; kritikus szakasz2; y2 "false" od; while "true" do nem kritikus szakasz1; (y1,t) ("true",1); while y2 t2 do nil od; kritikus szakasz1; y1"false" od; Igénybejelentés; Tiltás; Aktív várakozás (busy waiting). Tiltás feloldása.
t változó használata azt a konfliktust hivatott feloldani, hogy mindkettő az aktív várakozás állapotában várakozzon: Például: (y1, t) ("true",1); ( y2,t) ("true",2); whiley2 t2do nil od; while y1 t1do nil od; kritikus szakasz2; y2 "false" kritikus szakasz1; • Aki előbb állította be t értékét, az : aktív várakozás, • a másik belépés. • Aki később, az kilépéskor : kinyitja a kaput a másiknak.
y1"false"; y2"false"; t1; parbegin P1 P2 parend; P1: P2: while "true" do nem kritikus szakasz2; ( y2,t) ("true",2); wait y1 t1 ta; kritikus szakasz2; y2 "false" od; while "true" do nem kritikus szakasz1; (y1,t) ("true",1); wait y2 t2 ta; kritikus szakasz1; y1"false" od; Aktív várakozás helyett várakozás (wait utasítás).
s 1; y1 0; y2 0; parbegin P1 P2 parend; Előbb s-nek értékadás: P1: P2: U0: while "true" do V0: while "true" do U1: nem kritikus szakasz1; V1: nem kritikus szakasz2; U2: s 1; V2: s 2; U3: y11; V3: y2 1; U4: wait (y2=0)(s1); V4: wait (y1=0)(s2); U5: kritikus szakasz1; V5: kritikus szakasz2; U6: y10; V6: y20; od; od;
P1 U0: while "true" do; P2 V0: while "true" do s y1 y2 1 0 0 U1: nem kritikus szakasz1; 1 0 0 V1: nem kritikus szakasz2; 1 0 0 U2: s 1; 1 0 0 U2: s 1; 1 0 0 V2: s 2; U3: y11; V2: s 2; 1 0 0 U3: y11; V3: y2 1; 2 0 0 U3: y11; V4: wait (y1=0)(s2); 2 0 1 U3: y11; V5: kritikus szakasz2; 2 0 1 U4: wait (y2=0)(s1); V5: kritikus szakasz2; 211 U5: kritikus szakasz1; V5: kritikus szakasz2; 21 1 Baj van: mindkét folyamat kritikus szakaszba került!
A Peterson féle algoritmus egy másik változata. Mi történik, ha az (y1,s) (1,1); (y2,s) (2,1); vektor műveletek nem hajthatók végre atomi utasításként?
s 1; y1 0; y2 0; parbegin P1 P2 parend Előbb y-nak értékadás: P1 P2 while "true" dowhile "true" do nem kritikus szakasz1; nem kritikus szakasz2; y1 1; y2 2; s 1; s 1; wait (y2=0)(s1); wait (y1=0)(s2); kritikus szakasz1; kritikus szakasz2; y10; y20; od; od; A program helyessége formálisan bizonyítható.
Dijkstra példája aktív várakozással történő szinkronizációra Kölcsönös kizárás. (1968) parbegin S1 S2 parend; S1: begin in1 "true"; do in2 in1 "false"; in1 "true"; od; kritikus szakasz1; in1 "false"; nem kritikus szakasz1; end; S2: begin in2 "true"; do in1 in2 "false"; in2 "true"; od; kritikus szakasz2; in2 "false"; nem kritikus szakasz2; end; Igénybejelentés.Elengedés.
Egy lehetséges helyes lefutás. in1 "true"; in2 "true"; in2 in1 "false"; in1 kiértékelése; in1 "true"; kritikus szakasz2; in2 = "false"; in2 kiértékelése; nem kritikus szakasz2; kritikus szakasz1; end; in1 "false"; nem kritikus szakasz1; end;
Egy lehetséges divergencia: in1 "true"; in2 "true"; in2 in1 "false"; in1 "true"; in1 in2 "false"; in2 "true"; in2 in1 "false"; in1 "true"; in1 in2 "false"; in2 "true"; ...Nem tudnak kilépni a do ... od ciklusból! in1 "true"; in2 "true"; (in2 in1 "false"; in1 "true"; in1 in2 "false"; in2 "true";)
A kölcsönös kizárás Szymanski modellje. • Készítsünk olyan párhuzamos rendszert, amelyben minden • folyamat azonos algoritmust valósít meg. • Folyamatok: P0, P1, ... ,Pn-1; • Változóik rendre: jel[0], jel[1], ... ,jel[n-1]. • Minden közös változó értékét, minden folyamat ki tudja • olvasni. • Közülük csak egy tudja annak értékét egyidejűleg felülírni. • A kritikus szakaszba történő belépésnél a várakozásuk idejének • sorszámukkal arányosnak kell lennie.
1. kísérlet: Pi : U0: while "true" do U1: nem kritikus szakasz; U2: jel[i]1; U3: wait (j, 1j n ji )(jel[j]=0) tw; U4: kritikus szakasz; U5: jel[i]0; od; Kölcsönös kizárás teljesül: Ha Pi kritikus szakaszban van, akkor jel(i ) =1, ezért Pj, ji nem tud belépni. Holtpontmentesség nem teljesül: Ha mindnyájan egyszerre hajtják végre U2-t, akkor (j, 1j n )(jel[j]=1)!
2. kísérlet: Pi : U0: while "true" do U1: nem kritikus szakasz; U2: jel[i]1; U3: wait (j, 1j n) (jel[j]=0) jel[j]=1) tw; U4: jel[i] 4; U5: wait (j, 1ji )(jek[j]=0 jel[j]=1) tw; U6: kritikus szakasz; U7: jel[i]0; od; Akit igénybejelentés elsőnek továbbenged az megjelöli magát: U4. Beütemezés: Mindig a legkisebb indexű léphessen be elsőnek:U5. (ez felel meg az index-szel arányos várakozás követelményének).
2. kísérlet: Pi : U0: while "true" do U1: nem kritikus szakasz; U2: jel[i]1; U3: wait (j, 1j n) (jel[j]=0) jel[j]=1) tw; U4: jel[i] 4; U5: wait (j, 1ji )(jek[j]=0 jel[j]=1) tw; U6: kritikus szakasz; U7: jel[i]0; od; P1 P2 j(0) j(1) U0 V0 0 0 U1 V0 0 0 U1 V1 0 0 U2 V1 0 0 U2 V2 0 0 U3 V2 1 0 U3 V3 1 1 U4 V3 1 1 U4 V4 1 1 U4 V5 1 4 U4 V6 1 4 U5 V6 4 4 U6 V6 4 4 P2 beléphet, de utána az ütemezés szerint P1 is! Nem teljesül a kölcsönös kizárás! Ha valaki (jel[i] 4;), akkor az utána jövő várjon!
3. kísérlet: Pi: U0: while "true" do U1: nem kritikus szakasz; U2: jel[i]1; U3: wait (j, 1jn)(jel[j]=0jel[j]=1jel[j] =2); U4: if (j, 1jn)(jel[j]=1) then U5: jel[i]2; U6: wait (j, 1 j n)(jel[j]=4) tw; fi; U7: jel[i]4; U8: wait (j, 1 j i )(jel[j]=0jel[j]=1); U9: kritikus szakasz; U10: jel[i]0; od; P1 P2 j1 j2 U0 V0 0 0 U1 V1 0 0 U2 V2 0 0 U3 V3 1 1 U4 V4 1 1 U5 V5 1 1 U6 V6 2 2 Holtpont!
4. kísérlet: Pi: P1 P2 j1 j2 U1 V0 0 0 U1 V1 0 0 U2 V1 0 0 U2 V2 0 0 U3 V2 1 0 U3 V3 1 1 U4 V3 1 1 U4 V4 1 1 U4 V5 1 3 U4 V6 1 3 U4 V7 1 2 U5 V7 3 2 U8 V7 3 2 U9 V7 4 2 U10 V7 4 2 U11 V7 4 2 U1 V7 0 2 U2 V7 0 2 U3 V7 1 2 U4 V7 1 2 U0: while "true" do U1: nem kritikus szakasz; U2: jel[i] 1; U3: wait (j, 1j n )(jel[j]=0jel[j]=1jel[j]=2) tw; U4: jel[i] 3; U5: if (j, 1jn)(jel[j]=1) then U6: jel[i] 2; U7: wait (j,1jn)(jel[j] = 4) tw; fi; U8: jel[i] 4; U9: wait (j, 1j n )(jel[j]=0jel[j]=1) tw; U10: kritikus szakasz; U11: jel[i] 0; Prioritás nem teljesül!
5. kísérlet: Pi: U0: while "true" do U1: nem kritikus szakasz; U2: jel[i] 1; U3: wait (j, 1j n )(jel[j]3) tw; U4: jel[i]3; U5: if (j, 1jn)(jel[j]=1) then U6: jel[i] 2; U7: wait (j,1jn)(jel[j] = 4) tw;fi; U8: jel[i]4; U9: wait (j, 1j i)(jel[j]2) tw; U10: kritikus szakasz; U11: wait (j, ijn)(jel[j]2jel[j]3) tw; U12: jel[i]0; od; Ez már helyes megoldás, feltéve, hogy a kiértékelések U3, U5, U7, U9, U11 utasítások meg nem szakítható utasítások. Ha ezt nem tesszük fel, lehet példát találni arra, hogy nem teljesül a kölcsönös kizárás.
Feladat. Bizonyos tulajdonságú objektum párhuzamos keresése felosztott adatbázisban. Xj , j{..., -2,-1,0,1, 2,...}, nagyon hosszú vektor. Feltevésünk az, hogy (j{...,-2,-1,0,1, 2,...})(Xi[j] = e), pontosan egy; S : k e; parbegin S1 S2parend; z = if X[j] = e then j else i fi;
S : k e; parbegin S1 S2 parend; z = if X[j] = k then j else i fi; S1: V0: V1: B F; j 0; V2: while B = "false" do V3: B (X[j] = k); V4: j j+1; od; V5: S2: U0: U1: B "false"; i 0; U2: while B = "false" do U3: B (X[i] = k); U4: i i -1; od; U5: Feltevés: pontosan egy olyan "a" indexérték van, amelyre X[a] = e és (~i(i=a)(X[i] = e).
i S1 S2 B j U0 0 V2 "F" a 0 B (X[a] = e); V3 U0 "F" a 0 V4 U1 "T" a a a+1; B "F"; i 0; 0 V2 U2 "F" a+1 Végtelen ciklus! (a könyvben 4-5 próbálkozás)