You are on page 1of 10

Nguyn l h iu hnh

Nguyn Hi Chu Khoa Cng ngh thng tin Trng i hc Cng ngh

ng b ha tin trnh

V d ng b ha (1)
Tin trnh ghi P: while (true) { while (counter==SIZE) ; buf[in] = nextItem; in = (in+1) % SIZE; counter++; } buf: Buffer SIZE: c ca buffer counter: Bin chung Tin trnh c Q: while (true) { while (counter==0) ; nextItem = buf[out]; out = (out+1) % SIZE; counter--; }

V d ng b ha (2)

Cc ton t ++ v -- c th c ci t nh sau: counter-register2 = counter; register2 = register2 - 1; counter = register2;


counter++ register1 = counter; register1 = register1 + 1; counter = register1;


y l bi ton vng m c gii hn


3

P v Q c th nhn c cc gi tr khc nhau ca counter ti cng 1 thi im nu nh on m xanh v thc hin xen k nhau.
4

V d ng b ha (3)
Gi s P v Q thc hin song song vi nhau v gi tr ca counter l 5: // register1=5 register1 = counter; // register1=6 register1 = register1 + 1; // register2=5 register2 = counter; // register2=4 register2 = register2 - 1; // counter=6 !! counter = register1; // counter=4 !! counter = register2;

5

V d ng b ha (4)
Li: Cho php P v Q ng thi thao tc trn bin chung counter. Sa li: // register1=5 register1 = counter; // register1=6 register1 = register1 + 1; // counter=6 counter = register1; // register2=6 register2 = counter; // register2=5 register2 = register2 - 1; // counter=5 counter = register2;

6

Tng tranh v ng b

Khi nim v on m gng (1)


Tnh hung xut hin khi nhiu tin trnh cng thao tc trn d liu chung v kt qu cc thao tc ph thuc vo th t thc hin ca cc tin trnh trn d liu chung gi l tnh hung tng tranh (race condition) trnh cc tnh hung tng tranh, cc tin trnh cn c ng b theo mt phng thc no Vn nghin cu: ng b ha cc tin trnh
7

Thut ng: Critical section Thut ng ting Vit: on m gng, on m ti hn. Xt mt h c n tin trnh P0, P1, ..., Pn, mi tin trnh c mt on m lnh gi l on m gng, k hiu l CSi, nu nh trong on m ny, cc tin trnh thao tc trn cc bin chung, c ghi file... (tng qut: thao tc trn d liu chung)
8

Khi nim v on m gng (2)


Khi nim v on m gng (3)


Cu trc chung ca Pi thc hin on m gng CSi. do {

c im quan trng m h n tin trnh ny cn c l: Khi mt tin trnh Pi thc hin on m CSi th khng c tin trnh Pj no khc c php thc hin CSj Mi tin trnh Pi phi xin php (entry section) trc khi thc hin CSi v thng bo (exit section) cho cc tin trnh khc sau khi thc hin xong CSi.
9

Xin php (ENTRYi) thc hin CSi; // Entry section Thc hin CSi; Thng bo (EXITi) thc hin xong CSi; // Exit section Phn m lnh khc (REMAINi); // Remainder section

} while (TRUE);
10

Khi nim v on m gng (4)


Vit li cu trc chung ca on m gng: do {

Gii php cho on m gng


Gii php cho on m gng cn tha mn 3 iu kin:

ENTRYi; Thc hin CSi; EXITi; REMAINi;

// Entry section // Critical section // Exit section // Remainder section

} while (TRUE);

11

Loi tr ln nhau (mutual exclusion): Nu Pi ang thc hin CSi th Pj khng th thc hin CSj ji. Tin trin (progress): Nu khng c tin trnh Pi no thc hin CSi v c m tin trnh Pj1, Pj2, ..., Pjm mun thc hin CSj1, CSj2, ..., CSjm th ch c cc tin trnh khng thc hin REMAINjk (k=1,...,m) mi c xem xt thc hin CSjk. Ch c gii hn (bounded waiting): sau khi mt tin trnh Pi c yu cu vo CSi v trc khi yu cu c chp nhn, s ln cc tin trnh Pj (vi ji) c php thc hin CSj phi b gii hn.
12

V d: gii php ca Peterson


V d: gii php ca Peterson


M lnh ca Pi: do { flag[i] = TRUE; turn = j; while (flag[j] && turn == j) ; CSi; flag[i] = FALSE; REMAINi; } while (1);
14

Gi s c 2 tin trnh P0 v P1 vi hai on m gng tng ng CS0 v CS1 S dng mt bin nguyn turn vi gi tr khi to 0 hoc 1 v mng boolean flag[2] turn c gi tr i c ngha l Pi c php thc hin CSi (i=0,1) nu flag[i] l TRUE th tin trnh Pi sn sng thc hin CSi
13

Chng minh gii php Peterson


Xem chng minh gii php ca Peterson tha mn 3 iu kin ca on m gng trong gio trnh (trang 196) Gii php kiu Peterson:

Semaphore

Phc tp khi s lng tin trnh tng ln Kh kim sot

15

16

Thng tin tham kho


nh ngha

Edsger Wybe Dijkstra (ngi H Lan) pht minh ra khi nim semaphore trong khoa hc my tnh vo nm 1972 Semaphore c s dng ln u tin trong cun sch The operating system ca ng

Semaphore l mt bin nguyn, nu khng tnh n ton t khi to, ch c th truy cp thng qua hai ton t nguyn t l wait (hoc P) v signal (hoc V).

P: proberen kim tra (ting H Lan) V: verhogen tng ln (ting H Lan)

Edsger Wybe Dijkstra (1930-2002)

Cc tin trnh c th s dng chung semaphore Cc ton t l nguyn t m bo khng xy ra trng hp nh v d ng b ha nu


18

17

Ton t wait v signal


wait(S) // hoc P(S) { while (S<=0); S--; }

S dng semaphore (1)


// hoc V(S)
Vi bi ton on m gng: do { wait(mutex); // mutex l semaphore khi to 1 CSi; signal(mutex); REMAINi; } while (1);

signal(S) { S++; }

Ton t wait: Ch khi semaphore S m v gim S i 1 nu S>0

Ton t signal: Tng S ln 1

19

20

S dng semaphore (2)


Ci t semaphore c in


Xt hai tin trnh P1 v P2, P1 cn thc hin ton t O1, P2 cn thc hin O2 v O2 ch c thc hin sau khi O1 hon thnh Gii php: S dng semaphore synch = 0
P1:

P2:

... O1; signal(synch); ...

... wait(synch); O2; ...

nh ngha c in ca wait cho ta thy ton t ny c ch bn (busy waiting), tc l tin trnh phi ch ton t wait kt thc nhng CPU vn phi lm vic: Lng ph ti nguyn Lin h c ch polling trong kin trc my tnh Ci t semaphore theo nh ngha c in:

21

Lng ph ti nguyn CPU vi cc my tnh 1 CPU C li nu thi gian ch wait t hn thi gian thc hin context switch Cc semaphore loi ny gi l spinlock

22

Ci t semaphore theo cu trc


Khc phc ch bn: Chuyn vng lp ch thnh vic s dng ton t block (tm dng) khi phc thc hin t block, ta c ton t wakeup Khi ci t, ta c cu trc d liu mi cho semaphore: typedef struct { int value; // Gi tr ca semaphore struct process *L; // Danh sch tin trnh ch... } semaphore;

23

Ci t semaphore theo cu trc


void wait(semaphore *S) { S->value--; if (S->value<0) { Thm tin trnh gi ton t vo s->L; block(); } } void signal(semaphore *S) { S->value++; if (S->value<=0) { Xa mt tin trnh P ra khi s->L; wakeup(P); } }
24

Semaphore nh phn

L semaphore ch nhn gi tr 0 hoc 1 Ci t semaphore nh phn n gin hn semaphore khng nh phn (thut ng: counting semaphore)

Mt s bi ton ng b ha c bn

25

26

Bi ton vng m c gii hn


Bi ton vng m c gii hn


Tin trnh ghi P: do { wait(empty); wait(mutex); // Ghi mt phn t mi // vo buffer signal(mutex); signal(full); } while (TRUE); Tin trnh c Q: do { wait(full); wait(mutex); // c mt phn t ra // khi buffer signal(mutex); signal(empty); } while (TRUE);
28

xt v d u tin (the bounded-buffer problem) Ta s dng 3 semaphore tn l full, empty v mutex gii quyt bi ton ny Khi to:

full: S lng phn t buffer c d liu (0) empty: S lng phn t buffer cha c d liu (n) mutex: 1 (Cha c tin trnh no thc hin on m gng)
27

Bi ton tin trnh c - ghi


Bi ton tin trnh c-ghi s 1


Thut ng: the reader-writer problem Tnh hung: Nhiu tin trnh cng thao tc trn mt c s d liu trong

Mt vi tin trnh ch c d liu (k hiu: reader) Mt s tin trnh va c va ghi (k hiu: writer)

Khi c c/ghi ng thi ca nhiu tin trnh trn cng mt c s d liu, c 2 bi ton:

Bi ton 1: reader khng phi ch, tr khi writer c php ghi vo CSDL (hay cc reader khng loi tr ln nhau khi c) Bi ton 2: Khi writer sn sng ghi, n s c ghi trong thi gian sm nht (ni cch khc khi writer sn sng, 29 khng cho php cc reader c d liu)

S dng cc semaphore vi gi tr khi to: wrt (1), mutex (1) S dng bin rcount (khi to 0) m s lng reader ang c d liu wrt: m bo loi tr ln nhau khi writer ghi mutex: m bo loi tr ln nhau khi cp nht bin rcount

30

Bi ton tin trnh c-ghi s 1


Ba n ti ca cc trit gia

Tin trnh writer Pw:

do { wait(wrt); // Thao tc ghi ang c // thc hin signal(wrt); while (TRUE);

Tin trnh reader Pr: do { wait(mutex); rcount++; if (rcount==1) wait(wrt); signal(mutex); // Thc hin php c wait(mutex); rcount--; if (rcount==0) signal(wrt); signal(mutex); } while (TRUE);

31

Thut ng: the diningphilosophers problem C 5 trit gia, 5 chic a, 5 bt cm v mt u cm b tr nh hnh v y l bi ton c in v l v d minh ha cho mt lp nhiu bi ton tng tranh (concurrency): Nhiu tin trnh khai thc nhiu ti nguyn chung

32

Ba n ti ca cc trit gia

Gii php cho bi ton Ba n...


M lnh ca trit gia i: Biu din 5 chic a qua mng semaphore: do { semaphore chopstick[5]; wait(chopstick[i]); cc semaphore c khi to wait(chopstick[(i+1)%5]; gi tr 1 // n... M lnh ca trit gia nh hnh signal(chopstick[i]); bn signal(chopstick[(i+1)%5]; M lnh ny c th gy b tc // Suy ngh... (deadlock) nu c 5 trit gia } while (TRUE); u ly c 1 chic a v ch ly chic cn li nhng khng bao gi ly c!!
34

Cc trit gia ch lm 2 vic: n v suy ngh


Suy ngh: Khng nh hng n cc trit gia khc, a, bt v u cm n: Mi trit gia phi c 2 chic a gn nht bn phi v bn tri mnh; ch c ly 1 chic a mt ln v khng c php ly a t tay trit gia khc Khi n xong: Trit gia b c hai chic a xung bn v tip tc suy ngh
33

Mt s gii php trnh b tc


Hn ch ca semaphore

Ch cho php nhiu nht 4 trit gia ng thi ly a, dn n c t nht 1 trit gia ly c 2 chic a Ch cho php ly a khi c hai chic a bn phi v bn tri u nm trn bn S dng gii php bt i xng: Trit gia mang s l ly chic a u tin bn tri, sau chic a bn phi; trit gia mang s chn ly chic a u tin bn phi, sau ly chic a bn tri
35

Mc d semaphore cho ta c ch ng b ha tin li song s dng semaphore khng ng cch c th dn n b tc hoc li do trnh t thc hin ca cc tin trnh Trong mt s trng hp: kh pht hin b tc hoc li do trnh t thc hin khi s dng semaphore khng ng cch S dng khng ng cch gy ra bi li lp trnh hoc do ngi lp trnh khng cng tc
36

V d hn ch ca semaphore (1)

V d hn ch ca semaphore (2)

Xt v d v on m gng:
M ng: ... wait(mutex); // on m gng signal(mutex); ...

Xt v d v on m gng:
M ng: ... wait(mutex); // on m gng signal(mutex); ...

M sai: signal(mutex); // on m gng wait(mutex); ... on m sai ny gy ra vi phm iu kin loi tr ln nhau

M sai: wait(mutex); // on m gng wait(mutex); ... on m sai ny gy ra b tc


38

...

...

37

V d hn ch ca semaphore (3)

V d hn ch ca semaphore (4)
Tin trnh P1 ... wait(S); wait(Q); ... signal(S); signal(Q);

Nu ngi lp trnh qun cc ton t wait() hoc signal() trong trong cc on m gng, hoc c hai th c th gy ra:

B tc Vi phm iu kin loi tr ln nhau

Tin trnh P2 ... wait(Q); wait(S); ... signal(Q); signal(S);



39

Hai tin trnh P1 v P2 ng thi thc hin s dn ti b tc

40

Thng tin tham kho

C ch monitor

Per Brinch Hansen (ngi an Mch) l ngi u tin a ra khi nim v ci t monitor nm 1972 Monitor c s dng ln u tin trong ngn ng lp trnh Concurrent Pascal

Per Brinch Hansen (1938-2007)


42

41

Monitor l g?

nh ngha tng qut


Thut ng monitor: gim st nh ngha khng hnh thc: L mt loi construct trong ngn ng bc cao dng phc v cc thao tc ng b ha Monitor c nghin cu, pht trin khc phc cc hn ch ca semaphore nh nu trn

Monitor l mt cch tip cn ng b ha cc tc v trn my tnh khi phi s dng cc ti nguyn chung. Monitor thng gm c:

Tp cc procedure thao tc trn ti nguyn chung Kha loi tr ln nhau Cc bin tng ng vi cc ti nguyn chung Mt s cc gi nh bt bin nhm trnh cc tnh hung tng tranh

Trong bi ny: Nghin cu mt loi cu trc monitor: Kiu monitor (monitor type)
44

43

Monitor type

Cu trc mt monitor type


monitor tn_monitor { // Khai bo cc bin chung procedure P1(...) { ... } procedure P2(...) { ... } ... procedure Pn(...) { ... } initialization_code (..) { ... } }

Mt kiu (type) hoc kiu tru tng (abstract type) gm c cc d liu private v cc phng thc public Monitor type c c trng bi tp cc ton t ca ngi s dng nh ngha Monitor type c cc bin xc nh cc trng thi; m lnh ca cc procedure thao tc trn cc bin ny
45

46

Minh ha cu trc monitor

Cch s dng monitor


Monitor c ci t sao cho ch c mt tin trnh c hot ng trong monitor (loi tr ln nhau). Ngi lp trnh khng cn vit m lnh m bo iu ny Monitor nh nh ngha trn cha mnh x l mi trng hp ng b ha. Cn thm mt s c ch tailor-made v ng b ha Cc trng hp ng b ha tailor-made: s dng kiu condition.
48

47

Kiu condition

Monitor c kiu condition

Khai bo: condition x, y; // x, y l cc bin kiu condition S dng kiu condition: Ch c 2 ton t l wait v signal

x.wait(): tin trnh gi n x.wait() s c chuyn sang trng thi ch (wait hoc suspend) x.signal(): tin trnh gi n x.signal() s khi phc vic thc hin (wakeup) mt tin trnh gi n x.wait()
49 50

c im ca x.signal()

Signal wait/continue

x.signal() ch nh thc duy nht mt tin trnh ang ch Nu khng c tin trnh ch, x.signal() khng c tc dng g x.signal() khc vi signal trong semaphore c in: signal c in lun lm thay i trng thi (gi tr) ca semaphore

Gi s c hai tin trnh P v Q:


Q gi n x.wait(), sau P gi n x.signal() Q c php tip tc thc hin (wakeup)

Khi P phi vo trng thi wait v nu ngc li th P v Q cng thc hin trong monitor Kh nng xy ra:


51

Signal-and-wait: P ch n khi Q ri monitor hoc ch mt iu kin khc (*) Signal-and-continue: Q ch n khi P ri monitor hoc ch mt iu kin khc

52

Bi ton n ti.. vi monitor


Monitor ca bi ton n ti...


monitor dp { enum {thinking, hungry, eating} state[5]; condition self[5]; void pickup(int i) { state[i] = hungry; test(i); if (state[i] != eating) self[i].wait(); } }
53 54

Gii quyt bi ton n ti ca cc trit gia vi monitor khng xy ra b tc khi hai trit gia ngi cnh nhau cng ly a n Trng thi ca cc trit gia: enum {thinking, hungry, eating} state[5]; Trit gia i ch c th n nu c hai ngi ngi cnh ng ta khng n:
(state[(i+4)%5]!=eating) and (state[(i+1)%5]!=eating)

Khi trit gia i khng iu kin n: cn c bin condition: condition self[5];

Monitor ca bi ton n ti...


void putdown(int i) { state[i] = thinking; test((i+4)%5); test((i+1)%5); } initialization_code() { for (int i=0;i<5;i++) state[i] = thinking; }
55

Monitor ca bi ton n ti...


void test(int i) { if ((state[(i+4)%5] != eating) && (state[i] == hungry) && (state[(i+1)%5] != eating)) { state[i] = eating; self[i].signal(); } }
56

c thm nh

Tm tt

Khi nim v min gng (critical region) C ch monitor ca Java:


public class XYZ { ... public synchronized void safeMethod() { ... } }


57

Ton t wait() v notify() trong java.util.package (tng t ton t wait() v signal()) Cch ci t monitor bng semaphore

Khi nim ng b ha Khi nim on m gng, ba iu kin ca on m gng Khi nim semaphore, semaphore nh phn Hin tng b tc do s dng sai semaphore Mt s bi ton c in trong ng b ha Min gng C ch monitor
58

Bi tp
Ch ra iu kin no ca on m gng b vi phm trong on m gng sau ca Pi: do { while (turn != i) ; CSi; turn = j; REMAINi; } while (1);

59

Bi tp

Ci t gii php cho bi ton Ba n ti ca cc trit gia trong Java bng cch s dng synchronized, wait() v notify() Gii php monitor cho bi ton Ba n ti... trnh c b tc, nhng c th xy ra trng hp tt c cc trit gia u khng c n. Hy ch ra trng hp ny v tm cch gii quyt bng c ch monitor Ch : Sinh vin cn lm bi tp hiu tt hn v ng b ha

60

10

You might also like