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). 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
Trường đại học Sư phạm Kỹ thuật TP Hồ Chí Minh Khoa Đào tạo Chất lượng cao HỆ ĐIỀU HÀNH THỜI GIAN THỰC (RTOS) Sleep&Wakeup GV hướng dẫn: Huỳnh Hoàng Hà Danh sách thành viên: Các giải pháp đồng hóa 01 Introduction 02 Semaphore Các giải pháp khác Monitor 05 04 Tổng kết 03 Introduction Introduction o SLEEP lời gọi hệ thống có tác dụng tạm dừng hoạt động tiến trình (blocked) gọi chờ đến tiến trình khác « đánh thức » o Lời gọi hệ thống WAKEUP nhận tham số nhất: tiến trình tái kích hoạt (đặt trạng thái ready) Introduction Ý TƯỞNG o Khi tiến trình chưa đủ điều kiện vào miền găng, gọi SLEEP để tự khóa đến có tiến trình khác gọi WAKEUP để giải phóng cho o Một tiến trình gọi WAKEUP khỏi miền găng để đánh thức tiến trình chờ, tạo hội cho tiến trình vào miền găng int busy; // miền găng bị chiếm, không int blocked; // đếm số lượng tiến trình 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 (); } Introduction Nhược điểm Xảy tình trạng mâu thuẫn truy xuất vài tình đặc biệt sau : Giả sử tiến trình A vào miền găng, trước rời khỏi miền găng tiến trình B kích hoạt Tiến trình B thử vào miền găng nhận thấy A đó, B tăng giá trị biến blocked chuẩn bị gọi SLEEP để tự khố Tuy nhiên trước B thực SLEEP, tiến trình A lại tái kích hoạt khỏi miền găng Khi khỏi miền găng A nhận thấy có tiến trình chờ (blocked=1) nên gọi WAKEUP giảm giá trị blocked Khi tín hiệu WAKEUP lạc tiến trình B chưa thật « ngủ » để nhận tín hiệu đánh thức! Khi tiến trình B tiếp tục xử lý, gọi SLEEP tự khóa vĩnh viễn ! Introduction Nhược điểm (a) Process A Initial: + busy=0; // busy=1 means: the CS has a process inside + blocked=0; // blocked: is the number of processes blocked in the Waiting List (b) Process B while (TRUE) while (TRUE) { { if (busy) { blocked = blocked + 1; sleep(); } busy = 1; busy = 1; critical-section (); critical-section (); busy = 0; busy = 0; if (blocked) { wakeup(process); blocked = blocked - 1; } } if (busy) { blocked = blocked + 1; sleep(); } Noncritical-section-A(); if (blocked) { wakeup(process); blocked = blocked - 1; } } Noncritical-section-B(); Introduction Nhược điểm (a) Process A Initial: + busy=0; // busy=1 means: the CS has a process inside + blocked=0; // blocked: is the number of processes blocked in the Waiting List (b) Process B while (TRUE) while (TRUE) { { if (busy) { blocked = blocked + 1; sleep(); } busy = 1; sleep(); } busy = 1; critical-section (); critical-section (); busy = 0; busy = 0; if (blocked) { wakeup(process); blocked = blocked - 1; } } if (busy) { blocked = blocked + 1; Noncritical-section-A(); //W = {B}; forever if (blocked) { wakeup(process); blocked = blocked - 1; } } Noncritical-section-B(); Introduction GIẢI PHÁP Hệ điều hành cung cấp chế đồng hóa dựa ý tưởng chiến lược « SLEEP and WAKEUP » xây dựng bao hàm 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 Semaphor e Semaphoreo Một semaphore s biến gồm thuộc tính sau: o Một giá trị khởi tạo nguyên dương s lớn (s>=0) o Một hàng đợi (waiting list) f(s) lưu danh sách tiến trình bị khóa (block) semaphore s (danh sách f(s) lúc đầu NULL rỗng, có nhiều tiến trình vào dánh sách theo phương pháp FIFO) o P Q biến trỏ để đỏ đến tiến trình cần quản lý o Chỉ có hai thao tác định nghĩa semaphore: down(s) up(s) S1 S2 S3 P1 NULL P2 P3 Semaphore o Down(s): giảm giá trị semaphore s đơn vị semaphore có trị e(s) > 0, tiếp tục xử lý Ngược lại, e(s) £ 0, tiến trình phải chờ đến e(s) >0 o Up(s): tăng giá trị semaphore s lên đơn vị Nếu có nhiều tiến trình chờ semaphore s, bị khóa thao tác Down, hệ thống chọn tiến trình để kết thúc thao tác Down cho tiếp tục xử lý Down(s): block a process, and put into f(s) void Down(int s) { s = s - 1; if (s < 0) { status(P)= blocked; } } enter(P,f(s)); Up(s): wake up a process from f(s)Up( int s) { void s = s + 1; if (s