Phần 5.6 Monitors

Một phần của tài liệu Seminal chương 5 Đồng bộ hóa và giao tiếp dựa trên biến chia sẻ (Trang 34 - 40)

- 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

Một phần của tài liệu Seminal chương 5 Đồng bộ hóa và giao tiếp dựa trên biến chia sẻ (Trang 34 - 40)