Phm Th Phi ©2004
5.1
H điu hành
Chng 5: ng b hóa tin trình
̈ C s
̈ Bài toán min tng trc
̈ ng b hóa bng phn cng
̈ Semaphores
̈ Các bài toán c đin v đng b hóa
̈ Monitors
̈ ng b hóa trong Solaris và Windows 2000
Phm Th Phi ©2004
5.2
H điu hành
C s
̈ Truy cp cnh tranh lên d liu đc chia s có th gây nên tình
trng không nht quán d liu.
̈ Vic duy trì s nht quán d liu yêu cu các c ch đ đm bo
s thc thi mt cách có th t ca các tin trình có hp tác vi
nhau.
̈ Ví d?
Phm Th Phi ©2004
5.3
H điu hành
Tình trng đua tranh
̈ Tình trng đua tranh:làtình trng mà vài tin trình cùng truy cp và
thay đi lên d liu đc chia s.Giátr cui cùng ca d liu chia s
ph thuc vào tin trình nào hoàn thành cui cùng.
̈ ngn chn tình trng đua tranh, các tin trình đua tranh phi đc
đng b hóa.
Phm Th Phi ©2004
5.4
H điu hành
Vn đ min tng trc
̈ Tt c n tin trình đang cnh tranh đ s dng d liu chia s.
̈ Mi tin trình có mt đon mã lnh, gi là min tng trc, mà
trong đócóhành đng truy cp d liu đc chia s.
̈ Vn đ – đm bo rng khi mt tin trình đang chy trong
min tng trc, không có mt tin trình nào khác đc cho
phép chy trong min tng trc ca mình.
Phm Th Phi ©2004
5.5
H điu hành
Gii pháp cho vn đ min tng trc
1. Loi tr h tng.Nu tin trình P
i
đang thc thi trong min
tng trc, thì không có tin trình nào khác có th thc thi
trong min tng trc ca mình.
2. Tin trin.Nu không có tin trình nào đang thc thi trong
min tng trc ca nó và có tn ti vài tin trình đang mong
mun đc thc thi trong min tng trc ca chúng, thì vic
la chn cho mt tin trình bc vào min tng trc ca nó
không th b trì hoãn mãi đc.
3. Ch đi hu hn. Không có tin trình nào phi ch đi vnh
vin đ có th bc vào min tng trc ca nó
Phm Th Phi ©2004
5.6
H điu hành
Nhng c gng đu tiên đ gii quyt bài
toán min tng trc
̈ Ch có 2 tin trình, P
0
và P
1
̈ Cu trúc tng quát ca tin trình P
i
(tin trình kia là P
1-j
)
do {
entry section
critical section
exit section
reminder section
} while (1);
̈ Các tin trình có th chia s mt s bin chung đ đng b hóa hành
đng ca chúng.
Phm Th Phi ©2004
5.7
H điu hành
Gii thut1
̈ Các bin chung:
H int turn;
khi đu turn = 0
H turn = i ⇒ P
i
có th bc vào min tng trc ca nó
̈ Tin trình P
i
do {
while (turn != i) ;
critical section
turn = j;
reminder section
} while (1);
̈ Gii pháp này thõa mãn yêu cu v loi tr h tng nhng không
tin trin đc.
Phm Th Phi ©2004
5.8
H điu hành
Gii thut2
̈ Các bin chia s
H boolean flag[2];
khi đu flag [0] = flag [1] = false.
H flag [i] = true ⇒ P
i
sn sàng bc vào min tng trc ca nó
̈ Tin trình P
i
do {
flag[i] := true;
while (flag[j]) ;
critical section
flag [i] = false;
remainder section
} while (1);
̈ Thõa mãn yêu cu loi tr h tng, nhng không tin trin
Phm Th Phi ©2004
5.9
H điu hành
Gii thut3
̈ Kt hp các bin chia s đc s dng trong các gii thut 1
và 2.
̈ Tin trình P
i
do {
flag [i]:= true;
turn = j;
while (flag [j] and turn = j) ;
critical section
flag [i] = false;
remainder section
} while (1);
̈ Thõa mãn c 3 điu kin
Phm Th Phi ©2004
5.10
H điu hành
Gii thut Bakery
̈ Trc khi bc vào min tng trc ca mình, tin trình nhn
đc mt con s. Tin trình nào nhn đc con s nh nht
s có quyn bc vào min tng trc.
̈ If tin trình P
i
và P
j
nhn đc cùng mt s, và nu i<j,thìP
i
đc phc v trc; ngc li P
j
đc phc v trc.
̈ B sinh luôn luôn sinh ra các con s theo th t tng; ví d
1,2,3,3,3,3,4,5
Min tng trc cho n tin trình
Phm Th Phi ©2004
5.11
H điu hành
Gii thut Bakery
̈ Chú thích < dùng đ so sánh các cp (ticket #, process id #)
H (a,b) < c,d) if a < c or if a = c and b < d
H max (a
0
,…, a
n-1
)làs k, sao cho k ≥ a
i
for i =0,
…, n –1
̈ D liu chia s
boolean choosing[n];
int number[n];
Các d liu trên đc khi to tng ng là false và 0
Phm Th Phi ©2004
5.12
H điu hành
Gii thut Bakery
do {
choosing[i] = true;
number[i] = max(number[0], number[1], …, number [n – 1])+1;
choosing[i] = false;
for (j = 0; j < n; j++) {
while (choosing[j]) ;
while ((number[j] != 0) && ((number[j],j) < (number[i],i)) ;
}
critical section
number[i] = 0;
remainder section
} while (1);
Phm Th Phi ©2004
5.13
H điu hành
ng b hóa vi s tr giúp ca phn cng
̈ c và sa đi ni dung ca mt word mt cách t đng
boolean TestAndSet(boolean &target) {
boolean rv = target;
target = true;
return rv;
}
Phm Th Phi ©2004
5.14
H điu hành
Loi tr tng h vi Test-and-Set
̈ D liu đc chia s:
boolean lock = false;
̈ Tin trình P
i
do {
while (TestAndSet(lock)) ;
critical section
lock = false;
remainder section
}
Phm Th Phi ©2004
5.15
H điu hành
Loi tr tng h vi s tr giúp ca phn cng
̈ T đng swap hai bin
void Swap(boolean &a, boolean &b) {
boolean temp = a;
a = b;
b = temp;
}
Phm Th Phi ©2004
5.16
H điu hành
Loi tr tng h viSwap
̈ D liu chia s (khi to là false):
boolean lock;
boolean waiting[n];
̈ Tin trình P
i
do {
key = true;
while (key == true)
Swap(lock,key);
critical section
lock = false;
remainder section
}
Phm Th Phi ©2004
5.17
H điu hành
Semaphores
̈ Công c dùng đ đng b hóa không gây ra tình trng ch đi bn.
̈ Semaphore S –bin integer
̈ Ch có th đc truy cp thông qua hai thao tác nguyên t (không th
chia nh đc na):
wait (S):
while S≤
0 do no-op;
S ;
signal (S):
S++;
Phm Th Phi ©2004
5.18
H điu hành
Min tng trc ca n tin trình
̈ D liu chia s:
semaphore mutex; //khi đu mutex = 1
̈ Tin trình Pi:
do {
wait(mutex);
critical section
signal(mutex);
remainder section
} while (1);
Phm Th Phi ©2004
5.19
H điu hành
Cài đt Semaphore
̈ nh ngha mt semaphore nh là mt record
typedef struct {
int value;
struct process *L;
} semaphore;
̈ Gi s ta đã có hai thao tác:
H block – ngng tm thi tin trình gi thao tác này.
H wakeup(P) khi đng li tin trình đã b blocked P.
Phm Th Phi ©2004
5.20
H điu hành
Cài đt
̈ Các thao tác trên Semaphore bây gi đc đnh ngha nh sau:
wait(S):
S.value ;
if (S.value < 0) {
add this process to S.L;
block;
}
signal(S):
S.value++;
if (S.value <= 0) {
remove a process P from S.L;
wakeup(P);
}
Phm Th Phi ©2004
5.21
H điu hành
Semaphore nh là công c đng b hóa tng quát
̈ Thc thi B trong P
j
ch sau khi A đã đc thc thi trong P
i
̈ S dng semaphore flag khi to vi giá tr 0
̈ Code:
P
i
P
j
MM
Await(flag)
signal(flag) B
Phm Th Phi ©2004
5.22
H điu hành
Deadlock và cht đói
̈ Deadlock – hai hoc nhiu tin trình đang ch đi vô hn mt s
kin nào đó, mà s kin đóch có th đc to ra bi mt trong các
tin trình đang ch đi kia.
̈ Xem S và Q là 2 semaphores đc khi to là 1
P
0
P
1
wait(S); wait(Q);
wait(Q); wait(S);
MM
signal(S); signal(Q);
signal(Q) signal(S);
̈ S cht đói – b nghn (block) không hn đnh. Mt tin trình có th
không bao gi đc xóa khi hàng đi trong semaphore.
Phm Th Phi ©2004
5.23
H điu hành
Có hai kiu semaphore
̈ Semaphore tng dn– giá tr integer có th tri qua nhiu min
giá tr.
̈ Semaphore nh phân – giá tr integer ch nhn mt trong hai giá tr
0và1;cóth cài đt đn gin hn.
̈ Có th coi semephore nh phân là trng hp đc bit ca
semaphore tng dn.
Phm Th Phi ©2004
5.24
H điu hành
Các bài toán đng b hóa c đin
̈ Bài toán ngi sn xut-ngi tiêu dùng (Bounded-Buffer hay
Producer-Customer)
̈ Bài toán Readers and Writers
̈ Bài toán “5 nhà trit gia n ti” (Dining-Philosophers)
Phm Th Phi ©2004
5.25
H điu hành
Bounded-Buffer
̈ D liu chia s
semaphore full, empty, mutex;
Khi to:
full = 0, empty = n, mutex = 1
Phm Th Phi ©2004
5.26
H điu hành
Bounded-Buffer – tin trình Producer
do {
…
produce an item in nextp
…
wait(empty);
wait(mutex);
…
add nextp to buffer
…
signal(mutex);
signal(full);
} while (1);
Phm Th Phi ©2004
5.27
H điu hành
Bounded-Buffer – Tin trình Consumer
do {
wait(full)
wait(mutex);
…
remove an item from buffer to nextc
…
signal(mutex);
signal(empty);
…
consume the item in nextc
…
} while (1);
Phm Th Phi ©2004
5.28
H điu hành
Bài toán Readers-Writers
̈ D liu chia s
semaphore mutex, wrt;
Khi to
mutex = 1, wrt = 1, readcount = 0
Phm Th Phi ©2004
5.29
H điu hành
Readers-Writers – Tin trình Writer
wait(wrt);
…
writing is performed
…
signal(wrt);
Phm Th Phi ©2004
5.30
H điu hành
Readers-Writers – Tin trình Reader
wait(mutex);
readcount++;
if (readcount == 1)
wait(wrt);
signal(mutex);
…
reading is performed
…
wait(mutex);
readcount ;
if (readcount == 0)
signal(wrt);
signal(mutex):
Phm Th Phi ©2004
5.31
H điu hành
Bài toán nm nhà trit gia n ti
̈ D liu chia s
semaphore chopstick[5];
Khi đu, các giá tr là 1
Phm Th Phi ©2004
5.32
H điu hành
Bài toán nm nhà trit gia n ti
̈ Philosopher i:
do {
wait(chopstick[i])
wait(chopstick[(i+1) % 5])
…
eat
…
signal(chopstick[i]);
signal(chopstick[(i+1) % 5]);
…
think
…
} while (1);
Phm Th Phi ©2004
5.33
H điu hành
Monitors
̈ Cu trúc dùng đ đng b hóa đc cài đt ngôn ng cp cao, nó cho phép
chia s an toàn mt kiu d liu tru tng nào đógia nhiu tin trình cnh
tranh.
monitor monitor-name
{
shared variable declarations
procedure body P1 (…) {
. . .
}
procedure body P2 (…) {
. . .
}
procedure body Pn (…) {
. . .
}
{
initialization code
}
}
Phm Th Phi ©2004
5.34
H điu hành
Monitors
̈ cho phép mt tin trình ch đi trong monitor, mt bin điu
kin phi đc khai báo nh sau:
condition x, y;
̈ Bin điu kin ch có th đc s dng vi hai thao tác wait và
signal.
H Thao tác
x.wait();
có ngha là tin trình đang gi thao tác này đang ng cho đn khi mt
tin trình khác gi
x.signal();
H Thao tác x.signal khi đng li chính xác mt tin trình đang ng đ
ch đi trên bin x. Nu không có tin trình nào đang ng trên x, thì
thao tác signal không gây nh hng gì c.
Phm Th Phi ©2004
5.35
H điu hành
Cái nhìn mt cách có s đ v Monitor
Phm Th Phi ©2004
5.36
H điu hành
Monitor vi các bin điu kin
Phm Th Phi ©2004
5.37
H điu hành
Ví d v cài đt bài toán 5 nhà trit gia n
ti trên monitor
monitor dp
{
enum {thinking, hungry, eating} state[5];
condition self[5];
void pickup(int i) // các slide k tip
void putdown(int i) // các slide k tip
void test(int i) // các slide k tip
void init() {
for (int i = 0; i < 5; i++)
state[i] = thinking;
}
}
Phm Th Phi ©2004
5.38
H điu hành
Các nhà trit gia n ti
void pickup(int i) {
state[i] = hungry;
test[i];
if (state[i] != eating)
self[i].wait();
}
void putdown(int i) {
state[i] = thinking;
// test left and right neighbors
test((i+4) % 5);
test((i+1) % 5);
}
Phm Th Phi ©2004
5.39
H điu hành
5 nhà trit gia 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();
}
}