Giải pháp dùng Monitors

Một phần của tài liệu BÀI GIẢNG NGUYÊN LÝ CÁC HỆ ĐIỀU HÀNH (Trang 62 - 65)

Giải pháp này được Hoar đề xuất năm 1974 sau đó vào năm 1975 được Brinch và Hansnen đề xuất lại. Monitor là cấu trúc phần mềm đặc biệt được cung cấp bởi ngôn ngữ lập trình, nó bao gồm các thủ tục, các biến và các cấu trúc dữ liệu được định nghĩa bởi Monitor. Monitor được định nghĩa trong các ngôn ngữ lập trình như pascal+, Modula-2, Modula-3. Monitor có các tính chất sau:

1- Các biến và cấu trúc dữ liệu bên trong monitor chỉ có thể được thao tác bởi các thủ tục định nghĩa bên trong monitor đó. (encapsulation).

2-Một tiến trình muốn vào monitor phải gọi một thủ tục của monitor đó.

3-Tại một thời điểm, chỉ có một tiến trình duy nhất được hoạt động bên trong một monitor (mutual exclusive). Các tiến trình khác đã gọi monitor phải hoãn lại để chờ monitor rỗi.

Hai tính chất 1 và 2 tương tự như các tính chất của các đối tượng trong lập trình hướng đối tượng. Như vậy một hệ điều hành hoặc một ngôn ngữ lập trình hướng đối tượng có thể cài đặt monitor như là một đối tượng có các tính chất đặc biệt. Với tính

thể được truy xuất chỉ bởi một tiến trình tại một thời điểm. Như vậy các cấu trúc dữ liệu dùng chung bởi các tiến trình có thể được bảo vệ bằng cách đặt chúng bên trong monitor. Nếu dữ liệu bên trong monitor là tài nguyên găng thì monitor cung cấp sự độc quyền trong việc truy xuất đến tài nguyên găng đó.

Monitor cung cấp các công cụ đồng bộ hóa được định nghĩa như sau: Trong một monitor, có thể định nghĩa các biến điều kiện và hai thao tác kèm theo là Wait

Signal(chỉ có Wait và Signal được tác động đến các biến điều kiện) như sau : gọi c là biến điều kiện được định nghĩa trong monitor:

Wait(c): chuyển trạng thái tiến trình gọi sang blocked , và đặt tiến trình này vào hàng đợi trên biến điều kiện c.

Signal(c): nếu có một tiến trình đang bị khóa trong hàng đợi của c, tái kích hoạt tiến trình đó, và tiến trình gọi signal sẽ rời khỏi monitor.

Hình 2.18 Monitor và các biến điều kiện

Trình biên dịch chịu trách nhiệm thực hiện việc truy xuất độc quyền đến dữ liệu trong monitor. Để thực hiện điều này, một semaphore nhị phân thường được sử dụng. Mỗi monitor có một hàng đợi toàn cục lưu các tiến trình đang chờ được vào monitor, ngoài ra, mỗi biến điều kiện c cũng gắn với một hàng đợi f(c) và hai thao tác trên đó

được định nghĩa như sau:

Wait(c) :

status(P)= blocked; enter(P,f(c));

Signal(c) :

if (f(c) != NULL){

exit(Q,f(c)); //Q là tiến trình chờ trên c statusQ) = ready;

enter(Q,ready-list); }

Sử dụng: Với mỗi nhóm tài nguyên cần chia sẻ, có thể định nghĩa một monitor trong đó đặc tả tất cả các thao tác trên tài nguyên này với một số điều kiện nào đó.:

monitor <tên monitor >

condition <danh sách các biến điều kiện>;

<déclaration de variables>; procedure Action1(); { } .... procedure Actionn(); { } end monitor; Hình 3.14 Cấu trúc một monitor

Các tiến trình muốn sử dụng tài nguyên chung này chỉ có thể thao tác thông qua các thủ tục bên trong monitor được gắn kết với tài nguyên:

while (TRUE) { Noncritical-section ();

<monitor>.Actioni; //critical-section(); Noncritical-section ();

}

Hình 3.15 Cấu trúc tiến trình Pitrong giảipháp monitor

Với monitor, việc truy xuất độc quyền được bảo đảm bởi trình biên dịch mà không do lập trình viên, do vậy nguy cơ thực hiện đồng bộ hóa sai giảm rất nhiều. Tuy

nhiên giải pháp monitor đòi hỏi phải có một ngôn ngữ lập trình định nghĩa khái niệm monitor, và các ngôn ngữ như thế chưa có nhiều.

Một phần của tài liệu BÀI GIẢNG NGUYÊN LÝ CÁC HỆ ĐIỀU HÀNH (Trang 62 - 65)

Tải bản đầy đủ (PDF)

(142 trang)