Các gi i pháp « SLEEP and WAKEUP ả

Một phần của tài liệu CHƯƠNG 1: TỔNG QUAN VỀ HỆ ĐIỀU HÀNH docx (Trang 57 - 61)

a) Cm ng t: ắ

2.4.3.2.Các gi i pháp « SLEEP and WAKEUP ả

Đ lo i b các b t ti n c a gi i pháp « busy waiting », chúng ta có th ti pể ạ ỏ ấ ệ ủ ả ể ế c n theo hậ ướng cho m t ti n trình ch a đ đi u ki n vào mi n găng chuy n sangộ ế ư ủ ề ệ ề ể tr ng thái blocked, t b quy n s d ng CPU. Đ th c hi n đi u này, c n ph i sạ ừ ỏ ề ử ụ ể ự ệ ề ầ ả ử d ng các th t c do h đi u hành cung c p đ thay đ i tr ng thái ti n trình. Hai thụ ủ ụ ệ ề ấ ể ổ ạ ế ủ t c c b n ụ ơ ả SLEEPWAKEUP thường đượ ử ục s d ng đ ph c v m c đích này. ể ụ ụ ụ

SLEEP là m t l i g i h th ng có tác d ng t m d ng ho t đ ng c a ti n trìnhộ ờ ọ ệ ố ụ ạ ừ ạ ộ ủ ế (blocked) g i nó và ch đ n khi đọ ờ ế ược m t ti n trình khác « đánh th c ». L i g i hộ ế ứ ờ ọ ệ th ng ố WAKEUP nh n m t tham s duy nh t : ti n trình s đậ ộ ố ấ ế ẽ ược tái kích ho t (đ t vạ ặ ề tr ng thái ready). ạ

Ý tưởng s d ng SLEEP và WAKEUP nh sau : khi m t ti n trình ch a đử ụ ư ộ ế ư ủ đi u ki n vào mi n găng, nó g i ề ệ ề ọ SLEEP đ t khóa đ n khi có m t ti n trình khácể ự ế ộ ế g i ọ WAKEUP đ gi i phóng cho nó. M t ti n trình g i ể ả ộ ế ọ WAKEUP khi ra kh i mi nỏ ề găng đ đánh th c m t ti n trình đang ch , t o c h i cho ti n trình này vào mi nể ứ ộ ế ờ ạ ơ ộ ế ề găng :

C u trúc chấ ương trình trong gi i pháp SLEEP and WAKEUPả int busy; // 1 n u mi n găng đang b chi m, n u không là 0 ế ề ị ế ế int blocked; // đ m s lế ố ượng ti n trình đang b khóaế ị

while (TRUE) { if (busy){ blocked = blocked + 1; sleep(); } else busy = 1; critical-section (); busy = 0;

if(blocked){ wakeup(process); blocked = blocked - 1; } Noncritical-section (); }

Khi s d ng SLEEP và WAKEUP c n h t s c c n th n, n u không mu n x yử ụ ầ ế ứ ẩ ậ ế ố ả ra tình tr ng mâu thu n truy xu t trong m t vài tình hu ng đ c bi t nh sau : gi sạ ẫ ấ ộ ố ặ ệ ư ả ử ti n trình A vào mi n găng, và trế ề ước khi nó r i kh i mi n găng thì ti n trình B đờ ỏ ề ế ược kích ho t. Ti n trình B th vào mi n găng nh ng nó nh n th y A đang trong đó, doạ ế ử ề ư ậ ấ ở v y B tăng giá tr bi n ậ ị ế blocked và chu n b g i ẩ ị ọ SLEEP đ t khoá. Tuy nhiên trể ự ước khi B có th th c hi n ể ự ệ SLEEP, ti n trình A l i đế ạ ược tái kích ho t và ra kh i mi nạ ỏ ề găng. Khi ra kh i mi n găng A nh n th y có m t ti n trình đang ch (ỏ ề ậ ấ ộ ế ờ blocked=1) nên g i ọ WAKEUP và gi m giá tr c a ả ị ủ blocked. Khi đó tín hi u ệ WAKEUP s l c m t doẽ ạ ấ ti n trình B ch a th t s « ng » đ nh n tín hi u đánh th c !Khi ti n trình B đế ư ậ ự ủ ể ậ ệ ứ ế ược ti p t c x lý, nó m i goi ế ụ ử ớ SLEEP và t khó vĩnh vi n !ự ễ

V n đ ghi nh n đấ ề ậ ược là tình tr ng l i này x y ra do vi c ki m tra t cáchạ ỗ ả ệ ể ư vào mi n găng và vi c g i SLEEP hay WAKEUP là nh ng hành đ ng tách bi , có thề ệ ọ ữ ộ ệ ể b ng t n a ch ng trong quá trình x lý, do đó có khi tín hi u WAKEUP g i đ n m tị ắ ử ừ ử ệ ở ế ộ ti n trình ch a b khóa s l c m t.ế ư ị ẽ ạ ấ

Đ tránh nh ng tình hu ng tể ữ ố ương t , h đi u hành cung c p nh ng c chự ệ ề ấ ữ ơ ế đ ng b hóa d a trên ý tồ ộ ự ưởng c a chi n lủ ế ược « SLEEP and WAKEUP » nh ng đư ược xây d ng bao hàm c phự ả ương ti n ki m tra đi u ki n vào mi n găng giúp s d ng anệ ể ề ệ ề ử ụ toàn.

a). Semaphore

Ti p c n:ế ậ Được Dijkstra đ xu t vào 1965, m t semaphore ề ấ ộ s là m t ộ bi nế có các thu c tính sau:ộ

M t giá tr nguyên dộ ị ương e(s)

M t hàng đ i ộ ợ f(s) l u danh sách các ti n trình đang b khóa (ch ) trênư ế ị ờ semaphore s

Ch có hai thao tác đỉ ược đ nh nghĩa trên semaphoreị

Down(s): gi m giá tr c a semaphore ả ị ủ s đi 1 đ n v n u semaphore có tr e(s) >ơ ị ế ị 0, và ti p t c x lý. Ngế ụ ử ượ ạc l i, n u e(s) 0, ti n trình ph i ch đ n khi e(s) >0.ế ế ả ờ ế

Up(s): tăng giá tr c a semaphore ị ủ s lên 1 đ n v . N u có m t ho c nhi u ti nơ ị ế ộ ặ ề ế trình đang ch trên semaphore ờ s, b khóa b i thao tác ị ở Down, thì h th ng s ch n m tệ ố ẽ ọ ộ trong các ti n trình này đ k t thúc thao tác ế ể ế Down và cho ti p t c x lý.ế ụ ử

Hình 2.17 Semaphore s

Cài đ t: G i ặ ọ p là ti n trình th c hi n thao tác ế ự ệ Down(s) hay Up(s).

Down(s): e(s) = e(s) - 1; if e(s) < 0 { status(P)= blocked; enter(P,f(s)); } Up(s): e(s) = e(s) + 1; if s = 0 {

exit(Q,f(s)); //Q là ti n trình đang ch trên sế ờ status (Q) = ready;

}

L u ý cài đ t này có th đ a đ n m t giá tr âm cho semaphore, khi đó trư ặ ể ư ế ộ ị ị tuy t đ i c a semaphore cho bi t s ti n trình đang ch trên semaphore.ệ ố ủ ế ố ế ờ

Đi u quan tr ng là các thao tác này c n th c hi n m t cách không b phân chia,ề ọ ầ ự ệ ộ ị không b ng t n a ch ng, có nghĩa là không m t ti n trình nào đị ắ ữ ừ ộ ế ược phép truy xu tấ đ n semaphore n u ti n trình đang thao tác trên semaphore này ch a k t thúc x lýế ế ế ư ế ử hay chuy n sang tr ng thái blocked.ể ạ

S d ng:ử ụ có th dùng semaphore đ gi i quy t v n đ truy xu t đ c quy nể ể ả ế ấ ề ấ ộ ề hay t ch c ph i h p gi a các ti n trình.ổ ứ ố ợ ữ ế

T ch c truy xu t đ c quy n v i Semaphores : khái ni m ệ semaphore cho phép b o đ m nhi u ti n trình cùng truy xu t đ n mi n găng mà không có s mâuả ả ề ế ấ ế ề ự thu n truy xu t. ẫ ấ n ti n trình cùng s d ng m t semaphore s, e(s) đế ử ụ ộ ược kh i gán là 1.ở Đ th c hi n đ ng b hóa, t t c các ti n trình c n ph i áp d ng cùng c u trúcể ự ệ ồ ộ ấ ả ế ầ ả ụ ấ chương trình sau đây:

while (TRUE) { Down(s) critical-section (); Up(s) Noncritical-section (); }

Hình 3.11 C u trúc m t chấ ộ ương trình trong gi i pháp semaphoreả

Ví d : Lầ n Ti nế trình Thao tác E(s) CS F(s) 1 A Down 0 A 2 B Down -1 A B 3 C Down -2 A B, C 4 A Up -1 B C

T ch c đ ng b hóa v i Semaphores : v i semaphore có th đ ng b hóaớ ể ồ ộ ho t đ ng c a hai ti n trình trong tình hu ng m t ti n trình ph i đ i m t ti n trìnhạ ộ ủ ế ố ộ ế ả ợ ộ ế khác hoàn t t thao tác nào đó m i có th b t đ u hay ti p t c x lý. Hai ti n trìnhấ ớ ể ắ ầ ế ụ ử ế chia s m t semaphore s, kh i gán e(s) là 0. C hai ti n trình có c u trúc nh sau:ẻ ộ ở ả ế ấ ư

Một phần của tài liệu CHƯƠNG 1: TỔNG QUAN VỀ HỆ ĐIỀU HÀNH docx (Trang 57 - 61)