Giáo trình Hệ điều hành V1.0 - Bài: Đồng bộ hóa quá trình - Nguyễn Phú Trường

Đại Hc Cn Thơ - Khoa Công NghThông Tin - Giáo Trình Hệ Điu Hành – V1.0  
ĐỒNG BHOÁ QUÁ TRÌNH  
I Mc tiêu  
Sau khi hc xong chương này, người hc nm được nhng kiến thc sau:  
Hiu vn đề vùng tương trc  
Hiu cơ chế hot đng hiu báo Semaphores để đồng bhóa quá trình  
Hiu cơ chế hot đng ca Monitors để đồng bhóa quá trình  
Vn dng các gii pháp để gii quyết các bài toán đng bhóa cơ bn  
II Gii thiu  
Mt quá trình hp tác là mt quá trình có thgây nh hưởng hay bị ảnh hưởng ti  
quá trình khác đang thc thi trong hthng. Các quá trình hp tác có thchia strc  
tiếp không gian địa chlun lý (mã và dliu), hay được phép chia sdliu thông  
qua các tp tin. Trường hp đầu đạt được thông qua vic sdng các quá trình có  
trng lượng nhhay lung. Truy xut đng hành dliu được chia scó thdn ti  
vic không đng nht dliu. Trong chương này chúng ta stho lun các cơ chế  
đảm bo vic thc thi có thtca các quá trình hp tác chia skhông gian địa chỉ để  
tính đúng đắn ca dliu luôn được duy trì.  
III Tng quan  
Trong chương trước, chúng ta phát trin mt mô hình hthng cha slượng  
quá trình hp tác tun t, tt cchúng chy bt đồng bvà có thchia sdliu.  
Chúng ta hin thmô hình này vi cơ chế vùng đệm có kích thước gii hn, được đại  
din cho hệ điu hành.  
Chúng ta xét gii pháp bnhớ được chia scho bài toán vùng đệm có kích  
thước gii hn. Gii pháp này cho phép có nhiu nht BUFFER_SIZE –1 sn phm  
trong vùng đệm ti cùng thi đim. Gisrng chúng ta mun hiu chnh gii thut  
để gii quyết sthiếu sót này. Mt khnăng là thêm mt biến đếm snguyên  
counter, được khi to bng 0. counter được tăng mi khi chúng ta thêm mt sn  
phm ti vùng đệm và bgim mi khi chúng ta ly mt sn phm ra khi vùng đệm.  
Mã cho quá trình người sn xut có thể được hiu chnh như sau:  
while (1){/*to sn phm trong nextProduced*/  
while (counter==BUFFER_SIZE); /*không làm gì c*/  
buffer[in] = nextProduced;  
in  
= ( in + 1 ) % BUFFER_SIZE;  
counter++;  
}
Mã cho quá trình người tiêu dùng có thể được hiu chnh như sau:  
while (1){  
while (counter == 0) ;  
/*không làm gì c*/  
nextConsumed = buffer[out];  
Biên son: Th.s Nguyn Phú Trường - 09/2005  
Trang 82  
Đại Hc Cn Thơ - Khoa Công NghThông Tin - Giáo Trình Hệ Điu Hành – V1.0  
out  
= ( out + 1 ) % BUFFER_SIZE;  
counter--;  
/*tiêu thsn phm trong nextConsumed*/  
}
Mc dù chai thtc người sn xut và người tiêu dùng thc thi đúng khi tách  
bit nhau nhưng chúng không thc hin đúng chc năng khi thc thi đng hành. Như  
minh hodưới đây, gisrng giá trca biến counter hin ti là 5 và thtc người  
sn xut và người tiêu dùng thc thi đng hành câu lnh “counter++” và “counter--”.  
Theo sau vic thc thi hai câu lnh này, giá trca biến counter có thlà 4, 5 hay 6!  
Kết quchỉ đúng khi biến counter==5, được to ra đúng nếu quá trình người sn xut  
và người tiêu dùng thc thi riêng bit.  
Chúng ta có thminh hogiá trca counter có thkhông đúng như sau. Chú ý,  
câu lnh “counter++” có thể được cài đặt bng ngôn ngmáy (trên mt máy đin  
hình) như sau:  
register1 = counter  
register1 = register1 + 1  
counter = register1  
Ở đây register1 là mt thanh ghi CPU cc b. Tương t, câu lnh “counter--”  
được cài đặt như sau:  
register2 = counter  
register2 = register2 - 1  
counter = register2  
Ở đây register2 là thanh ghi CPU cc b. Dù là register1 và register2 có thdùng  
cùng thanh ghi vt lý, nhưng ni dung ca thanh ghi sẽ được lưu li và ly li bi bộ  
qun lý ngt.  
Thc thi đồng hành ca “counter++” và “counter--” là tương tnhư thc thi  
tun tự ở đây các câu lnh cp thp hơn được hin din trước bphlp trong thtự  
bt k(nhưng thtbên trong mi câu lnh cp cao được lưu gi). Mt sphlp là:  
T0: producer thc thi  
T1: producer thc thi  
T2: consumer thc thi  
T3: consumer thc thi  
T4: producer thc thi  
T5: consumer thc thi  
register1 = counter  
register1 = register1 + 1  
register2 = counter  
register2 = register2 – 1  
counter = register1  
counter = register2  
{register1 = 5}  
{register1 = 6}  
{register2 = 5}  
{register2 = 4}  
{counter = 6}  
{counter = 4}  
Chú ý rng, chúng ta xem xét tình trng không đúng “counter==4” theo đó có 4  
vùng đệm đầy, nhưng thc tế khi đó có 5 vùng đệm đầy. Nếu chúng đi ngược li thứ  
tca câu lnh T4 và T5, chúng ta scó trng thái không đúng “counter ==6”.  
Chúng ta đi đến trng thái không đúng này vì chúng ta cho phép chai quá trình  
thao tác đng thi trên biến counter. Trường hp tương t, ở đây nhiu quá trình truy  
xut và thao tác cùng dliu đng hành và kết quca vic thc thi phthuc vào  
thtxác định trong đó vic truy xut xy ra, được gi là điu kin cnh tranh (race  
condition). Để ngăn chn điu kin cnh tranh trên, chúng ta cn đảm bo rng chỉ  
mt quá trình ti mt thi đim có thể được thao tác biến counter. Để thc hin vic  
đảm bo như thế, chúng ta yêu cu mt vài hình thc đng bhoá quá trình. Nhng  
Biên son: Th.s Nguyn Phú Trường - 09/2005  
Trang 83  
Đại Hc Cn Thơ - Khoa Công NghThông Tin - Giáo Trình Hệ Điu Hành – V1.0  
trường hp như thế xy ra thường xuyên trong các hệ điu hành khi các phn khác  
nhau ca hthng thao tác các tài nguyên và chúng ta mun các thay đổi không gây  
trngi mt sthay đi khác. Phn chính ca chương này là tp trung vào vn đề  
đng bhoá và cng tác quá trình.  
IV Vn đề vùng tương trc  
Xét mt hthng gm n quá trình (P0, P1, … ,Pn-1 ). Mi quá trình có mt phân  
đon mã, được gi là vùng tương trc (critical section), trong đó quá trình này có thể  
thay đi nhng biến dùng chung, cp nht mt bng, viết đến tp tin,.. Đặc đim quan  
trng ca hthng là ch, khi mt quá trình đang thc thi trong vùng tương trc,  
không có quá trình nào khác được phép thc thi trong vùng tương trc ca nó. Do đó,  
vic thc thi ca các vùng tương trc bi các quá trình là sloi trhtương. Vn đề  
vùng tương trc là thiết kế mt giao thc mà các quá trình có thdùng để cng tác.  
Mi quá trình phi yêu cu quyn để đi vào vùng tương trc ca nó. Vùng mã thc  
hin yêu cu này là phn đi vào (entry section). Vùng tương trc có thể được theo  
sau bi mt phn kết thúc (exit section). Mã còn li là phn còn li (remainder  
section).  
do {  
entry section  
critical section  
exit section  
remainder section  
}
while (1);  
Hình 0-1 Cu trúc chung ca mt quá trình đin hình Pi  
Mt gii pháp đi vi vn đề vùng tương trc phi thomãn ba yêu cu sau:  
Loi trhtương (Mutual Exclusion): Nếu quá trình Pi đang thc thi  
trong vùng tương trc ca nó thì không quá trình nào khác đang được thc  
thi trong vùng tương trc đó.  
Tiến trình (Progress): nếu không có quá trình nào đang thc thi trong  
vùng tương trc và có vài quá trình mun vào vùng tương trc thì chỉ  
nhng quá trình không đang thc thi phn còn li mi có ththam gia vào  
vic quyết định quá trình nào sẽ đi vào vùng tương trc tiếp theo và chn  
la này không thtrì hoãn vô hn định.  
Chờ đợi có gii hn (bounded wait): gii hn sln các quá trình khác  
được phép đi vào min tương trc sau khi mt quá trình thc hin yêu cu  
để đi vào min tương trc ca nó và trước khi yêu cu đó được gán.  
Chúng ta gisrng mi quá trình đang thc thi vi tc độ khác 0. Tuy nhiên,  
chúng ta có ththc hin rng không có githuyết nào được quan tâm vtc tương  
đi ca n quá trình.  
Trong phn tiếp theo chúng ta nghiên cu để nm được các gii pháp thoba  
yêu cu này. Nhng gii pháp này không quan tâm đến các chthphn cng hay số  
lượng bxlý mà phn cng htr. Tuy nhiên chúng ta gisrng nhng chthị  
ngôn ngmáy cơ bn (chthcơ bn như load, store test) được thc hin mang  
Biên son: Th.s Nguyn Phú Trường - 09/2005  
Trang 84  
Đại Hc Cn Thơ - Khoa Công NghThông Tin - Giáo Trình Hệ Điu Hành – V1.0  
tính nguyên t(atomically). Nghĩa là, nếu hai chthnhư thế được thc thi đng hành  
thì kết qutương tnhư thc thi tun ttrong thtkhông xác định. Do đó, nếu chỉ  
thload store được thc thi đng hành thì load snhn giá trcũ hay mi như  
không có skết hp va cũ va mi.  
Khi trình bày mt gii thut, chúng ta định nghĩa chnhng biến được dùng  
cho mc đích đng bvà mô tchmt quá trình đin hình Pi mà cu trúc ca nó  
được hin thtrong hình V.1. Phn đi vào và kết thúc được bao trong hình chnht để  
nhn mnh các đon mã quan trng.  
do {  
while (turn!=i) ;  
critical section  
turn = j;  
remainder section  
}
while (1);  
Hình 0-2-Cu trúc ca quá trình Pi trong gii thut 1  
V Gii pháp  
Có nhiu gii pháp để thc hin vic loi trhtương. Các gii pháp này, tuỳ  
thuc vào cách tiếp cn trong xlý ca quá trình bkhoá, được phân bit thành hai  
lp: chờ đợi bn (busy waiting) và nghn và đánh thc (sleep and wakeup)  
V.1 Gii pháp “chờ đợi bn”  
V.1.1 Gii pháp hai quá trình (two-Process Solution)  
Trong phn này, chúng ta gii hn vic quan tâm ti nhng gii thut có tháp  
dng chhai quá trình cùng mt lúc. Nhng quá trình này được đánh sP0 và P1. Để  
thun li, khi trình bày Pi, chúng ta dùng Pj để chquá trình còn li, nghĩa là j = 1 – i  
.V.1.1.1 Gii thut 1  
Tiếp cn đầu tiên ca chúng ta là để hai quá trình chia smt biến snguyên  
chung turn được khi to bng 0 (hay 1). Nếu turn == 0 thì quá trình Pi được phép  
thc thi trong vùng tương trc ca nó. Cu trúc ca quá trình Pi được hin thtrong  
Hình V.-2.  
Gii pháp này đảm bo rng chmt quá trình ti mt thi đim có thể ở trong  
vùng tương trc ca nó. Tuy nhiên, nó không thomãn yêu cu tiến trình vì nó yêu  
cu sthay đi nghiêm khc ca các quá trình trong vic thc thi ca vùng tương  
trc. Thí d, nếu turn == 0 và P1 sn sàng đi vào vùng tương trc ca nó thì P1 không  
thể đi vào vùng tương trc thm chí khi P0 đang trong phn còn li ca nó.  
.V.1.1.2 Gii thut 2  
Vn đề vi gii thut 1 là nó không gili đủ thông tin vtrng thái ca mi  
quá trình; nó nhchquá trình nào được phép đi vào min tương trc. Để gii quyết  
vn đề này, chúng ta có ththay thế biến turn vi mng sau:  
Boolean flag[2];  
Biên son: Th.s Nguyn Phú Trường - 09/2005  
Trang 85  
Đại Hc Cn Thơ - Khoa Công NghThông Tin - Giáo Trình Hệ Điu Hành – V1.0  
Các phn tca mng được khi to ti flase. Nếu flag[i] là true, giá trnày  
hin thrng Pi sn sàng đi vào vùng tương trc. Cu trúc ca quá trình Pi được hin  
thtrong hình V.-3 dưới đây:  
do{  
flag[i] = true;  
while (flag[j]);  
critical section  
flag[i] = false;  
remainder section  
} while(1);  
Hình 0-3 –Cu trúc ca quá trình Pi trong gii thut 2  
Trong gii thut này, quá trình Pi trước tiên thiết lp flag[i] ti true, hin thị  
rng nó sn sàng đi vào min tương trc. Sau đó, Pi kim tra rng quá trình quá trình  
Pj cũng không sn sàng đi vào min tương trc ca nó. Nếu Pj sn sàng thì Pi schờ  
cho ti khi Pj hin thrng nó không còn cn trong vùng tương trc na (nghĩa là  
cho ti khi flag[j] là false). Ti thi đim này, Pi sẽ đi vào min tương trc. Thoát ra  
khi min tương trc, Pi sẽ đặt flag[i] là false, cho phép quá trình khác (nếu nó đang  
ch) đi vào min tương trc ca nó.  
Trong gii pháp này, yêu cu loi trhtương sẽ được thomãn. Tuy nhiên,  
yêu cu tiến trình không được thomãn. Để minh hovn đề này, chúng ta xem xét  
thtthc thi sau:  
T0: P0 thiết lp flag[0] = true;  
T1: P1 thiết lp flag[1] = true;  
Bây giP0 và P1 được lp mãi mãi trong câu lnh while tương ng ca chúng.  
Gii thut này phthuc chyếu vào thi gian chính xác ca hai quá trình. Thứ  
tnày được phát sinh trong môi trường nơi có nhiu bxlý thc thi đng hành hay  
nơi mt ngt (chng hn như mt ngt định thi) xy ra lp tc sau khi bước T0 được  
thc thi và CPU được chuyn tmt quá trình này ti mt quá trình khác.  
Chú ý rng chuyn đi thtca các chthlnh để thiết lp flag[i] và kim tra  
giá trca flag[j] skhông gii quyết vn đề ca chúng ta. Hơn na chúng ta scó  
mt trường hp đó là hai quá trình trong vùng tương trc cùng mt lúc, vi phm yêu  
cu loi trhtương.  
.V.1.1.3 Gii thut 3  
Gii thut 3 còn gi là gii pháp Peterson. Bng cách kết hp hai ý tưởng quan  
trng trong gii thut 1 và 2, chúng ta đạt được mt gii pháp đúng ti vi vn đề  
vùng tương trc, ở đó hai yêu cu được tho. Các quá trình chia shai biến:  
Boolean flag[2]  
Int turn;  
Khi to flag[0] = flag[1] = false và giá trca turn là không xác định (hoc là  
0 hay 1). Cu trúc ca quá trình Pi được hin thtrong hình sau:  
Biên son: Th.s Nguyn Phú Trường - 09/2005  
Trang 86  
Đại Hc Cn Thơ - Khoa Công NghThông Tin - Giáo Trình Hệ Điu Hành – V1.0  
do{  
flag[i] = true;  
turn = j;  
while (flag[j] &&turn ==j);  
critical section  
flag[i] = false;  
remainder section  
} while (1);  
Hình 0-4 Cu trúc ca quá trình Pi trong gii thut 3  
Để đi vào min tương trc, quá trình Pi trước tiên đặt flag[i] là true sau đó đặt  
turn ti giá trj, do đó xác định rng nếu quá trình khác mun đi vào min tương trc  
nó. Nếu chai quá trình đi vào min tương trc cùng mt lúc turn sẽ đặt chai i và j  
ti xp xcùng mt thi đim. Chmt trong hai phép gán này là kết qucui cùng.  
Giá trcui cùng ca turn quyết định quá trình nào trong hai quá trình được cho phép  
đi vào min tương trc trước.  
Bây gichúng ta chng minh rng gii pháp này là đúng. Chúng ta cn hin thị  
rng:  
1) Loi trhtương được bo toàn  
2) Yêu cu tiến trình được thoả  
3) Yêu cu chờ đợi có gii hn cũng được thoả  
Chng minh thuc tính 1, chúng ta chú ý rng mi Pi đi vào min tương trc  
ca nó chnếu flag[j] ==false hay turn ==i. Cũng chú ý rng, nếu chai quá trình có  
thể đang thc thi trong vùng tương trc ca chúng ti cùng thi đim thì flag[0] ==  
flag[1] ==true. Hai nhn xét này ngý rng P0 và P1 không ththc thi thành công  
trong vòng lp while ca chúng ti cùng mt thi đim vì giá trturn có thlà 0 hay 1.  
Do đó, mt trong các quá trình-Pj phi được thc thi thành công câu lnh while,  
ngược li Pi phi thc thi ít nht câu lnh bsung (“turn==j”). Tuy nhiên, vì ti thi  
đim đó, flag[j] ==true và turn ==j, và điu kin này skhông đi vi điu kin là Pj ở  
trong vùng min tương trc ca nó, kết qusau vic loi trhtương được bo vệ  
do {  
flag[i] = true;  
turn = j;  
while (flag[j] && turn ==j);  
critical section  
flag[i] = false;  
Remainder section  
}while (1);  
Hình 0-5-Cu trúc ca quá trình Pi trong gii thut 3  
Để chng minh thuc tính 2 và 3, chúng ta chú ý rng mt quá trình Pi có thể  
được ngăn chn tvic đi vào min tương truc chnếu nó bkt trong vòng lp while  
vi điu kin flag[j] == true và turn == j. Nếu Pj không sn sàng đi vào min tương  
trc thì flag[j] == false và Pi có thể đi vào min tương trc ca nó. Nếu Pj đặt flag[j] là  
true và nó cũng đang thc thi trong câu lnh while ca nó thì turn == i hay turn == j.  
Nếu turn == i thì Pi sẽ đi vào min tương trc. Nếu turn ==j thì Pj sẽ đi vào min  
tương trc. Tuy nhiên, mt khi Pj trong vùng tương trc ca nó thì nó sẽ đặt li  
Biên son: Th.s Nguyn Phú Trường - 09/2005  
Trang 87  
Đại Hc Cn Thơ - Khoa Công NghThông Tin - Giáo Trình Hệ Điu Hành – V1.0  
flag[j] ti false, cho phép Pi đi vào min tương trc ca nó. Nếu Pj đặt li flag[j] ti  
true, nó cũng phi đặt turn ti i. Do đó, vì Pi không thay đi giá trca biến turn trong  
khi thc thi câu lnh while, nên Pi sẽ đi vào min tương trc (tiến trình) sau khi nhiu  
nht chPj đi vào (chcó gii hn).  
V.1.2 Gii pháp nhiu quá trình  
Gii thut 3 gii quyết vn đề min tương trc cho hai quá trình. Bây giờ  
chúng ta phát trin mt gii thut để gii quyết vn đề min tương trc cho n quá  
trình. Gii thut này được gi là gii thut Bakery và nó da trên cơ sca gii thut  
định thi thường được dùng trong ca hiu bánh mì, ca hàng kem,..nơi mà thtrt  
hn đn. Gii thut này được phát trin cho môi trường phân tán, nhưng ti thi đim  
này chúng ta tp trung chnhng khía cnh ca gii thut liên quan ti môi trường tp  
trung.  
Đi vào mt ca hàng, mi khách hàng nhn mt s. Khách hàng vi sthp  
nht được phc vtiếp theo. Tuy nhiên, gii thut Bakery không thể đảm bo hai quá  
trình (khách hàng) không nhn cùng s. Trong trường hp ràng buc, mt quá trình  
vi tên thp được phc vtrước. Nghĩa là, nếu Pi và Pj nhn cùng mt svà nếu (i <  
j) thì Pi được phc vtrước. Vì tên quá trình là duy nht và được xếp thtnên gii  
thut là hoàn toàn mang tính “may ri” (deterministic).  
Cu trúc dliu chung là  
boolean  
choosing[n];  
int number[n];  
Đầu tiên, các cu trúc dliu này được khi to ti false và 0 tương ng. Để tin  
dng, chúng ta định nghĩa các ký hiu sau:  
(a, b) < (c, d) nếu a< c hay nếu a==c và b< d  
max(a0,…,an-1) là sk ai vi i = 0,…,n-1  
Cu trúc ca quá trình Pi được dùng trong gii thut Bakery, được hin thị  
trong hình dưới đây.  
do {  
choosing[i] = true;  
number[i] = max(number[0], number[i],…,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;  
}
While (1);  
Hình 0-6 Cu trúc ca gii thut Pi trong gii thut Bakery  
Kết quả được cho này thhin rng loi trhtương được tuân theo. Tht vy,  
xét Pi trong vùng tương trc ca nó và Pk cgng đi vào vùng tương trc Pk. Khi quá  
trình Pk thc thi câu lnh while thhai cho j==i, nhn thy rng  
number[ i ] != 0  
(number[ i ], i ) < (number[k], k).  
Biên son: Th.s Nguyn Phú Trường - 09/2005  
Trang 88  
Đại Hc Cn Thơ - Khoa Công NghThông Tin - Giáo Trình Hệ Điu Hành – V1.0  
Do đó, nó tiếp tc vòng lp trong câu lnh while cho đến khi Pi ri khi vùng  
tương trc Pi.  
Gii thut trên đảm bo rng yêu cu vtiến trình, chờ đợi có gii hn và đảm  
bo scông bng, vì các quá trình đi vào min tương trc da trên cơ sti trước  
được phc vtrước.  
V.1.3 Phn cng đồng bhoá  
Như các khía cnh khác ca phn mm, các đặc đim phn cng có thlàm  
các tác vlp trình dhơn và ci tiến tính hiu quca hthng. Trong phn này,  
chúng ta trình bày mt schthphn cng đơn gin sn dùng trên nhiu hthng và  
trình bày cách chúng được dùng hiu qutrong vic gii quyết vn đề min tương  
trc.  
boolean  
TestAndSet( boolean &target){  
boolean rv = target;  
target  
return rv;  
= true;  
}
Hình 0-7 Định nghĩa ca chthTestAndSet  
Vn đề min tương trc có thể được gii quyết đơn gin trong môi trường chỉ  
có mt bxlý nếu chúng ta cm các ngt xy ra khi mt biến chia sẻ đang được thay  
đi. Trong cách này, chúng ta đảm bo rng chui chthhin hành có thể được cho  
phép thc thi trong thtkhông trưng dng. Không có chthnào khác có thchy vì  
thế không có bt csthay đi nào có thể được thc hin trên các biến được chia s.  
Tuy nhiên, gii pháp này là không khthi trong mt môi trường có nhiu bộ  
xlý. Vô hiu hoá các ngt trên đa bxlý có thmt nhiu thi gian khi mt thông  
đip mun truyn qua tt cbxlý. Vic truyn thông đip này btrì hoãn khi đi  
vào min tương trc và tính hiu quca hthng bgim.  
Do đó nhiu máy cung cp các chthphn cng cho phép chúng ta kim tra  
hay thay đi ni dung ca mt t(word) hay để thay đi ni dung ca hai ttuân theo  
tính nguyên t(atomically)-như là mt đơn vkhông thngt. Chúng ta có thsử  
dng các chthị đặc bit này để gii quyết vn đề min tương trc trong mt cách  
tương đi đơn gin.  
ChthTestAndSet có thể được định nghĩa như trong hình V.-7. Đặc đim  
quan trng ca chthnày là vic thc thi có tính nguyên t. Do đó, nếu hai chthị  
TestAndSet được thc thi cùng mt lúc (mi chthtrên mt CPU khác nhau), thì  
chúng sẽ được thc thi tun ttrong thtbt k.  
do{  
while (TestAndSet(lock));  
Critical section  
lock:= false  
remainder section  
} while (1);  
Hình 0-8: Cài đặt loi trhtương vi TestAndSet  
Biên son: Th.s Nguyn Phú Trường - 09/2005  
Trang 89  
Đại Hc Cn Thơ - Khoa Công NghThông Tin - Giáo Trình Hệ Điu Hành – V1.0  
Nếu mt máy htrchthTestAndSet thì chúng ta có thloi trhtương  
bng cách khai báo mt biến khoá kiu lun lý và được khi to ti false. Cu trúc  
ca quá trình Pi được hin thtrong hình V.-9 trên.  
ChthSwap được định như hình V.-9 dưới đây, thao tác trên ni dung ca hai  
t; như chthTestAndSet, nó được thc thi theo tính nguyên t.  
void Swap(boolean &a, boolean &b){  
boolean temp = a;  
a = b;  
b = temp;  
}
Hình 0-9: Định nghĩa chthSwap  
Nếu mt máy htrchthSwap, thì vic loi trhtương có thể được cung  
cp như sau. Mt biến lun lý toàn cc lock được khai báo và được khi to ti false.  
Ngoài ra, mi quá trình cũng có mt biến lun lý cc bkey. Cu trúc ca quá trình Pi  
được hin thtrong hình V.-10 dưới đây.  
do{  
key = true;  
while (key == true) Swap(lock, key);  
Critical section  
lock = false;  
Remainder section  
} while(1);  
Hình 0-10: Cài đặt loi trhtương vi chthSwap  
Các gii thut này không thomãn yêu cu chờ đợi có gii hn. Chúng ta hin  
thgii thut sdng chthTestAndSet trong hình V.-11 dưới đây. Gii thut này  
thomãn tt ccác yêu cu min tương trc.  
do{  
Waiting[i] = true;  
key = true;  
while (waiting[i] && key)  
key = TestAndSet(lock);  
waiting[i] = false;  
Critical section  
j = (i + 1) % n;  
while ((j != i ) && !waiting[j])  
j = (j + 1 ) % n;  
if (j == i)  
lock = false;  
else  
waiting[j] = false;  
Remainder section  
} while(1);  
Hình 0-11 Loi trhtương chờ đợi có gii hn vi TestAndSet  
Biên son: Th.s Nguyn Phú Trường - 09/2005  
Trang 90  
Đại Hc Cn Thơ - Khoa Công NghThông Tin - Giáo Trình Hệ Điu Hành – V1.0  
Cu trúc dliu thông thường là:  
boolean  
boolean  
waiting[n];  
lock;  
Cu trúc dliu này được khi to ti false. Để chng minh rng loi trhỗ  
tương được tho, chúng ta chú ý rng quá trình Pi có thể đưa vào min tương trc chỉ  
nếu hoc waiting[i] ==false hay key == false. Giá trca key có thtrthành false chỉ  
nếu TestAndSet được thc thi. Đối vi quá trình đầu tiên, để thc thi TestAndSet sẽ  
tìm key == false; tt cquá trình khác phi ch. Biến waiting[i] có thtrthành false  
chnếu quá trình khác ri khi min tương trc ca nó; chmt waiting[i] được đặt  
false, duy trì yêu cu loi trhtương.  
Để chng minh yêu cu tiến trình được tho, chúng ta chú ý rng các đi số  
được hin din cho vic loi trhtương cũng áp dng được ở đây, vì thế mt quá  
trình thoát khi min tương trc hoc đặt lock bng false hay đặt waiting[j] bng  
false. Chai trường hp đều cho phép mt quá trình đang chờ để đi vào min tương  
trc được xlý.  
Để chng minh yêu cu chờ đợi được gii hn được tho, chúng ta chú ý rng  
khi mt quá trình ri min tương trc ca nó, nó duyt qua mng waiting trong thtự  
tun hoàn (i + 1, i + 2, …, n – 1, 0, …, i - 1). Nó định rõ quá trình đầu tiên trong thứ  
tnày mà thtự đó trong phn đi vào (waiting[j] == true) khi quá trình tiếp theo đi  
vào min tương trc. Bt cquá trình nào đang chờ để đi vào min tương trc sthc  
hin n – 1 ln. Tuy nhiên, đi vi người thiết kế phn cng, cài đặt các chthnguyên  
tTestAndSet trên bộ đa xlý không là tác vthnghim.  
Nhng gii pháp trên đều phi thc hin mt vòng lp để kim tra liu nó có  
được phép vào min tương trc hay không. Nếu điu kin chưa tho, quá trình phi  
chtiếp tc trong vòng lp kim tra này. Các gii pháp buc quá trình phi liên tc  
kim tra điu kin để phát hin thi đim thích hp được vào min tương trc như thế  
được gi là các gii pháp chờ đợi bn “busy waiting”. Lưu ý, vic kim tra như thế  
tiêu thrt nhiu thi gian sdng CPU, do vy quá trình đang chvn chiếm dng  
CPU. Xu hướng gii quyết vn đề đồng bhoá là nên tránh các gii pháp chờ đợi bn.  
V.2 Các gii pháp “SLEEP and WAKEUP”  
Để loi bcác bt tin ca ca gii pháp chờ đợi bn, chúng ta có thtiếp cn  
theo hướng cho mt quá trình chưa đủ điu kin vào min tương trc chuyn sang  
trng thái nghn, tbquyn sdng CPU. Để thc hin điu này, cn phi sdng  
các thtc do hệ điu hành cung cp để thay đi trng thái quá trình. Hai thtc cơ  
bn SLEEP và WAKEUP thường được sdng cho mc đích này.  
SLEEP là mt li gi hthng có tác dng làm nghn” (blocked) hot động  
ca quá trình gi nó và chờ đến khi được mt tiến trình khác “đánh thc”. Li gi hệ  
thng WAKEUP nhn mt tham sduy nht: quá trình sẽ được kích hot trli (đặt  
vtrng thái sn sàng).  
Ý tưởng sdng SLEEP và WAKEUP như sau: khi mt quá trình chưa đủ  
điu kin vào min tương trc, nó gi SLEEP để tkhoá đến khi có mt quá trình  
khác gi WAKEUP để gii phóng nó. Mt quá trình gi WAKEUP khi ra khi min  
tương trc để đánh thc mt quá trình đang ch, to cơ hi cho quá trình này vào  
min tương trc.  
int  
int  
busy; // 1 nếu min tương trc đang bchiếm  
blocked; // đếm slượng quá trình đang bkhoá  
Biên son: Th.s Nguyn Phú Trường - 09/2005  
Trang 91  
Đại Hc Cn Thơ - Khoa Công NghThông Tin - Giáo Trình Hệ Điu Hành – V1.0  
do{  
if (busy) {  
blocked = blocked + 1;  
sleep();  
}
else busy = 1;  
}while (1);  
Critical section  
busy = 0;  
if (blocked){  
wakeup(process);  
blocked = blocked -1;  
}
Remainder section  
Hình 0-12 Cu trúc chương trình trong gii pháp SLEEP and  
WAKEUP  
Khi sdng SLEEP và WAKEUP cn hết sc cn thn, nếu không mun xy  
ra tình trng mâu thun truy xut trong mt vài tình hung như sau: gisquá trình A  
vào min tương trc, và trước khi nó ri min tương trc thì quá trình B được kích  
hot. Quá trình B thvào min tương trc nhưng nó nhn thy A đang trong đó, do  
vy B tăng giá trbiến blocked lên 1 và chun bgi SLEEP để tnghn. Tuy nhiên,  
trước khi B có ththc hin SLEEP, quá trình A được kích hot trli và ra khi  
min tương trc. Khi ra khi min tương trc, quá trình A nhn thy có mt quá trình  
đang ch(blocked=1) nên gi WAKEUP và gim giá trblocked xung 1. Khi đó tín  
hiu WAKEUP slc mt do quá trình B chưa tht s“ngđể nhn tín hiu đánh  
thc! Khi quá trình B được tiếp tc xlý, nó mi gi SLEEP và tnghn vĩnh vin!  
Vn đề ghi nhn được là tình trng li này xy ra do vic kim tra trng thái  
min tương trc và vic gi SLEEP hay WAKEUP là nhng hành đng tách bit, có  
thbngt na chng trong quá trình xlý, do đó có khi tín hiu WAKEUP gi đến  
mt quá trình chưa bnghn slc mt. Để tránh nhng tình hung tương t, hệ điu  
hành cung cp nhng cơ chế đồng bhoá da trên ý tưởng ca chiến lược “SLEEP  
and WAKEUP” nhưng chưa được xây dng bao gm cphương tin kim tra điu  
kin vào min tương trc giúp sdng an toàn.  
V.2.1 Semaphore  
Tiếp cn Semaphore được. Dijkstra đề xut vào năm 1965. Mt semaphore S  
là mt biến snguyên (integer) được truy xut chthông qua hai thao tác nguyên t:  
wait signal. Các thao tác này được đặt tên P (cho wait - chờ để kim tra) và V (cho  
signal- báo hiu để tăng). Đnh nghĩa cơ bn ca wait trong mã gilà:  
wait(S){  
while (S0)  
;//no-op  
S--;  
}
Đnh nghĩa cơ bn ca signal trong mã gilà  
signal(S){  
S++;  
}
Biên son: Th.s Nguyn Phú Trường - 09/2005  
Trang 92  
Đại Hc Cn Thơ - Khoa Công NghThông Tin - Giáo Trình Hệ Điu Hành – V1.0  
Nhng sa đi đi vi giá trinteger ca semaphore trong các thao tác wait và  
signal phi được thc thi không bphân chia. Nghĩa là khi mt quá trình sa đi giá  
trsemaphore, không có quá trình nào cùng mt lúc có thsa đi cùng biến  
semaphore đó. Ngoài ra, trong trường hp ca biến wait(S), kim tra giá trinteger  
ca S (S 0) và sa đi có thca nó (S--) cũng phi được thc thi mà không bngt.  
.V.2.1.1 Cách dùng  
Chúng ta có thsdng semaphores để gii quyết vn đề min tương trc vi  
n quá trình. N quá trình chia smt biến semaphore, mutex (viết tt tmutual  
exclusion) được khi to 1. Mi quá trình Pi được tchc như được hin thtrong  
hình dưới đây.  
do{  
wait(mutex)  
critical section  
Signal(mutex)  
remainder section  
}while(1);  
Hình 0-13 Cài đặt loi trhtương vi semaphores  
Chúng ta cũng sdng semaphores để gii quyết các vn đề đồng bkhác  
nhau. Thí d, để xem xét hai quá trình đang thc thi đng hành: P1 vi câu lnh S1 và  
P2 vi câu lnh S2. Gischúng ta yêu cu rng S2 được thc thi chsau khi S1 hoàn  
thành. Chúng ta có thhoàn thành cơ chế này mt cách ddàng bng cách P1 và P2  
chia smt semaphore chung synch, được khi to 0 và bng cách chèn các câu lnh:  
S1;  
signal(sync);  
vào quá trình P1 và các câu lnh:  
wait(synch);  
S2;  
vào trong quá trình P2. Vì synch được khi to 0. P2 sthc thi S2 chsau khi P1 np  
signal(synch) mà sau đó là S1;  
.V.2.1.2 Cài đặt  
Nhược đim chính ca các gii pháp loi trhtương trong phn V.-5.1 và  
ca semaphore được cho ở đây là tt cchúng đều đòi hi schờ đợi bn.Để gii  
quyết yêu cu cho vic chờ đợi bn, chúng ta có thhiu chnh định nghĩa ca các  
thao tác wait và signal ca semaphore. Khi mt quá trình thc thi thao tác wait và  
nhn thy rng nếu giá trca semaphore không dương, nó phi ch. Tuy nhiên, thay  
vì chờ đợi bn, quá trình có thnghn chính nó. Thao tác nghn đặt quá trình vào mt  
hàng đợi gn lin vi semaphore và trng thái quá trình được chuyn ti trng thái  
ch. Sau đó, điu khin được chuyn ti bộ định thi biu và bộ định thi biu chn  
mt quá trình khác để thc thi.  
Mt quá trình bnghn chtrên biến semaphore nên được khi đng li khi  
quá trình khác thc thi thao tác signal. Quá trình được khi động li bi thao tác  
wakeup và chuyn quá trình ttrng thái chsang trng thái sn sàng. Sau đó, quá  
trình này được đặt vào hàng đợi sn sàng. (CPU có thhay không thể được chuyn từ  
quá trình đang chy ti quá trình sn sàng mi nht phthuc vào gii thut định thi  
biu CPU).  
Biên son: Th.s Nguyn Phú Trường - 09/2005  
Trang 93  
Đại Hc Cn Thơ - Khoa Công NghThông Tin - Giáo Trình Hệ Điu Hành – V1.0  
Để cài đặt semaphore dưới định nghĩa này, chúng ta định nghĩa mt  
semaphore như mt cu trúc được viết bng C như sau:  
typedef struct{  
int  
struct process *L;  
} semaphore;  
value;  
Mi semaphore có mt sinteger value và mt danh sách các quá trình L. Khi  
mt quá trình phi chtrên mt semaphore, nó được thêm vào danh sách các quá trình  
L. Mt thao tác signal xoá mt quá trình ra khi danh sách các quá trình đang chvà  
đánh thc quá trình đó.  
Thao tác semaphore wait bây giờ được định nghĩa như sau:  
void wait(semaphore S){  
S.value--;  
If (S.value < 0){  
Thêm quá trình này ti danh sách các quá trình S.L;  
block();  
}
}
Thao tác semaphore signal bây gicó thể được định nghĩa như sau:  
void signal(semaphore S){  
S.value++;  
if(S.value <= 0){  
xoá mt quá trình ra khi hàng đợi S.L;  
wakeup(P);  
}
}
Thao tác block() tm dng quá trình gi thao tác đó. Thao tác wakeup(P) tiếp  
tc thc thi quá trình bnghn P. Hai thao tác này được cung cp bi hệ điu hành  
như nhng li gi hthng cơ bn.  
Chú ý rng, mc dù dưới sự định nghĩa kinh đin ca semaphores vi schờ  
đợi bn là giá trsemaphore không bao giâm. Cài đặt này có thcó giá trị  
semaphore âm. Nếu giá trsemaphore âm thì tính cht trng yếu ca nó là slượng  
quá trình chtrên semaphore đó. Stht này là kết quca vic chuyn thtca  
vic gim và kim tra trong vic cài đặt thao tác wait. Danh sách các quá trình đang  
chcó thể được cài đặt ddàng bi mt trường liên kết trong mi khi điu khin quá  
trình (PCB). Mi cách thêm và xoá các quá trình tdanh sách, đảm bo vic chờ đợi  
có gii hn ssdng hàng đợi FIFO, ở đó semaphore cha hai con trỏ đầu (head) và  
đuôi (tail) chti hàng đợi. Tuy nhiên, danh sách có thdùng bt cchiến lược hàng  
đợi nào. Sdng đúng semaphores không phthuc vào chiến lược hàng đợi cho  
danh sách semaphore.  
Khía cnh quyết định ca semaphores là chúng được thc thi theo tính nguyên  
t. Chúng ta phi đảm bo rng không có hai quá trình có ththc thi các thao tác  
wait và signal trên cùng mt semaphore ti cùng mt thi đim. Trường hp này là  
vn đề vùng tương trc và có thgii quyết bng mt trong hai cách.  
Trong môi trường đơn xlý (nghĩa là chcó mt CPU tn ti), đơn gin là chúng ta  
có thngăn chn các ngt trong thi gian các thao tác wait và signal xy ra. Cơ chế  
này làm vic trong mt môi trường đơn xlý vì mt khi ngt bngăn chn, các chthị  
tcác quá trình khác không thể được chen vào. Chquá trình đang chy hin ti thc  
thi cho ti khi các ngt được cho phép sdng trli và bộ định thi có ththu hi  
quyn điu khin.  
Biên son: Th.s Nguyn Phú Trường - 09/2005  
Trang 94  
Đại Hc Cn Thơ - Khoa Công NghThông Tin - Giáo Trình Hệ Điu Hành – V1.0  
Trong môi trường đa xlý, ngăn chn ngt không ththc hin được. Các chỉ  
thtcác quá trình khác nhau (chy trên các bxlý khác nhau) có thể được chen  
vào trong cách bt k. Nếu phn cng không cung cp bt ccác chthị đặc bit nào,  
chúng ta có thtn dng các gii pháp phn cng phù hp cho vn đề vùng tương trc  
(phn V.-4), ở đó các vùng tương trc cha cá thtc wait và signal.  
Vn đề quan trng là chúng ta không xoá hoàn toàn chờ đợi bn, vi định  
nghĩa này cho các thao tác wait và signal. Dĩ nhiên là chúng ta xoá chờ đợi bn từ  
vic đi vào vùng tương trc ca chương trình ng dng. Ngoài ra, chúng ta hn chế  
vic chờ đợi bn chcác min tương trc vi thao tác wait và signal và các vùng này  
là ngn (nếu được mã hp lý, chúng nên không quá 10 chth). Do đó, min tương  
trc hu như không bao gibchiếm và schờ đợi bn rt hiếm khi xy ra và sau đó  
chcho thi gian ngn. Mt trường hp hoàn toàn khác xy ra vi nhng chương trình  
ng dng có min tương trc dài (vài phút hay thm chí vài gi) hay có thhu như  
luôn bchiếm. Trong trường hp này, chờ đợi bn là cc kkém hiu qu.  
.V.2.1.3 Skhoá chết (deadlocks) và đói tài nguyên  
Cài đặt semaphore vi mt hàng đợi có thdn đến trường hp hai hay nhiu  
quá trình đang chkhông hn định mt skin mà có thể được gây ra chbi mt  
trong nhng quá trình đang ch. Skin đặt ra là sthc thi ca thao tác signal. Khi  
mt trng thái như thế xy ra, nhng quá trình này được nói là bkhoá chết.  
Để hin thị điu này, chúng ta xét mt hthng cha hai quá trình P0 và P1,  
mi truy xut hai semaphore, S và Q, được đặt giá tr1.  
P0  
P1  
wait(S);  
wait(Q);  
.
wait(Q);  
wait(S);  
.
.
.
signal(S);  
Signal(Q);  
signal(Q);  
signal(S);  
Gisrng P0 thc thi wait(S) và sau đó P1 thc thi wait(Q). Khi P0 thc thi  
wait(Q), nó phi chcho đến khi P1 thc thi signal(Q). Tương t, khi P1 thc thi  
wait(S), nó phi chcho ti khi P0 thc thi signal(S). Vì các thao tác signal này không  
thể được thc thi nên P0 và P1 bkhoá chết.  
Chúng ta nói rng mt tp hp các quá trình trong trng thái khoá chết khi mi  
quá trình trong tp hp đang chmt skin được gây ra chbi mt quá trình khác  
trong tp hp. Nhng skin mà chúng ta quan tâm chyếu ở đây là vic chiếm tài  
nguyên và gii phóng tài nguyên. Tuy nhiên, các loi skin khác cũng có thdn  
đến vic khoá chết. Chúng ta sxem trong chương VI. Trong chương đó, chúng ta sẽ  
mô tcác cơ chế khác nhau để gii quyết vn đề khoá chết.  
Mt vn đề khoá chết liên quan ti khoá chết là nghn hay đói tài nguyên  
không hn định (indefinite blocking or starvation), ở đó các quá trình chờ đợi không  
hn định trong semaphore. Nghn không hn định có thxy ra nếu chúng ta thêm  
vào và ly ra các quá trình tdanh sách được ni kết vi mt semaphore trong thtự  
vào sau ra trước (LIFO).  
Biên son: Th.s Nguyn Phú Trường - 09/2005  
Trang 95  
Đại Hc Cn Thơ - Khoa Công NghThông Tin - Giáo Trình Hệ Điu Hành – V1.0  
.V.2.1.4 Semaphore nhphân  
Xây dng semaphore được mô ttrong phn trước được gi là semaphore  
đếm (counting semaphore) vì giá trnguyên có thtrãi dài mt phm vi không gii  
hn. Mt semaphore nhphân (binary semaphore) là mt semaphore vi mt giá trị  
nguyên mà tri dài t0 và 1. Semaphore nhphân có thể đơn gin hơn trong cài đặt so  
vi semaphore đếm và phthuc vào kiến trúc phn cng nm bên dưới. Chúng sẽ  
hin thcách mt semaphore đếm có thể được cài đặt sdng semaphore nhphân  
dưới đây:  
GisS là mt semaphore đếm. Để cài đặt nó trong dng semaphore nhphân  
chúng ta cn các cu trúc dliu như sau:  
Binary-semaphore S1, S2;  
int C;  
Khi to S1 = 1, S2 = 0 và giá trnguyên C được đặt ti giá trkhi to ca  
semaphore đếm S.  
Thao tác wait trên semaphore đếm S có thể được cài đặt như sau:  
wait(S);  
C--;  
If (C<0) {  
signal(S1);  
wait(S2);  
}
signal(S1);  
Thao tác signal trên semaphore đếm S có thể được cài đặt như sau:  
wait(S1);  
C++;  
if (C<=0)  
signal(S2);  
else  
signal(S1);  
V.2.2 Monitors  
Để có thdviết đúng các chương trình đng bhoá hơn, Hoare (1974) và  
Brinch & Hansen (1975) đề nghmt cơ chế đồng bhoá cp cao hơn được cung cp  
bi ngôn nglp trình là monitor. Mt monitor được mô tbi mt tp hp ca các  
toán tử được định nghĩa bi người lp trình. Biu din kiu ca mt monitor bao gm  
vic khai báo các biến mà giá trca nó xác định trng thái ca mt thhin kiu,  
cũng như thân ca thtc hay hàm mà cài đặt các thao tác trên kiu đó. Cú pháp ca  
monitor được hin thtrong hình dưới đây:  
Monitor <tên monitor>  
{
khai báo các biến được chia sẻ  
procedure P1 (…){  
}
procedure P2 (…){  
Biên son: Th.s Nguyn Phú Trường - 09/2005  
Trang 96  
Đại Hc Cn Thơ - Khoa Công NghThông Tin - Giáo Trình Hệ Điu Hành – V1.0  
}
.
.
.
procedure Pn (…){  
}
{
mã khi to  
}
}
Hình 0-14 Cú pháp ca montor  
Biu din kiu monitor không thể được dùng trc tiếp bi các quá trình khác  
nhau. Do đó, mt thtc được định nghĩa bên trong mt monitor chcó thtruy xut  
nhng biến được khai báo cc bbên trong monitor đó và các tham schính thc ca  
nó. Tương t, nhng biến cc bca monitor có thể được truy xut chbi nhng thủ  
tc cc b.  
Xây dng monitor đảm bo rng chmt quá trình ti mt thi đim có thể  
được kích hot trong monitor. Do đó, người lp trình không cn viết mã ràng buc  
đng bhoá như hình V-15 dưới đây:  
Hình 0-15 Hình nh dưới dng biu đồ ca monitor  
Tuy nhiên, xây dng monitor như được định nghĩa là không đủ mnh để mô  
hình hoá các cơ chế đồng b. Cho mc đích này, chúng ta cn định nghĩa các cơ chế  
đng bhoá bsung. Nhng cơ chế này được cung cp bi construct condition.  
Người lp trình có thể định nghĩa mt hay nhiu biến ca kiu condition:  
condition x, y;  
Chnhng thao tác có thgi lên trên các biến điu kin là wait và signal.  
Thao tác  
Biên son: Th.s Nguyn Phú Trường - 09/2005  
Trang 97  
Đại Hc Cn Thơ - Khoa Công NghThông Tin - Giáo Trình Hệ Điu Hành – V1.0  
x.wait();  
có nghĩa là quá trình gi trên thao tác này được tm dng cho đến khi quá trình khác  
gi  
x.signal();  
thao tác x.signal() thc thi tiếp mt cách chính xác mt quá trình tm dng. Nếu  
không có quá trình tm dng thì thao tác signal không bị ảnh hưởng gì c; nghĩa là  
trng thái x như ththao tác chưa bao giờ được thc thi (như hình V.-16). Ngược li,  
vi thao tác signal được gán cùng vi semaphores luôn nh hưởng ti trng thái ca  
semaphore.  
Bây gigisrng, khi thao tác x.signal() được gi bi mt quá trình P thì có  
mt quá trình Q gán vi biến điu kin x btm dng. Rõ ràng, nếu quá trình Q được  
phép thc thi tiếp thì quá trình P phi dng. Nếu không thì chai quá trình P và Q  
hot đng cùng mt lúc trong monitor. Tuy nhiên, vkhái nim hai quá trình có thể  
tiếp tc vic thc thi ca chúng. Hai khnăng có thxy ra:  
P chcho đến khi Q ri khi monitor hoc chờ điu kin khác.  
Q chcho đến khi P ri monitor hoc chờ điu kin khác.  
Hình 0-16 Monitor vi các biến điu kin  
Có các lun chp lý trong vic chp nhn khnăng 1 hay 2. Vì P đã thc thi  
trong monitor ri, nên chn khnăng 2 có vhp lý hơn. Tuy nhiên, nếu chúng ta cho  
phép quá trình P tiếp tc, biến điu kin “lun lý” mà Q đang chcó thkhông còn  
qun lý thi gian Q được tiếp tc. Chn khnăng 1 được tán thành bi Hoare vì tham  
số đầu tiên ca nó chuyn trc tiếp ti các qui tc chng minh đơn gin hơn. Thoả  
hip gia hai khnăng này được chp nhn trong ngôn ngữ đồng hành C. Khi quá  
trình P thc thi thao tác signal thì quá trình Q lp tc được tiếp tc. Mô hình này  
không mnh hơn mô hình ca Hoare vì mt quá trình không thbáo hiu nhiu ln  
trong mt li gi thtc đơn.  
Bây gichúng ta xem xét cài đặt cơ chế monitor dùng semaphores. Đối vi  
mi monitor, mt biến semaphore mutex (được khi to 1) được cung cp. Mt quá  
Biên son: Th.s Nguyn Phú Trường - 09/2005  
Trang 98  
Đại Hc Cn Thơ - Khoa Công NghThông Tin - Giáo Trình Hệ Điu Hành – V1.0  
trình phi thc thi wait(mutex) trước khi đi vào monitor và phi thc thi  
signal(mutex) sau khi ri monitor.  
Vì quá trình đang báo hiu phi chcho đến khi quá trình được bt đầu li ri  
hay ch, mt biến semaphore bsung next được gii thiu, được khi to 0 trên quá  
trình báo hiu có thttm dng. Mt biến snguyên next_count cũng sẽ được cung  
cp để đếm slượng quá trình btm dng trên next. Do đó, mi thtc bên ngoài F  
sẽ được thay thế bi  
wait(mutex);  
. . .  
thân ca F  
if (next_count > 0)  
signal(next);  
else  
signal(mutex);  
Loi trhtương trong monitor được đảm bo.  
Bây gichúng ta mô tcác biến điu kin được cài đặt như thế nào. Đối vi  
mi biến điu kin x, chúng ta gii thiu mt biến semaphore x_sem và biến số  
nguyên x_count, chai được khi to ti 0. Thao tác x.wait có thể được cài đặt như  
sau:  
x_count++;  
if ( next_count > 0)  
signal(next);  
else  
signal(mutex);  
wait(x_sem);  
x_count--;  
Thao tác x.signal() có thể được cài đặt như sau:  
if ( x_count > 0){  
next_count++;  
signal(x_sem);  
wait(next);  
next_count--;  
}
Cài đặt này có tháp dng để định nghĩa ca monitor được cho bi chai  
Hoare và Brinch Hansen. Tuy nhiên, trong mt strường hp tính tng quát ca vic  
cài đặt là không cn thiết và yêu cu có mt ci tiến hiu quhơn.  
Bây gichúng ta strli chủ đề thtbt đầu li ca quá trình trong  
monitor. Nếu nhiu quá trình btrì hoãn trên biến điu kin x và thao tác x.signal  
được thc thi bi mt vài quá trình thì thtcác quá trình btrì hoãn được thc thi  
trli như thế nào? Mt gii pháp đơn gin là dùng thtFCFS vì thế quá trình chờ  
lâu nht sẽ được thc thi tiếp trước. Tuy nhiên, trong nhiu trường hp, cơ chế định  
thi biu như thế là không đ. Cho mc đích này cu trúc conditional-wait có thể  
được dùng; nó có dng  
x.wait(c);  
ở đây c là mt biu thc snguyên được định giá khi thao tác wait được thc thi. Giá  
trc, được gi là số ưu tiên, được lưu vi tên quá trình được tm dng. Khi x.signal  
được thc thi, quá trình vi số ưu tiên nhnht được thc thi tiếp.  
Biên son: Th.s Nguyn Phú Trường - 09/2005  
Trang 99  
Đại Hc Cn Thơ - Khoa Công NghThông Tin - Giáo Trình Hệ Điu Hành – V1.0  
Để hin thcơ chế mi này, chúng ta xem xét monitor được hin thnhư hình  
dưới đây, điu khin vic cp phát ca mt tài nguyên đơn gia các quá trình cnh  
tranh. Mi quá trình khi yêu cu cp phát tài nguyên ca nó, xác định thi gian ti đa  
nó hoch định để sdng tài nguyên. Monitor cp phát tài nguyên ti quá trình có yêu  
cu thi gian cp phát ngn nht.  
Monitor ResourceAllocation  
{
boolean  
condition  
busy;  
x;  
void acquire(int time){  
if (busy)  
busy = true;  
}
x.wait(time);  
void release(){  
busy = false;  
x.signal();  
}
void init(){  
busy = false;  
}
}
Hình 0-17 Mt monitor cp phát ti mt tài nguyên  
Mt quá trình cn truy xut tài nguyên phi chú ý thtsau:  
R.acquire(t);  
truy xut tài nguyên  
...  
R.release();  
ở đây R là thhin ca kiu ResourceAllocation.  
Tuy nhiên, khái nim monitor không đảm bo rng các thttruy xut trước sẽ  
được chú ý. Đặc bit,  
Mt quá trình có thtruy xut tài nguyên mà không đạt được quyn truy xut  
trước đó.  
Mt quá trình skhông bao gigii phóng tài nguyên mt khi nó được gán  
truy xut ti tài nguyên đó.  
Mt quá trình có thcgng gii phóng tài nguyên mà nó không bao giyêu  
cu.  
Mt quá trình có thyêu cu cùng tài nguyên hai ln (không gii phóng tài  
nguyên đó trong ln đầu)  
Vic sdng monitor cũng gp cùng nhng khó khăn như xây dng min tương  
trc. Trong phn trước, chúng ta lo lng vvic sdng đúng semaphore. Bây gi,  
chúng ta lo lng vvic sdng đúng các thao tác được định nghĩa ca người lp  
trình cp cao mà các trình biên dch không còn htrchúng ta.  
Biên son: Th.s Nguyn Phú Trường - 09/2005  
Trang 100  
Đại Hc Cn Thơ - Khoa Công NghThông Tin - Giáo Trình Hệ Điu Hành – V1.0  
Mt gii pháp có thể đối vi vn đề trên là cha các thao tác truy xut tài nguyên  
trong monitor ResourceAllocation. Tuy nhiên, gii pháp này sdn đến vic định thi  
được thc hin da theo gii thut định thi monitor được xây dng sn hơn là được  
viết bi người lp trình.  
Để đảm bo rng các quá trình chú ý đến ththp lý, chúng ta phi xem xét kỹ  
tt cchương trình thc hin vic dùng monitor ResourceAllocation và nhng tài  
nguyên được qun lý ca chúng. Có hai điu kin mà chúng ta phi kim tra để thiết  
lp tính đúng đắn ca hthng. Đầu tiên, các quá trình người dùng phi luôn luôn  
thc hin các li gi ca chúng trên monitor trong thtự đúng. Thhai, chúng ta phi  
đảm bo rng mt quá trình không hp tác không đơn gin bqua cng (gateway)  
loi trhtương được cung cp bi monitor và cgng truy xut trc tiếp tài nguyên  
được chia smà không sdng giao thc truy xut. Chnếu hai điu kin này có thể  
được đảm bo có thchúng ta đảm bo rng không có li ràng buc thi gian nào xy  
ra và gii thut định thi skhông btht bi.  
Mc dù vic xem xét này có thcho hthng nh, tĩnh nhưng nó không phù hp  
cho mt hthng ln hay đng. Vn đề kim soát truy xut có thể được gii quyết chỉ  
bi mt cơ chế bsung khác.  
VI Các bài toán đồng bhoá nguyên thuỷ  
Trong phn này, chúng ta trình bày mt sbài toán đng bhoá như nhng thí  
dvsphân cp ln các vn đề điu khin đng hành. Các vn đề này được dùng  
cho vic kim tra mi cơ chế đồng bhoá được đề nghgn đây. Semaphore được  
dùng cho vic đng bhoá trong các gii pháp dưới đây.  
VI.1 Bài toán người sn xut-người tiêu thụ  
Bài toán người sn xut-người tiêu th(Producer-Consumer) thường được  
dùng để hin thsc mnh ca các hàm cơ sở đồng bhoá. Hai quá trình cùng chia sẻ  
mt vùng đệm có kích thước gii hn n. Biến semaphore mutex cung cp sloi trừ  
htương để truy xut vùng đệm và được khi to vi giá tr1. Các biến semaphore  
empty full đếm skhe trng và đầy tương ng. Biến semaphore empty được khi  
to ti giá trn; biến semaphore full được khi to ti giá tr0.  
Mã cho người quá trình sn xut được hin thtrong hình V.-18:  
do{  
sn xut sn phm trong nextp  
wait(empty);  
wait(mutex);  
thêm nextp ti vùng đệm  
signal(mutex);  
signal(full);  
} while (1);  
Hình 0-18 Cu trúc ca quá trình người sn xut  
Mã cho quá trình người tiêu thụ được hin thtrong hình dưới đây:  
Biên son: Th.s Nguyn Phú Trường - 09/2005  
Trang 101  
Tải về để xem bản đầy đủ
pdf 24 trang baolam 07/05/2022 5860
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình Hệ điều hành V1.0 - Bài: Đồng bộ hóa quá trình - Nguyễn Phú Trường", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

File đính kèm:

  • pdfgiao_trinh_he_dieu_hanh_v1_0_bai_dong_bo_hoa_qua_trinh_nguye.pdf