- Phân tán suốt chương trình
Phần 5.6 Monitors
Monitors
Monitors
• Vấn đề chính của miền găng điều kiện là chúng có thể phân tán trong suốt chương trình.
• Với monitor, các miền găng được viết như thủ tục & được đóng gói lại thành 1 module duy nhất gọi là
monitor.
• Monitor gồm 1 khai báo các biến cục bộ của nó, 1 tập các thủ tục monitor & 1 thủ tục khởi tạo trạng thái monitor.
Monitors
Monitor <tên monitor> {
khai báo các biến được chia sẻ procedure P1 (…) { … } procedure P2 (…) { … } . . procedure Pn (…) { … } { mã khởi tạo } } 36
Monitors
• Miền găng là cố định & được xác định sẵn trong các thủ tục monitor => monitor có tính cấu trúc hơn semaphore.
• Những biến cục bộ của monitor có thể được truy xuất chỉ bởi những thủ tục cục bộ.
• Chỉ một quá trình tại một thời điểm có thể được kích hoạt trong monitor
• Monitor là một cải tiến so với CCR bởi vì tất cả các code truy cập dữ liệu dùng chung đều được tập trung.
Monitors
• Monitor vẫn cần điều kiện đồng bộ.
• Đó là biến điều kiện (condition variable), được thực thi bởi 2 toán tử được gọi là wait & signal (tương tự như trong
semaphore).
• Người lập trình có thể định nghĩa một hay nhiều biến kiểu
condition:
condition x;
x.wait(): quá trình gọi thao tác này được tạm dừng cho đến khi quá trình khác gọi x.signal();
x.signal(): thực thi tiếp quá trình tạm dừng.
Monitors
Rw: monitor
Var rc: integer;
busy: boolean;
toread, towrite: condition; procedure startread begin if busy then toread.wait(); rc := rc + 1; toread.signal(); end; procedure endread begin rc := rc - 1; if rc = 0 then towrite.signal(); end; procedure startwrite begin if busy or rc != 0 then towrite.wait(); busy := true; end; procedure endwrite begin busy := false; toread.signal() or towrite.signal(); End