Bài giảng Hệ điều hành - Chương 5: Đồng bộ (Phần 3) - Trần Thị Như Nguyệt

Chương 5: Đồng bộ - 3  
01/2015  
Mục tiêu  
Biết được các giải pháp đồng bộ tiến trình theo kiểu  
“Sleep & Wake up” bao gồm:  
Semaphore  
Critical Region  
Monitor  
Áp dụng các giải pháp này vào các bài toán đồng bộ  
kinh điển  
Đồng bộ  
2
Nội dung  
Các giải pháp “Sleep & Wake up”  
Semaphore  
Các bài toán đồng bộ kinh điển  
Monitor  
Đồng bộ  
3
Các giải pháp “Sleep & Wake up”  
int busy; // =1 nếu CS đang bꢀ chiếm  
int blocked; // sô  
do{  
́ P đang bꢀ khꢁa  
if (busy){  
blocked = blocked +1;  
sleep();  
}
else busy =1;  
CS;  
busy = 0;  
if (blocked !=0){  
wakeup (process);  
}
RS;  
} while (1);  
Đồng bộ  
4
Semaphore  
Một trong những công cụ đảm bảo sự đồng bộ của các  
process mà hệ điều hành cung cấp là Semaphore.  
Ý tưởng của Semaphore:  
Semaphore S là một biến sꢂ nguyên.  
Ngoài thao tác khởi động biến thꢃ Semaphore chꢄ  
có thể được truy xuất qua hai hàm có tꢅnh đơn  
nguyên (atomic) là wait và signal  
Hàm wait() và signal() còn có tên gọi khác lần lượt là P()  
và V()  
Đồng bộ  
5
Semaphore  
Đầu tiên, hàm wait và signal được hiện thực như sau:  
Tuy nhiên, với cách hiện thực này, vòng lặp “while (S <= 0);” trong  
hàm wait() sẽ dẫn 
Để không busy waiting, hàm wait() và signal() được cải tiến. Một  
hàng đợi semaphore được đưa thêm vào để thay vì phải lặp vòng  
trong trường hợp semaphore nhỏ hơn hoặc 0, process sẽ được  
đưa vào hàng đợi này để chờ và sẽ được ra khỏi hàng đợi này khi  
hàm signal()gđọưi.ợc  
Đồng bộ  
6
Semaphore  
Hàm wait và signal của Semaphore cải tiến, không busy  
waiting như sau:  
Đꢀnh nghꢆa semaphore lꢇ một record  
typedef struct {  
int value;  
strue */  
} semaphore;  
Mỗi Semaphore có một giá trꢀ nguyên của nó và một danh sách  
các process.  
Khi các process chưa sẵn sàng để thực thi thì sẽ được đưa vào  
danh sách này. Danh sách này còn gọi là hàng đợi semaphore.  
Lưu ý: Các process khi ra khỏi hàng đợi semaphore sẽ vào hàng đợi  
Ready để chờ lấy CPU thực thi.  
Đồng bộ  
7
Semaphore  
Hàm wait và signal của Semaphore cải tiến, không busy  
waiting như sau:  
Hàm wait() và signal() được hiện thực như sau:  
void wait(semaphore *S) {  
Lập trình thực tế, tùy  
từng ngôn ngữ, có thể  
S.value--;  
if (S.value < 0) {  
à:  
add this process to S.L;  
S.value hoặc  
block();  
Svalue  
}
}
void signal(semaphore *S) {  
S.value++;  
if (S.value <= 0) {  
remove a process P from S.L;  
wakeup(P);  
}
}
Đồng bộ  
8
Semaphore  
Hàm wait và signal của Semaphore cải tiến, không busy  
waiting như sau:  
Khi hàm wait() được gọi, ngay lập tức giá trꢀ value của  
Semaphore S bꢀ giảm đi 1. Và nếu giá trꢀ Semaphore S âm,  
process này sẽ bꢀ đưa vào danh sách L (đưa vào hàng đợi  
Semaphore) và bꢀ khóa (block) lại.  
Khi hàm signal() được gọi, ngay lập tức giá trꢀ value của  
Semaphore S tăng lên 1. Và nếu giá trꢀ Semaphore lớn hơn  
hoặc bằng 0, một process sẽ được chọn lựa trong danh sách L,  
tức trong hàng đợi Semaphore và bꢀ đánh thức dậy (wakeup) để  
ra hàng đợi ready và chờ CPU để thực hiện.  
Lưu ý: Trong hiện thực, các PCB của các process bị block sẽ được  
đưa vào danh sách L. Danh sách L có thể dùng hàng đợi FIFO  
hoặc cấu trúc khác tùy thuộc vào yêu cầu hệ thống.  
Đồng bộ  
9
Semaphore  
Hàm wait và signal của Semaphore cải tiến, không busy  
waiting như sau:  
Block() và Wakeup() là hai system calls của hệ điều hành.  
block(): Process này đang thực thi lệnh này sẽ bꢀ khóa lại.  
Process chuyển từ Running sang Waiting  
wakeup(P): hồi phục quá trꢃnh thực thi của process P đang bꢀ  
blocked  
Process P chuyển thừ Waiting sang Ready  
Đồng bộ  
10  
Ví dụ sử dụng semaphore (1)  
Shared data:  
Ví dụ 1:  
semaphore mutex;  
Dùng semaphore giải quyết  
n process truy xuất vào CS.  
(Khởi tạo mutex.value = 1)  
Có hai trường hợp:  
Process Pi:  
Chꢄ duy nhất một process  
được vꢇo CS (mutual  
exclusion)  
wait(mutex);  
critical section  
Khꢀi tꢁo S.value = 1  
signal(mutex);  
remainder section  
} while (1);  
Cho phꢈp k process vꢇo CS  
Khꢀi tꢁo S.value = k  
Đồng bộ  
11  
Ví dụ sử dụng semaphore (2)  
Ví dụ 2:  
Process P1:  
S1;  
Dùng Semaphore giải quyết  
đồng bộ giữa hai process  
signal(synch);  
Yêu cầu:  
Process P2:  
Cho hai process: P1 và P2  
wait(synch);  
S2;  
P1 thực hiện lệnh S1 vꢇ P2 thực  
hiện lệnh S2.  
Lệnh S2 chꢄ được thực thi sau khi  
lệnh S1 được thực thi.  
Khꢀi tao semaphore tên synch  
và  
synch.value = 0  
Đồng bộ  
12  
Ví dụ sử dụng semaphore (3)  
Ví dụ 3:  
Process P1:  
Dùng Semaphore giải quyết  
đồng bộ giữa hai process  
A1;  
signal(s1);,  
wait(s2);  
A2;  
Yêu cầu:  
Xét 2 tiến trình xử lý đoạn  
chương trình sau:  
Process P2:  
B1  
• Tiến trình P1 {A1, A2}  
• Tiến trình P2 {B1, B2}  
Đồng bộ hóa hoạt động của 2 tiến  
trình sao cho cả A1 và B1 đều  
hoàn tất trước khi A2 và B2 bắt  
đầu.  
signal(s2);  
wait(s1);  
B2;  
Khꢀi tꢁo 2 Semaphore s1 và s2  
s1.value = s2.value = 0  
Đồng bộ  
13  
Nhận xét  
Khi S.value ≥ 0: value chính là sꢂ process cꢁ thể  
thực thi wait(S) mꢇ không bꢀ blocked  
Khi S.value < 0: trꢀ tuyệt đꢂi của value chính là sꢂ  
process đang đợi trên hàng đợi semaphore  
Đồng bộ  
14  
Nhận xét (tt)  
Việc hiện thực Semaphore phải đảm bảo tính chất Atomic vꢇ  
mutual exclusion: tức không được xảy ra trường hợp 2 process  
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 multiprocessor)  
⇒ do đꢁ, đoạn mꢊ đꢀnh nghꢆa các lệnh wait(S) vꢇ signal(S) cꢋng  
chꢅnh lꢇ vꢉng tranh chấp  
Giải pháp cho vꢉng tranh chấp wait(S) vꢇ signal(S):  
Uniprocessor: cꢁ thể dꢉng cơ chế cấm ngắt (disable  
interrupt). Nhưng phương pháp nꢇy không hiệu quả trên hệ  
thꢂng multiprocessor.  
Multiprocessor: cꢁ thể dꢉng các giải pháp software (như giải  
Peterson và dware (TestAndSet,  
Swap).  
Vꢉng tranh chấp của các tác vụ wait(S) vꢇ signal(S) thông  
thường rất nhꢌ: khoảng 10 lệnh.  
Vꢃ CS rất nhꢌ nên chi phꢅ cho busy waiting sẽ rất thấp.  
Đồng bộ  
15  
Deadlock và starvation  
Deadlock: hai hay nhiều process đang chờ đợi vô hạn đꢀnh một  
sự kiện không bao giờ xảy ra.  
Ví dụ thường gặp nhất của deadlock là hai (hoặc nhiều) process đang  
chờ đợi qua lại các sự kiện của nhau thì mới được thực thi, nhưng cả hai  
process này đều đꢊ bꢀ block, nên sự kiện này không bao giờ xảy ra và hai  
process sẽ bꢀ block vꢆnh viễn.  
Ví dụ: Gọi S vꢇ Q hởi tạo = 1  
P0  
P1  
wait(S);  
wait(Q);  
…
wait(Q);  
wait(S);  
…
signal(S);  
sig
signal(Q);  
Ví dụ khởi tạo S.value và Q.value bằng 1. P0 đầu tiên thực thi wait(S), rồi  
P1 thực thi wait(Q), rồi P0 thực thi wait(Q) và bꢀ blocked, tiếp theo P1  
thực thi wait(S) bꢀ blocked.  
Tình huꢂng nà là P0 và P1 bꢀ rơi vào deadlock.  
Đồng bộ  
16  
Deadlock và starvation  
Starvation (indefinite blocking): Trường hợp một tiến trꢃnh cꢁ  
thể không bao giờ được lấy ra khꢌi hꢇng đợi mꢇ nꢁ bꢀ khóa/treo  
(block) trong hꢇng đợi đꢁ.  
Đồng bộ  
17  
Các loại semaphore  
Counting semaphore: một sꢂ nguyên cꢁ giá trꢀ  
không hạn chế.  
Binary semaphore: cꢁ trꢀ lꢇ 0 hay 1. Binary  
semaphore rất dễ hiện thực.  
Đồng bộ  
18  
Các bài toán đồng bộ kinh điển  
Ba bài toán đồng bộ kinh điển:  
Bounded-Buffer Problem  
Dining-Philosophers Problem  
Readers and Writers Problem  
Đồng bộ  
19  
Bài toán Bounded-Buffer  
Producer sản suất một sản phẩm và đặt vào buffers,  
buffers giới hạn chꢄ chứa được n sản phẩm.  
Consumer tiêu thụ mỗi lần một sản phẩm, sản phẩm được  
lấy ra từ buffers.  
Khi buffers đꢊ chứa n sản phẩm, Producer không thể đưa  
tiếp sản phẩm vào buffers nữa mà phải chờ đến khi buffers  
có chỗ trꢂng. Khi buffers rỗng, Consumer không thể lấy sản  
phẩm để tiêu thụ mà phải chờ đến khi có ít nhất 1 sản  
phẩm vào buffers.  
Đồng bộ  
20  
Tải về để xem bản đầy đủ
pdf 43 trang yennguyen 10960 Free
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Hệ điều hành - Chương 5: Đồng bộ (Phần 3) - Trần Thị Như Nguyệt", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

File đính kèm:

  • pdfbai_giang_he_dieu_hanh_chuong_5_dong_bo_phan_3_tran_thi_nhu.pdf