Sử dụng semaphore

Một phần của tài liệu giáo trình nguyên lý hệ điều hành Chương 2: QUẢN LÝ TIẾN TRÌNH; CHƯƠNG 3. LẬP LỊCH CPU; CHƯƠNG 4. ĐỒNG BỘ HOÁ TIẾN TRÌNH; CHƯƠNG 5. BẾ TẮC (Trang 36 - 38)

CHƯƠNG 4 ĐỒNG BỘ HOÁ TIẾN TRÌNH 4.1 Các khái niệm cơ bản

4.4.3.Sử dụng semaphore

a. Thực hiện độc quyền truy xuất

57

mutex.value = 1 thì chỉ duy nhất một tiến trình được vào vùng tương tranh. Để cho phép k

tiến trình cùng vào vùng tương tranh, khởi tạo mutex.value = k. Việc thực hiện độc quyền truy xuất bằng semaphore cho tiến trình Pi như sau:

do { wait(mutex); critical section signal(mutex); remainder section } while (1); b. Đồng bộ process bằng semaphore

Có hai tiến trình P1 và P2 với yêu cầu: lệnh S1 trong P1 cần được thực thi trước lệnh S2

trong P2. Dùng biến chia sẻ semaphore synch để đồng bộ. Khởi tạo synch.value = 0. Để đồng bộ hoạt động theo yêu cầu, P1 phải định nghĩa như sau:

S1;

signal(synch);

và P2 định nghĩa như sau:

wait(synch); S2;

c. Nhận xét

Khi S.value  0: số process có thể thực thi wait(S) mà không bị blocked = S.value. Khi S.value < 0: số process đang đợi trên S là S.value

Tính đơn nguyên và đọc quyền truy xuất: không được xảy ra trường hợp hai tiến trình cùng đang ở trong thân lệnh wait(S) và signal(S) (cùng semaphore S) tại một thời điểm (ngay cả với hệ thống nhiều CPU). Do đó, đoạn mã định nghĩa các lệnh wait(S) và signal(S) cũng chính là vùng tương tranh.

Vùng tương tranh của các tác vụ wait(S) và signal(S) thông thường rất nhỏ: khoảng 10 lệnh. Có thể dùng giải pháp sau cho vùng tương tranh wait(S) và signal(S):

Với hệ thống một CPU: có thể dùng cơ chế cấm ngắt (disable interrupt). Nhưng phương pháp này không làm việc trên hệ thống multiprocessor.

Với hệ thống nhiều CPU: có thể dùng các giải pháp phần mềm (như giải thuật Peterson) hoặc giải pháp phần cứng (TestAndSet, Swap).

Vì vùng tương tranh rất nhỏ nên chi phí cho chờ đợi bận sẽ rất thấp. 4.4.4. Bế tắc và bị bỏ đói

Sử dụng semaphore như trên có thể xảy ra hiện tượng bế tắc hoặc bị bỏ đói.

Bế tắc là hiện tượng hai hay nhiều tiến trình đang chờ đợi vô hạn định một sự kiện không bao giờ xảy ra, chẳng hạn sự kiện do một trong các tiến trình đang đợi tạo ra.

58

Ví dụ, gọi S và Q là hai biến semaphore được khởi tạo = 1, có hai tiến trình P0 và P1

thực hiện như sau:

P0 P1 wait(S); wait(Q); wait(Q); wait(S); … … signal(S); signal(Q); signal(Q); signal(S);

Giả sử P0 thực thi wait(S), rồi P1 thực thi wait(Q), rồi P0 thực thi wait(Q) bị tạm dừng, P1 thực thi wait(S) bị tạm dừng. Các thủ tục signal sẽ không được thực hiện, P0, P1 rơi vào bế tắc.

Bị bỏ đói có thể xảy ra khi tiến trình vào hàng đợi và được lấy ra theo cơ chế LIFO.

Một phần của tài liệu giáo trình nguyên lý hệ điều hành Chương 2: QUẢN LÝ TIẾN TRÌNH; CHƯƠNG 3. LẬP LỊCH CPU; CHƯƠNG 4. ĐỒNG BỘ HOÁ TIẾN TRÌNH; CHƯƠNG 5. BẾ TẮC (Trang 36 - 38)