Bài giảng Hệ điều hành - Chương 3: Đồng bộ và giải quyết tranh chấp (Process Synchronization) - Thoại Nam

Chöông 3  
Ñoàng boä vaø giaûi quyeát  
tranh chaáp  
(Process Synchronization)  
-1-  
Noäi dung  
‰ Khaùi nieäm cô baûn  
‰ Baøi toaùn “Critical-Section”  
‰ Caùc giaûi phaùp phaàn meàm  
– Peterson, Bakery  
‰ Ñoàng boä baèng hardware  
‰ Semaphore  
‰ Caùc baøi toaùn ñoàng boä  
‰ Critical Region  
‰ Monitor  
-2-  
Khoa Coâng Ngheä Thoâng Tin – Ñaïi Hoïc Baùch Khoa Tp.HCM  
1
Khaùi nieäm cô baûn  
‰ Caùc process/thread thöïc thi ñoàng thôøi chia seû code, chia  
seû döõ lieäu (qua shared memory, file).  
‰ Neáu khoâng coù söï ñieàu khieån khi truy caäp caùc döõ lieäu chia  
seû thì coù theå xaûy ra tröôøng hôïp khoâng nhaát quaùn döõ lieäu  
(data inconsistent).  
‰ Ñeå duy trì söï nhaát quaùn döõ lieäu, heä thoáng caàn coù cô cheá  
baûo ñaûm söï thöïc thi coù thöù töï cuûa caùc process ñoàng thôøi.  
‰ Ví duï Bounded-Buffer (ch.4) theâm bieán ñeám count  
#define BUFFER_SIZE 10  
# typedef struct {  
… } item;  
item buffer[BUFFER_SIZE];  
int in = 0, out = 0, count = 0;  
-3-  
Khoa Coâng Ngheä Thoâng Tin – Ñaïi Hoïc Baùch Khoa Tp.HCM  
Bounded Buffer (t.t)  
‰ Producer  
item nextProduced;  
while (1){  
while ( count == BUFFER_SIZE ); /* do nothing */  
buffer[in] = nextProduced;  
count++;  
in = (in + 1) % BUFFER_SIZE;  
}
‰ C
item nextConsumed;  
while (1){  
while ( count == 0 ); /* do nothing */  
buffer[in] = nextConsumed;  
count--;  
out = (out + 1) % BUFFER_SIZE;  
}
-4-  
Khoa Coâng Ngheä Thoâng Tin – Ñaïi Hoïc Baùch Khoa Tp.HCM  
2
Race Condition  
‰ Caùc leänh taêng, giaûm bieán  
töông ñöông trong ngoân ngöõ  
maùy laø:  
‰ Race condition: nhieàu  
process truy xuaát vaø thao  
taùc ñoàng thôøi treân döõ lieäu  
chia seû.  
‰ (P) count ++;  
– register1 := count  
– register1 := register1 +1  
– count := register1  
‰ (C) count --;  
– Keát quaû cuoái cuøng cuûa vieäc  
truy xuaát ñoàng thôøi naøy phuï  
thuoäc thöù töï thöïc thi cuûa caùc  
leänh thao taùc döõ lieäu.  
‰ Chuùng ta caàn baûo ñaûm sao  
cho taïi moãi thôøi ñieåm coù moät  
vaø chæ moät process ñöôïc  
truy xuaát, thao taùc treân döõ  
lieäu chia seû. Do ñoù, caàn coù  
cô cheá ñoàng boä hoaït ñoäng  
cuûa caùc process naøy.  
– register2 := count  
– register2 := register2 -1  
– count := register2  
‰ Trong ñoù, registeri laø caùc thanh  
ghi cuûa CPU.  
-5-  
Khoa Coâng Ngheä Thoâng Tin – Ñaïi Hoïc Baùch Khoa Tp.HCM  
Ví duï veà Race Condition  
‰ Quaù trình thöïc hieän xen keõ cuûa leänh taêng/giaûm bieán count  
‰ Hieän taïi: count = 5  
0: producer r e gi s t e r 1 : = c ount  
1: producer r e gi s t e r 1 : = r e gi s t e r 1+1  
2: consumer r e gi s t e r 2 : = c ount  
3: consumer r e gi s t e r 2 : = r e gi s t e r 2- 1  
4
5: consumer c ount : = r e gi s t e r 2  
{register1 = 5}  
{register1 = 6}  
{register2 = 5}  
{register2 = 4}  
{count = 4}  
0
Caû hai process thao taùc ñoàng thôøi treân bieán chung count. Keát  
quaû cuûa bieán chung naøy khoâng nhaát quaùn döôùi caùc thao taùc  
cuûa hai process ⇒ leänh count++, count-- phaûi laø atomic, nghóa  
laø thöïc hieän nhö moät leänh ñôn, khoâng bò ngaét nöûa chöøng.  
-6-  
Khoa Coâng Ngheä Thoâng Tin – Ñaïi Hoïc Baùch Khoa Tp.HCM  
3
Critical Section  
‰ Giaû söû coù n process cuøng truy xuaát ñoàng thôøi döõ lieäu  
chia seû  
‰ Khoâng phaûi taát caû caùc ñoaïn code ñeàu phaûi ñöôïc  
quan taâm giaûi quyeát vaán ñeà race condition maø chæ  
nhöõng ñoaïn code coù chöùa caùc thao taùc treân döõ lieäu  
chia seû. Ñoaïn code naøy ñöôïc goïi laø vuøng tranh chaáp  
- critical section (CS).  
‰ Vaán ñeà ñaët ra: phaûi baûo ñaûm raèng khi moät process  
ñang thöïc thi trong vuøng tranh chaáp, khoâng coù moät  
process naøo khaùc ñöôïc pheùp thöïc thi caùc leänh trong  
vuøng tranh chaáp ⇒ mutual exclusion (mutex): söï loaïi  
tröø töông hoã.  
-7-  
Khoa Coâng Ngheä Thoâng Tin – Ñaïi Hoïc Baùch Khoa Tp.HCM  
Critical Section vaø Mutual Exclusion  
A:enter(critical_section)  
A:leave(critical_section)  
ProcessA  
Battemps  
B:enter(critical_section)  
ProcessB  
Time  
Bblocked  
B:leave(critical_section)  
t3  
t1  
t2  
-8-  
Khoa Coâng Ngheä Thoâng Tin – Ñaïi Hoïc Baùch Khoa Tp.HCM  
4
Caáu truùc toång quaùt  
Moät soá giaû ñònh:  
‰ Giaû söû moãi process thöïc thi bình  
thöôøng (i.e, nonzero speed) vaø  
khoâng coù söï töông quan giöõa toác  
ñoä thöïc thi cuûa caùc process  
‰ Coù theå coù nhieàu CPU nhöng  
khoâng cho pheùp coù nhieàu taùc  
vuï truy caäp moät vò trí trong boä  
nhôù cuøng luùc (simultaneous)  
‰ Caáu truùc toång quaùt cuûa moät  
‰ Khoâng raøng buoäc veà thöù töï  
process:  
thöïc thi cuûa caùc process  
‰ Caùc process coù theå chia seû  
moät soá bieán chung nhaèm muïc  
ñích ñoàng boä hoaït ñoäng cuûa  
chuùng.  
‰ Giaûi phaùp cuûa chuùng ta caàn  
phaûi ñaëc taû ñöôïc caùc phaàn  
entry section vaø exit section.  
DO {  
entry section  
critical section  
exit section  
remainder section  
} WHILE (1);  
-9-  
Khoa Coâng Ngheä Thoâng Tin – Ñaïi Hoïc Baùch Khoa Tp.HCM  
Raøng buoäc cuûa baøi toaùn tranh chaáp  
‰ Mutual Exclusion  
– Taïi moãi thôøi ñieåm, chæ coù moät process ñöôïc pheùp thöïc thi trong  
vuøng tranh chaáp (CS)  
‰ Progress: neáu khoâng coù process naøo ñang thöïc thi trong  
vuøng tranh chaáp vaø ñang coù moät soá process chôø ñôïi vaøo  
vuøng tranh chaáp thì:  
– Chæ nhöõng process khoâng phaûi ñang thöïc thi trong vuøng khoâng  
o  
– Quaù trình choïn löïa naøy khoâng ñöôïc trì hoaõn voâ haïn (postponed  
indefinitely)  
‰ Bounded Waiting  
– Moãi process chæ phaûi chôø trong ñeå ñöôïc vaøo vuøng tranh chaáp  
trong moät khoaûng thôøi gian naøo ñoù. Khoâng ñeå xaûy ra tình traïng  
“ñoùi taøi nguyeân” (starvation)  
-10-  
Khoa Coâng Ngheä Thoâng Tin – Ñaïi Hoïc Baùch Khoa Tp.HCM  
5
Phaân loaïi giaûi phaùp  
‰ Giaûi phaùp phaàn meàm (software solutions)  
– user/programmer töï thöïc hieän (thoâng thöôøng seõ coù söï  
hoã trôï cuûa caùc thö vieän laäp trình)  
– OS cung caáp moät soá coâng cuï (caùc haøm vaø caáu truùc  
döõ lieäu) hoã trôï cho programmer qua system calls.  
‰ Giaûi phaùp phaàn cöùng (hardware solutions)  
– Döïa treân moät soá leänh maùy ñaëc bieät  
» Interrupt disable, Test-and-Set  
-11-  
Khoa Coâng Ngheä Thoâng Tin – Ñaïi Hoïc Baùch Khoa Tp.HCM  
Giaûi phaùp phaàn meàm  
‰ Tröôøng hôïp 2 process ñoàng thôøi  
– Giaûi thuaät 1 vaø 2  
– Giaûi thuaät 3 (Peterson’s algorithm)  
‰ Giaûi thuaät toång quaùt cho n process  
– Bakery algorithm  
-12-  
Khoa Coâng Ngheä Thoâng Tin – Ñaïi Hoïc Baùch Khoa Tp.HCM  
6
Giaûi thuaät 1  
‰ Bieán chia seû  
– int turn;  
/* khôûi ñaàu turn = 0 */  
– neáu turn = i ⇒ Pi ñöôïc pheùp vaøo critical section  
‰ Process Pi  
do {  
while (turn != i) ;  
Critical_Section();  
turn = j;  
Remainder_Section();  
} while (1);  
‰ Thoaû maõn mutual exclusion (1)  
‰ Khoâng thoaû maõn yeâu caàu progress (2) vaø bounded-  
waiting (3) vì tính chaát strict alternation.  
-13-  
Khoa Coâng Ngheä Thoâng Tin – Ñaïi Hoïc Baùch Khoa Tp.HCM  
Giaûi thuaät 1 (t.t)  
Process P0:  
do  
Process P1:  
do  
while(turn!=1);  
Critical_Section();  
turn:=0;  
while(turn !=0 );  
Critical_Section();  
turn:=1;  
Remainder_Section();  
while (1);  
Remainder_Section();  
while (1);  
Ví duï:  
P0 coù RS raát lôùn vaø P1 coù RS nhoû. Neáu turn=0, P0  
ñöôïc vaøo CS vaø sau ñoù thöïc thi vuøng RS (turn=1). Ñeán  
P1 vaøo CS vaø sau ñoù thöïc thi RS (turn=0) vaø tìm caùch  
vaøo CS moät laàn nöõa nhöng yeâu caàu bò töø choái !!! P1  
phaûi chôø P0 !!!.  
-14-  
Khoa Coâng Ngheä Thoâng Tin – Ñaïi Hoïc Baùch Khoa Tp.HCM  
7
Giaûi thuaät 2  
‰ Bieán chia seû  
– boolean flag[2]; /* khôûi ñaàu flag [0] = flag [1] = false. */  
– Neáu flag [i] = true ⇒ Pi saün saøng vaøo critical section  
‰ Process Pi  
do {  
flag[i] := true;  
while (flag[j]) ;  
Critical_Section();  
flag [i] = false;  
Remainder_Section();  
} while (1);  
‰ Baûo ñaûm ñöôïc mutual exclusion. Chöùng minh?  
‰ Khoâng thoaû maõn progress. Vì sao?  
-15-  
Khoa Coâng Ngheä Thoâng Tin – Ñaïi Hoïc Baùch Khoa Tp.HCM  
Giaûi thuaät 3 (Peterson)  
‰ Bieán chia seû: keát hôïp caû giaûi thuaät 1 vaø 2.  
‰ Process Pi  
do {  
flag [i]:= true;  
turn = j;  
while (flag [j] and turn = j) ;  
Critical_Section();  
flag [i] = fase;  
Remainder_Section();  
} while (1);  
‰ Thoaû maõn ñöôïc caû 3 yeâu caàu (chöùng minh - ?), giaûi  
quyeát baøi toaùn “critical-section” cho 2 process.  
-16-  
Khoa Coâng Ngheä Thoâng Tin – Ñaïi Hoïc Baùch Khoa Tp.HCM  
8
Giaûi thuaät Peterson-2 process  
PROCESS P1  
PROCESS P0  
DO {  
DO {  
flag[1]:=true;  
/* 1 wants in */  
turn:=0;  
flag[0]:=true;  
/* 0 wants in */  
turn:= 1;  
/* 1 gives a chance to 0 */  
WHILE  
/* 0 gives a chance to 1 */  
WHILE  
( flag[0] && turn=0 );  
CRITICAL_SECTION;  
flag[1]:=false;  
/* 1 no longer wants in */  
REMAINDER_SECTION;  
WHILE (1);  
( flag[1] && turn=1 );  
CRITICAL_SECTION;  
flag[0]:=false;  
/* 0 no longer wants in */  
REMAINDER_SECTION;  
WHILE (1);  
-17-  
Khoa Coâng Ngheä Thoâng Tin – Ñaïi Hoïc Baùch Khoa Tp.HCM  
Giaûi thuaät 3: Tính ñuùng ñaén  
‰ Mutual exclusion ñöôïc baûo ñaûm bôûi vì  
– P0 vaø P1 ñeàu ôû trong CS neáu vaø chæ neáu flag[0] =  
flag[1] = true vaø chæ neáu turn = i vôùi moãi Pi (khoâng theå  
xaûy ra)  
‰ Chöùng minh thoaû yeâu caàu veà progress vaø  
bounded waiting  
– Pi khoâng theå vaøo CS neáu vaø chæ neáu bò keït taïi voøng  
laëp while() vôùi ñieàu kieän flag[j] = true vaø turn = j.  
– Neáu Pj khoâng muoán vaøo CS thì flag[j] = false vaø do ñoù  
Pi coù theå vaøo CS.  
-18-  
Khoa Coâng Ngheä Thoâng Tin – Ñaïi Hoïc Baùch Khoa Tp.HCM  
9
Giaûi thuaät 3: Tính ñuùng ñaén (t.t)  
– Neáu Pj ñaõ baät flag[j]=true vaø ñang chôø taïi while() thì  
coù chæ hai tröôøng hôïp laø turn=i hoaëc turn=j  
– Neáu turn=i thì Pi vaøo CS. Neáu turn=j thì Pj vaøo CS  
nhöng seõ baät flag[ j]=false khi thoaùt ra ⇒ cho pheùp Pi  
vaøo CS  
– Nhöng neáu Pj coù ñuû thôøi gian baät flag[ j]=true thì Pj  
cuõng phaûi gaùn turn=i  
– Vì Pi khoâng thay ñoåi trò cuûa bieán turn khi ñang keït  
trong voøng laëp while(), Pi seõ chôø ñeå vaøo CS nhieàu  
nhaát laø sau moät laàn Pj vaøo CS (bounded waiting)  
-19-  
Khoa Coâng Ngheä Thoâng Tin – Ñaïi Hoïc Baùch Khoa Tp.HCM  
Tröôøng hôïp process bò “cheát”  
‰ Neáu thoûa ñoàng thôøi 3 yeâu caàu (mutex, progress,  
bounded waiting) thì giaûi phaùp giaûi quyeát tranh chaáp coù  
khaû naêng phaùt hieän moät process bò “cheát” taïi nhöõng vuøng  
khoâng coù tranh chaáp (remainder section)  
– Khi ñoù, process bò “cheát” taïi caùc vuøng khoâng tranh chaáp cuõng coù  
nghóa laø coù moät remainder section daøi voâ haïn.  
‰ Khoâng coù giaûi phaùp naøo coù theå cung caáp cô cheá ñuû  
maïnh ñeå giaûi quyeát tröôøng hôïp process bò “cheát” beân  
trong critical section (CS)  
-20-  
Khoa Coâng Ngheä Thoâng Tin – Ñaïi Hoïc Baùch Khoa Tp.HCM  
10  
Giaûi thuaät Bakery: N process  
‰ Tröôùc khi vaøo CS, process Pi nhaän moät con soá.  
Process naøo giöõa con soá nhoû nhaát thì ñöôïc vaøo CS  
‰ Tröôøng hôïp Pi vaø Pj cuøng nhaän ñöôïc moät chæ soá:  
– Neáu i < j thì Pi ñöôïc vaøo tröôùc, ngöôïc laïi Pj ñöôïc vaøo tröôùc.  
‰ Khi ra khoûi CS, Pi ñaët laïi soá cuûa mình baèng 0  
‰ Cô cheá caáp soá cho caùc process thöôøng taïo caùc soá  
theo cô cheá taêng daàn, ví duï 1,2,3,3,3,3,4,5...  
‰ Kí hieäu  
– (a,b) < (c,d) neáu a < c hoaëc if a == c vaø b < d  
– max(a0,...ak) laø con soá b sao cho b >= ai vôùi moïi i=0,..k  
-21-  
Khoa Coâng Ngheä Thoâng Tin – Ñaïi Hoïc Baùch Khoa Tp.HCM  
Giaûi thuaät Bakery: N process  
/* shared variable */  
bool select[n];  
/* initially, select[i] =false */  
/* initially, num[i] = 0 */  
integer num[n];  
while (1) {  
select[i] = true;  
number[i] = max(num[0], num[1], …, num [n – 1]) + 1;  
select[i] = false;  
while (select[j]);  
while ((num[j] != 0) && (num[j], j) < num[i], i));  
}
Critical_Section();  
num[i] = 0;  
Remainder_Section();  
}
-22-  
Khoa Coâng Ngheä Thoâng Tin – Ñaïi Hoïc Baùch Khoa Tp.HCM  
11  
Töø software ñeán hardware  
‰ Khuyeát ñieåm cuûa caùc giaûi phaùp software  
– Caùc process khi yeâu caàu ñöôïc vaøo vuøng tranh chaáp  
ñeàu phaûi lieân tuïc kieåm tra ñieàu kieän (busy waiting),  
tieâu toán laõng phí nhieàu thôøi gian xöû lyù cuûa CPU  
– Neáu thôøi gian xöû lyù trong vuøng tranh chaáp lôùn, moät  
giaûi phaùp hieäu quaû neân coù cô cheá block caùc process  
ñang ñôïi.  
‰ Caùc giaûi phaùp phaàn cöùng (hardware)  
– Caám ngaét (disable interrupts)  
– Duøng caùc leänh ñaëc bieät  
-23-  
Khoa Coâng Ngheä Thoâng Tin – Ñaïi Hoïc Baùch Khoa Tp.HCM  
Caám ngaét  
‰ Trong heä thoáng uniprocessor:  
ProcessPi:  
mutual exclusion ñöôïc baûo  
ñaûm tuy nhieân hieäu suaát thöïc  
repeat  
thi bò giaûm suùt vì khi coù  
disable_interrupts();  
Critical_Section();  
process trong CS, chuùng ta  
khoâng theå thöïc hieän caùch  
thöïc thi xen keõ ñoái vôùi caùc  
process ñang ôû vuøng khong  
c
enable_interrupts();  
n()  
‰ Treân heä thoáng multiprocessor: forever  
mutual exclusion khoâng ñöôïc  
ñaûm baûo  
– CS coù tính atomic nhöng  
khoâng mutual exclusive  
-24-  
Khoa Coâng Ngheä Thoâng Tin – Ñaïi Hoïc Baùch Khoa Tp.HCM  
12  
Duøng caùc leänh ñaëc bieät  
‰ YÙ töôûng cô sôû  
– Vieäc truy xuaát vaøo vaøo moät ñòa chæ cuûa boä nhôù voán ñaõ coù  
tính loaïi tröø töông hoã (chæ coù moät thao taùc truy xuaát taïi moät  
thôøi ñieåm)  
‰ Môû roäng  
– thieát keá moät leänh maùy coù theå thöïc hieän hai thao taùc chaäp  
(atomic, indivisible) treân cuøng moät oâ nhôù (vd: read vaø write)  
– Vieäc thöïc thi caùc leänh maùy nhö treân luoân baûo ñaûm mutual  
exclusive (ngay caû vôùi heä thoáng multiprocessor)  
‰ Caùc leänh maùy ñaëc bieät coù theå ñaûm baûo mutual exclusion  
tuy nhieân cuõng caàn keát hôïp vôùi moät soá cô cheá khaùc ñeå  
thoaû maõn hai yeâu caàu coøn laïi laø progress vaø bounded  
waiting cuõng nhö traùnh tình traïng starvation vaø deadlock.  
-25-  
Khoa Coâng Ngheä Thoâng Tin – Ñaïi Hoïc Baùch Khoa Tp.HCM  
Leänh test-and-set  
‰ Kieåm tra vaø caäp nhaät moät bieán  
trong moät thao taùc ñôn (atomic).  
boolTest&Set(booltarget)  
„Shareddata:  
boollock=false;  
{
boolrv=target;  
„ProcessPi  
tqrget=true;  
while  
returnrv;  
}
while(Test&Set(lock));  
Critical_Section;  
lock=false;  
Remainder_Section;  
}
-26-  
Khoa Coâng Ngheä Thoâng Tin – Ñaïi Hoïc Baùch Khoa Tp.HCM  
13  
Leänh test-and-set (t.t)  
‰ Mutual exclusion ñöôïc baûo ñaûm: neáu Pi vaøo CS, caùc  
process Pj khaùc ñeàu ñang busy waiting  
‰ Khi Pi ra khoûi CS, quaù trình choïn löïa process Pj vaøo CS  
keá tieáp laø tuyø yù ⇒ khoâng baûo ñaûm ñieàu kieän bounded  
waiting. Do ñoù coù theå xaûy ra starvation (bò boû ñoùi)  
‰ Caùc processor (ví duï Pentium) thoâng thöôøng cung caáp  
moät leänh ñôn laø swap(a,b) coù taùc duïng hoaùn chuyeån noäi  
dung cuûa a vaø b.  
– swap(a,b) cuõng coù öu nhöôïc ñieåm nhö test-and-set  
-27-  
Khoa Coâng Ngheä Thoâng Tin – Ñaïi Hoïc Baùch Khoa Tp.HCM  
Swap vaø Mutual Exclusion  
‰ Bieán chia seû lock ñöôïc khôûi  
‰ Bieán chia seû (khôûi taïo laø false)  
taïo giaù trò false  
bool lock;  
bool waiting[n];  
‰ Moãi process Pi coù bieán cuïc boä  
key  
‰ Process Pi  
‰ Process Pi naøo thaáy giaù trò  
lock=false thì ñöôïc vaøo CS.  
do {  
– Process Pi seõ loaïi tröø caùc  
process Pj khaùc khi thieát laäp  
key = true;  
Swap(lock,key);  
critical section  
lock = false;  
remainder section  
}
voidSwap(boola,boolb)  
{
booleantemp=a;  
a=b;  
b=temp;  
}
-28-  
Khoa Coâng Ngheä Thoâng Tin – Ñaïi Hoïc Baùch Khoa Tp.HCM  
14  
Thoaû maõn 3 yeâu caàu  
‰ Caáu truùc döõ lieäu duøng chung (khôûi taïo laø false)  
– bool waiting[n];  
– bool lock;  
‰ Mutual Exclusion: Pi chæ coù theå vaøo CS neáu vaø chæ neáu  
hoaëc waiting[i]==false, hoaëc laø key==false  
– key = false chæ khi Test&Set (hay Swap) ñöôïc thöïc thi  
» Process ñaàu tieân thöïc thi Test&Set môùi coù key==false; caùc  
process khaùc ñeàu phaûi ñôïi  
– waiting[i] = false chæ khi process khaùc rôøi khoûi CS  
» Chæ coù moät waiting[i] coù giaù trò false  
‰ Progress: chöùng minh töông töï nhö exclusion  
‰ Bounded Waiting: waiting in the cyclic order  
-29-  
Khoa Coâng Ngheä Thoâng Tin – Ñaïi Hoïc Baùch Khoa Tp.HCM  
Thoaû maõn 3 yeâu caàu (t.t)  
while{  
waiting[i]=true;  
key=true;  
while(waiting[i]&&key)  
key = Test&Set(lock);  
waiting[i]=false;  
CriticalSection  
while((j!=i)&&!waiting[i])  
j=(j+1)% n;  
if(j=i)  
lock=false;  
else  
waiting[i]=false;  
RemainderSection  
}
-30-  
Khoa Coâng Ngheä Thoâng Tin – Ñaïi Hoïc Baùch Khoa Tp.HCM  
15  
Semaphore  
‰ Laø coâng cuï ñoàng boä cung caáp bôûi OS maø khoâng ñoøi hoûi  
busy waiting  
‰ Semaphore S laø moät bieán soá nguyeân, ngoaøi thao taùc  
khôûi ñoäng bieán thì chæ coù theå ñöôïc truy xuaát qua hai taùc  
vuï coù tính ñôn nguyeân (atomic) vaø loaïi tröø (mutual  
exclusive)  
– wait(S) hay coøn goïi laø P(S): giaûm giaù trò semaphore. Neáu giaù trò  
naøy aâm thì process thöïc hieän leänh wait() bò blocked.  
– signal(S) hay coøn goïi laø V(S): taêng giaù trò semaphore. Neáu giaù trò  
naøy aâm, moät process ñang blocked bôûi moät leänh wait() seõ ñöôïc  
hoài phuïc ñeå thöïc thi.  
‰ Traùnh busy waiting: khi phaûi ñôïi thì process seõ ñöôïc ñaët  
vaøo moät blocked queue, trong ñoù chöùa caùc process ñang  
chôø ñôïi cuøng moät söï kieän.  
-31-  
Khoa Coâng Ngheä Thoâng Tin – Ñaïi Hoïc Baùch Khoa Tp.HCM  
Hieän thöïc Semaphore  
‰ Ñònh nghóa semaphore nhö moät record  
typedefstruct{  
intvalue;  
structprocess*L; /*processqueue*/  
}semaphore;  
‰ Giaû söû coù hai taùc vuï ñôn:  
– block: taïm treo process naøo thöïc thi leänh naøy.  
– wakeup(P): hoài phuïc quaù trình thöïc thi cuûa moät  
process P ñang blocked .  
-32-  
Khoa Coâng Ngheä Thoâng Tin – Ñaïi Hoïc Baùch Khoa Tp.HCM  
16  
Hieän thöïc Semaphore (t.t)  
‰ Caùc taùc vuï semaphore ñöôïc ñònh nghóa 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);  
}
-33-  
Khoa Coâng Ngheä Thoâng Tin – Ñaïi Hoïc Baùch Khoa Tp.HCM  
Hieän thöïc Semaphore (t.t)  
‰ Khi moät process phaûi chôø treân semaphore S, noù  
seõ bò blocked vaø ñöôïc ñaët trong haøng ñôïi  
semaphore  
– Haøng ñôïi naøy laø danh saùch lieân keát caùc PCB  
‰ Taùc vuï signal() thöôøng söû duïng cô cheá FIFO ñeå  
chuyeån moät process töø haøng ñôïi vaø ñöa vaøo  
h
‰ block() vaø wakeup() thay ñoåi traïng thaùi cuûa  
process – ñoù laø caùc system call cô baûn.  
– Block: chuyeån töø running sang waiting  
– wakeup: chuyeån töø waiting sang ready  
-34-  
Khoa Coâng Ngheä Thoâng Tin – Ñaïi Hoïc Baùch Khoa Tp.HCM  
17  
Hieän thöïc Mutex vôùi Semaphore  
‰ Duøng cho n process  
‰ Shared data:  
semaphore mutex;  
/*initially mutex.value = 1*/  
‰ Khôûi taïo S.value = 1  
‰ Chæ duy nhaát moät 1  
process ñöôïc vaøo CS  
(mutual exclusion)  
‰ Process Pi:  
do {  
wait(mutex);  
‰ Ñeå cho pheùp k process  
vaøo CS, khôûi taïo  
S.value = k  
critical section  
signal(mutex);  
remainder section  
} while (1);  
-35-  
Khoa Coâng Ngheä Thoâng Tin – Ñaïi Hoïc Baùch Khoa Tp.HCM  
Ñoàng boä process baèng semaphore  
‰ Hai process: P1 vaø P2  
‰ Ñeå ñoàng boä hoaït ñoäng  
theo yeâu caàu, P1 phaûi  
ñònh nghóa nhö sau:  
S1;  
‰ Yeâu caàu: leänh S1 trong  
P1 caàn ñöôïc thöïc thi  
signal(synch);  
tröôùc leänh S2 trong P2  
Vaø P2 ñònh nghóa nhö sau:  
‰ Ñ
S2;  
“synch” duøng ñoàng boä  
‰ Khôûi ñoäng semaphore:  
synch.value= 0  
-36-  
Khoa Coâng Ngheä Thoâng Tin – Ñaïi Hoïc Baùch Khoa Tp.HCM  
18  
Nhaän xeùt  
‰ Khi S.value >=0: soá process coù theå thöïc thi wait(S)maø  
khoâng bò blocked = S.value  
‰ Khi S.value<0: soá process ñang ñôïi treân S = |S.value|  
‰ Atomic vaø mutual exclusion: khoâng ñöôïc xaûy ra tröôøng  
hôïp 2 process cuøng ñang ôû trong thaân leänh wait(S) vaø  
signal(S) (cuøng semaphore S) taïi moät thôøi ñieåm (ngay caû  
vôùi heä thoáng multiprocessor)  
⇒ do ñoù, ñoaïn maõ ñònh nghóa caùc leänh wait(S) vaø  
signal(S) cuõng chính laø vuøng xaûy ra tranh chaáp (critical  
section)  
-37-  
Khoa Coâng Ngheä Thoâng Tin – Ñaïi Hoïc Baùch Khoa Tp.HCM  
Nhaän xeùt (t.t)  
‰ wait() vaø signal() phaûi thöïc thi atomic vaø mutual  
execution  
‰ Vuøng tranh chaáp cuûa caùc taùc vuï wait(S) vaø signal(S)  
thoâng thöôøng raát nhoû: khoaûng 10 leänh.  
‰ Giaûi phaùp cho vuøng tranh chaáp wait(S) vaø signal(S):  
interrupt) ñeå giaûi quyeát tranh chaáp (trong moät khoaûng thôøi  
gian raát ngaén). Phöông phaùp naøy khoâng laøm vieäc treân heä  
thoáng multiprocessor.  
– Multiprocessor: coù theå duøng caùc giaûi phaùp software (nhö  
Dekker, Peterson) hoaëc giaûi phaùp hardware (test-and-set,  
swap). Vì CS raát nhoû neân chi phí cho busy waiting seõ raát  
thaáp.  
-38-  
Khoa Coâng Ngheä Thoâng Tin – Ñaïi Hoïc Baùch Khoa Tp.HCM  
19  
Deadlock vaø Starvation  
‰ Deadlock – hai hay nhieàu process ñang chôø ñôïi voâ  
haïn ñònh moät söï kieän khoâng bao giôø xaûy ra (vd: söï  
kieän do moät trong caùc process ñang ñôïi taïo ra).  
‰ Goïi S vaø Q laø hai bieán semaphore ñöôïc khôûi taïo = 1  
P0  
P1  
P(S);  
P(Q);  
M
P(Q);  
P(S);  
M
V(S);  
V(Q);  
V(Q)  
V(S);  
‰ Starvation (indefinite blocking) coù theå xaûy ra khi  
chuùng ta boû process vaøo haøng ñôïi vaø laáy ra theo cô  
cheá LIFO.  
-39-  
Khoa Coâng Ngheä Thoâng Tin – Ñaïi Hoïc Baùch Khoa Tp.HCM  
Caùc loaïi semaphore  
‰ Counting semaphore: moät soá nguyeân coù giaù trò  
khoâng haïn cheá.  
‰ Binary semaphore: moät soá nguyeân coù giaù trò naèm  
trong khoaûng [0,1]. Binary semaphore raát deã  
hieän thöïc.  
‰ Chuùng ta coù theå hieän thöïc counting semaphore  
S baèng binary semaphore.  
-40-  
Khoa Coâng Ngheä Thoâng Tin – Ñaïi Hoïc Baùch Khoa Tp.HCM  
20  
Tải về để xem bản đầy đủ
pdf 30 trang yennguyen 17020 Free
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Hệ điều hành - Chương 3: Đồng bộ và giải quyết tranh chấp (Process Synchronization) - Thoại Nam", để 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:

  • pdfbai_giang_he_dieu_hanh_chuong_3_dong_bo_va_giai_quyet_tranh.pdf