1
1
Nguyên hệđiuhành
NguynHi Châu
Khoa Công nghthông tin
Trường Đạihc Công ngh
2
Đồng bhóa tiếntrình
3
dụđng bhóa (1)
TiếntrìnhghiP:
while (true) {
while (counter==SIZE) ;
buf[in] = nextItem;
in = (in+1) % SIZE;
counter++;
}
buf: Buffer
SIZE: cca buffer
counter: Biến chung
TiếntrìnhđọcQ:
while (true) {
while (counter==0) ;
nextItem = buf[out];
out = (out+1) % SIZE;
counter--;
}
zĐây bài toán vùng
đệmcógiihn
4
dụđng bhóa (2)
zcounter++
register1= counter;
register1= register1+ 1;
counter = register1;
zcounter--
register2= counter;
register2= register2-1;
counter = register2;
zCác toán t++ và -- thểđưccàiđặtnhưsau:
P và Q có thnhnđược các giá trkhác nhau ca
counter ti cùng 1 thiđimnếunhưđonmãxanh
đỏ thchinxenknhau.
5
dụđng bhóa (3)
zGisP và Q thchin song song vinhau
giá trca counter là 5:
register1= counter; // register1=5
register1= register1+ 1; // register1=6
register2= counter; // register2=5
register2= register2-1; // register2=4
counter = register1;// counter=6 !!
counter = register2;// counter=4 !!
6
dụđng bhóa (4)
zLi: Cho phép P Qđồng thithao táctrên
biếnchungcounter. Sali:
register1= counter; // register1=5
register1= register1+ 1; // register1=6
counter = register1;// counter=6
register2= counter; // register2=6
register2= register2-1; // register2=5
counter = register2;// counter=5
2
7
Tương tranh đồng b
zTình hung xuthinkhinhiutiếntrìnhcùng
thao tác trên dliu chung kếtqucác
thao tác đóphthucvàothtthchin
cacáctiếntrìnhtrêndliu chung gilàtình
hung tương tranh (race condition)
zĐể tránh các tình hung tương tranh, các tiến
trình cnđượcđồng btheo mtphương
thcnàođóVnđề nghiên cu: Đồng b
hóa các tiếntrình
8
Khái nimvềđonmãgăng (1)
zThutng: Critical section
zThutngtiếng Vit: Đonmãgăng, đon
tihn.
zXét mth ntiếntrìnhP0, P1, ..., Pn, mi
tiến trình mtđonmãlnh gilàđon
găng, ký hiulàCSi, nếunhưtrong đon
này, các tiến trình thao tác trên các biến
chung, đọc ghi file... (tng quát: thao tác trên
dliu chung)
9
Khái nimvềđonmãgăng (2)
zĐặcđim quan trng hntiến trình này
cncólà: KhimttiếntrìnhPithchinđon
CSithì không tiếntrìnhPjnào khác
đượcphépthchinCSj
zMitiếntrìnhPiphi “xin phép” (entry
section) trướckhithchinCSi thông o
(exit section) cho các tiến trình khác sau khi
thchin xong CSi.
10
Khái nimvềđonmãgăng (3)
zCu trúc chung caPiđể thchinđonmã
găng CSi.
do {
Xin phép (ENTRYi) thchinCSi; // Entry section
ThchinCSi;
Thông báo (EXITi) đãthchinxongCSi; // Exit section
Phnmãlnh khác (REMAINi); // Remainder section
} while (TRUE);
11
Khái nimvềđonmãgăng (4)
zViếtlicutrúcchungcađonmãgăng:
do {
ENTRYi; // Entry section
ThchinCSi; // Critical section
EXITi; // Exit section
REMAINi; // Remainder section
} while (TRUE);
12
Gii pháp cho đonmãgăng
zGii pháp cho đonmãgăng cntha mãn 3
điukin:
zLoitrln nhau (mutual exclusion): NếuPiđang
thchinCSithì Pjkhông ththchinCSjji.
zTiếntrin (progress): Nếu không tiếntrìnhPinào
thchinCSi mtiếntrìnhPj1, Pj2, ..., Pjm mun
thchinCSj1, CSj2, ..., CSjm thì ch các tiếntrình
không thchinREMAINjk (k=1,...,m) miđượcxem
xét thchinCSjk.
zCh giihn (bounded waiting): sau khi mttiến
trình Pi yêu cuvàoCSi trướckhiyêu cuđó
đượcchpnhn, slncáctiếntrìnhPj(viji) được
phép thchinCSjphibgiihn.
3
13
d: giiphápca Peterson
zGis 2 tiếntrìnhP0 P1vi hai đon
găng tương ng CS0 CS1
zSdng mtbiến nguyên turn vigiátrkhi
to0 hoc1 vàmng boolean flag[2]
zturn giá tri nghĩalàPiđượcphépthc
hinCSi(i=0,1)
znếu flag[i] là TRUE thì tiếntrìnhPiđãsn
sàng để thchinCSi
14
d: giiphápca Peterson
z lnh caPi:
do {
flag[i] = TRUE;
turn = j;
while (flag[j] && turn == j) ;
CSi;
flag[j] = FALSE;
REMAINi;
} while (1);
15
Chng minh gii pháp Peterson
zXem chng minh giiphápca Peterson
tha mãn 3 điukincađonmãgăng
trong giáo trình (trang 196)
zGii pháp “kiu Peterson”:
zPhctpkhislượng tiếntrìnhtăng lên
zKhó kim soát
16
Semaphore
17
Thông tin tham kho
zEdsger Wybe Dijkstra
(người Hà Lan) phát
minh ra khái nim
semaphore trong khoa
hc máy tính vào năm
1972
zSemaphore được s
dng lnđầutiêntrong
cunsách“The
operating system” ca
ông Edsger Wybe Dijkstra
(1930-2002) 18
Định nghĩa
zSemaphore là mtbiến nguyên, nếu không tính
đếntoántkhito, ch thtruy cp thông
qua hai toán tnguyên t wait (hocP) và
signal (hocV).
zP: proberen kimtra(tiếng Lan)
zV: verhogen–tăng lên (tiếng Lan)
zCác tiếntrìnhcóthsdng chung semaphore
zCác toán t nguyên tốđểđmbo không xy
ra trường hpnhư dụđng ba đãnêu
4
19
Toán twait và signal
wait(S) // hocP(S)
{
while (S<=0);
S--;
}
zToán twait: Chkhi
semaphore S âm
gimS đi1 nếuS>0
signal(S) // hocV(S)
{
S++;
}
zToán tsignal: Tăng S
lên 1
20
Sdng semaphore (1)
zVi bài toán đonmãgăng:
do {
wait(mutex); // mutex semaphore khito1
CSi;
signal(mutex);
REMAINi;
} while (1);
21
Sdng semaphore (2)
zP1:
...
O1;
signal(synch);
...
zP2:
...
wait(synch);
O2;
...
zXét hai tiếntrìnhP1 P2, P1cnthchin
toán tO1, P2cnthchinO2 O2ch
đượcthchin sau khi O1đãhoànthành
zGii pháp: Sdng semaphore synch = 0
22
Cài đặt semaphore cổđin
zĐịnh nghĩacổđincawait chotathytoán
tnày chbn(busy waiting), tclàtiến
trình phichtoán twait kết thúc nhưng
CPU vnphilàmvic: Lãng phí tài nguyên
zLiên hcơchếpolling trong kiến trúc máy tính
zCài đặt semaphore theo định nghĩacổđin:
zLãng phí tài nguyên CPU vi các máy tính 1 CPU
z linếuthigianchwait ít hơnthigianthc
hin context switch
zCác semaphore loinàygilàspinlock
23
Cài đặt semaphore theo cutrúc
zKhcphcchbn: Chuynvònglpch
thành vicsdng toán tblock (tmdng)
zĐể khôi phcthchintblock, ta toán t
wakeup
zKhi đóđể cài đặt, ta cutrúcdliumi
cho semaphore:
typedef struct {
int value; // Giá trca semaphore
struct process *L; // Danh sách tiếntrìnhch...
} semaphore; 24
void wait(semaphore *S)
{
S->value--;
if (S->value<0) {
Thêm tiếntrìnhgi
toán tvào s->L;
block();
}
}
void signal(semaphore *S)
{
S->value++;
if (S->value<=0) {
Xóa mttiếntrìnhP
ra khis->L;
wakeup(P);
}
}
Cài đặt semaphore theo cutrúc
5
25
Semaphore nhphân
z semaphore chnhngiátr0 hoc1
zCài đặt semaphore nhphân đơnginhơn
semaphore không nhphân (thutng:
counting semaphore)
26
Mtsbài toán
đồng bhóa cơbn
27
Bài toán vùng đệmcógiihn
zĐãxét dụđu tiên (the bounded-buffer
problem)
zTa sdng 3 semaphore tên full, empty
mutex để gii quyết bài toán này
zKhito:
zfull: Slượng phntbuffer đãcódliu(0)
zempty: Slượng phntbuffer chưacódliu(n)
zmutex: 1 (Chưacótiến trình nào thchinđon
găng)
28
Bài toán vùng đệmcógiihn
TiếntrìnhghiP:
do {
wait(empty);
wait(mutex);
// Ghi mtphntmi
// vào buffer
signal(mutex);
signal(full);
} while (TRUE);
TiếntrìnhđọcQ:
do {
wait(full);
wait(mutex);
// Đọcmtphntra
// khi buffer
signal(mutex);
signal(empty);
} while (TRUE);
29
Bài toán tiếntrìnhđọc - ghi
zThutng: the reader-writer problem
zTình hung: Nhiutiến trình ng thao tác trên mtcơ
sdliutrongđó
zMtvàitiếntrìnhchỉđcdliu(kýhiu: reader)
zMtstiếntrìnhvađọcva ghi (ký hiu: writer)
zKhi đọc/ghi đồng thicanhiutiến trình trên ng
mtcơsdliu, có 2 bài toán:
zBài toán 1: reader không phich,trkhi writer đãđượcphép
ghi vào CSDL (hay các reader không loitrln nhau khi đọc)
zBài toán 2: Khi writer đãsn sàng ghi, nó s được ghi trong
thi gian sm nht (nói cách khác khi writer đã sn sàng,
không cho phép các reader đọcdliu) 30
Bài toán tiếntrìnhđọc-ghi s1
zSdng các semaphore vigiátrkhito:
wrt (1), mutex (1)
zSdng biếnrcount (khito0) để đếms
lượng reader đang đọcdliu
zwrt: Đảmboloitrln nhau khi writer ghi
zmutex: Đảmboloitrlnnhaukhicp
nhtbiếnrcount