Giải pháp dùng Semaphore (đèn báo)

Một phần của tài liệu BÀI GIẢNG NGUYÊN LÝ CÁC HỆ ĐIỀU HÀNH (Trang 59 - 62)

Giải pháp này được Dijkstra đề xuất vào 1965. Semaphore được định nghĩa để sử dụng đồng bộ hóa như sau:

- Semaphore s là một biến nguyên khởi gán bằng một giá trị không âm e(s), đó là khả năng phục vụ của tài nguyên găng tương ứng.

- Ứng với s có một hàng đợi f(s)để lưu các tiến trình đang bị blocked (chờ) trên s

- Chỉ có hai thao tác được tác động đến semaphore s. Thao tác Down giảm s đi 1 đơn vị, thao tác Up tăng s lên 1 đơn vị

Mỗi tiến trình trước khi vào miền găng phải gọi Down để kiểm tra và xác lập quyền vào đoạn găng. Khi tiến trình gọi Down(s) thì hệ thống sẽ thực hiện như sau: e(s)=e(s)-1, nếu e(s)>=0 thì tiến trình tiếp tục xử lý và vào miền găng. Nếu e(s)<0 thì tiến trình phải vào hàng đợi để chờ cho đến khi e(s)>=0.

Cài đặt: Gọi p là tiến trình thực hiện thao tác

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

Mỗi tiến trình ngay sau khi ra khỏi miền găng phải gọi Up để kiểm tra xem có tiến trình nào đang đợi trong hàng đợi hay không, nếu có thì đưa tiến trình trong hàng đợi vào miền găng. Khi tiến trình gọi Up thì hệ thống sẽ thực hiện như sau: e(S)=e(S)+1, nếu e(S)<=0 đưa một tiến trình trong hàng đợi vào miền găng

Up(s):

e(s) = e(s) + 1; if e(s)<= 0 {

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

enter(Q,ready-list); }

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 giữ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(tài nguyên găng này chỉ có thể đáp ứng cho một tiến trình nên e(s) được khởi gán bằng 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 ();

Ví dụ1:

Tiến trình thực hiện

Thao tác E(s) Trạng thái tiến trình

1 1. P1 Down(s) 0 P1 hoạt động 2. P2 Down(s) -1 P2 chờ 3. P1 Up(s) 0 P2 hoạt động 4. P1 Down(s) -1 P1 chờ 5. P2 Up(s) 0 P1 hoạt động

Ví dụ 2: Nếu trong hệ thống có 6 tiến trình hoạt động đồng thời, cùng sử

dụng tài nguyên găng, tài nguyên găng này chỉ cho phép một tiến trình truy xuất đến nó tại một thời điểm. Tức là hệ điều hành phải tổ chức truy xuất độc quyền trên tài nguyên găng này. Thứ tự yêu cầu sử dụng tài nguyên găng của các tiến trình, cùng với thời gian mà tiến trình cần processor khi nó ở trong miền găng (cần tài nguyên găng) và độ ưu tiên của các tiến trình, được mô tả như sau:

Có 6 tiến trình yêu cầu sử dụng tài nguyên găng tương ứng với s lần lượt

là: A B C D E F

Độ ưu tiên của các tiến trình là(5 là độ ưu tiên cao nhất):

1 1 2 4 2 5

Thời gian các tiến trình cần sử dụng tài nguyên găng là:

4 2 2 2 1 1 T Tiến trình Thao tác E(s) CS F(s) 0 1 1 A Down 0 A 2 B Down -1 A B 3 C Down -2 A C,B 4 D Down -3 A D,C,B 5 A Up -2 D C,B 6 E Down -3 D C,E,B

7 D Up -2 C E,B 8 F Down -3 C F,E,B 9 C Up -2 F E,B 10 F Up -1 E B 11 E Up 0 B 12 B Up 1

Tiến trình ra khỏi đoạn găng sẽ đánh thức tiến trình có độ ưu tiên cao nhất trong hàng đợi để đưa nó vào miền găng. Tiến trình được đưa vào hàng đợi sau nhưng có độ ưu tiên cao hơn sẽ được đưa vào miền găng trước các tiến trình được đưa vào hàng đợi trước nó.

Sử dụng semaphore để đồng bộ hóa tiến trình mang lại những thuận lợi sau: - Mỗi tiến trình chỉ kiểm tra quyền vào miền găng một lần, khi chờ nó không

làm gì cả, tiến trình ra khỏi đoạn găng phải đánh thức tiến trình đang ngủ. - Không xuất hiện tượng chờ đợi tích cực, nên khai thác tối đa thời gian xử lý

của process .

- Nhờ cơ chế hàng đợi mà hệ điều hành có thể thực hiện gán độ ưu tiên cho các tiến trình khi chúng ở trong hàng đợi.

Một phần của tài liệu BÀI GIẢNG NGUYÊN LÝ CÁC HỆ ĐIỀU HÀNH (Trang 59 - 62)

Tải bản đầy đủ (PDF)

(142 trang)