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. y i, i= 1,2; az igénylés nyilvántartása. t: a másik folyamat letiltása. 1. y i ="true":az i.edik folyamat igényli az erőforrást, 2. y i ="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"; t 1; parbegin P1 P2 parend; while "true" do nem kritikus szakasz1; (y1, t) ("true", 1); while y2 t 2 do nil od; kritikus szakasz1; y1 "false" od; P1: while "true" do nem kritikus szakasz2; ( y2, t) ("true",2); while y1 t 1 do nil od; kritikus szakasz2; y2 "false" od; P2: 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); while y2 t 2 do nil od; kritikus szakasz1; ( y2, t) ("true",2); while y1 t 1 do nil od; kritikus szakasz2; y2 "false" 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"; t 1; parbegin P1 P2 parend; while "true" do nem kritikus szakasz1; (y1, t) ("true", 1); wait y2 t 2 ta; kritikus szakasz1; y1 "false" od; P1: while "true" do nem kritikus szakasz2; ( y2, t) ("true",2); wait y1 t 1 ta; kritikus szakasz2; y2 "false" od; P2: 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: U0: while "true" do V0: while "true" do U1: nem kritikus szakasz1; V1: nem kritikus szakasz2; U2: s 1; V2: s 2; U3: y1 1; V3: y2 1; U4: wait (y2=0) (s 1); V4: wait (y1=0) (s 2); U5: kritikus szakasz1; V5: kritikus szakasz2; U6: y1 0; V6: y2 0; od; P1:P2:
P1 U0: while "true" do; U1: nem kritikus szakasz1; U2: s 1; U3: y1 1; U4: wait (y2=0) (s 1); U5: kritikus szakasz1; P2 V0: while "true" do V1: nem kritikus szakasz2; V2: s 2; V3: y2 1; V4: wait (y1=0) (s 2); V5: kritikus szakasz2; s y1 y 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 (y 1,s) (1,1); (y 2,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: P1P2 while "true" do while "true" do nem kritikus szakasz1; nem kritikus szakasz2; y1 1; y2 2; s 1; s 1; wait (y2=0) (s 1); wait (y1=0) (s 2); kritikus szakasz1; kritikus szakasz2; y1 0; y2 0; 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 in1 "false"; in1 "true"; in2 kiértékelése; kritikus szakasz1; in1 "false"; nem kritikus szakasz1; end; in2 "true"; in1 kiértékelése; kritikus szakasz2; in2 = "false"; nem kritikus szakasz2; end;
Egy lehetséges divergencia: in1 "true"; in2 in1 "false"; in1 "true"; in2 "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: P 0, P 1,...,P n-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: U0: while "true" do U1: nem kritikus szakasz; U2: jel[i] 1; U3: wait ( j, 1 j n j i )(jel[j]=0) tw; U4: kritikus szakasz; U5: jel[i] 0; od; P i : Kölcsönös kizárás teljesül: Ha P i kritikus szakaszban van, akkor jel(i ) =1, ezért P j, j i nem tud belépni. Holtpontmentesség nem teljesül: Ha mindnyájan egyszerre hajtják végre U2-t, akkor ( j, 1 j n )(jel[j]=1)!
2. kísérlet: U0: while "true" do U1: nem kritikus szakasz; U2: jel[i] 1; U3: wait ( j, 1 j n) (jel[j]=0) jel[j]=1) tw; U4: jel[i] 4; U5: wait ( j, 1 j i )(jek[j]=0 jel[j]=1) tw; U6: kritikus szakasz; U7: jel[i] 0; od; P i : 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: U0: while "true" do U1: nem kritikus szakasz; U2: jel[i] 1; U3: wait ( j, 1 j n) (jel[j]=0) jel[j]=1) tw; U4: jel[i] 4; U5: wait ( j, 1 j i )(jek[j]=0 jel[j]=1) tw; U6: kritikus szakasz; U7: jel[i] 0; od; P i : 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! 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
3. kísérlet:Pi:Pi: U0: while "true" do U1: nem kritikus szakasz; U2: jel[i] 1; U3: wait ( j, 1 j n)(jel[j]=0 jel[j]=1 jel[j] =2); U4: if ( j, 1 j n)(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]=0 jel[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: U0: while "true" do U1: nem kritikus szakasz; U2: jel[i] 1; U3: wait ( j, 1 j n )(jel[j]=0 jel[j]=1 jel[j]=2) tw; U4: jel[i] 3; U5: if ( j, 1 j n)(jel[j]=1) then U6: jel[i] 2; U7: wait ( j,1 j n)(jel[j] = 4) tw; fi; U8: jel[i] 4; U9: wait ( j, 1 j n )(jel[j]=0 jel[j]=1) tw; U10: kritikus szakasz; U11: jel[i] 0; Prioritás nem teljesül! Pi: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
5. kísérlet: U0: while "true" do U1: nem kritikus szakasz; U2: jel[i] 1; U3: wait ( j, 1 j n )(jel[j] 3) tw; U4: jel[i] 3; U5: if ( j, 1 j n)(jel[j]=1) then U6: jel[i] 2; U7: wait ( j,1 j n)(jel[j] = 4) tw; fi; U8: jel[i] 4; U9: wait ( j, 1 j i)(jel[j] 2) tw; U10: kritikus szakasz; U11: wait ( j, i j n)(jel[j] 2 jel[j] 3) tw; U12: jel[i] 0; od; Pi:Pi: 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. X j, j {..., -2,-1,0,1, 2,...}, nagyon hosszú vektor. Feltevésünk az, hogy (j {...,-2,-1,0,1, 2,...})(X i [j] = e), pontosan egy; S :k e; parbegin S 1 S 2 parend; 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).
S1 V2 V3 V4 V2 S2 U0 U1 U2 B "F" "T" "F" j a a a a+1 i B (X[a] = e); a a+1; B "F"; i 0; Végtelen ciklus! (a könyvben 4-5 próbálkozás)