Producer/Consumer.Remove;
<Xử lý dữ liệu>;
Until .F.
End;
Parend
END.
{ }
II.3.4.3. Giải pháp dùng Message
Với giải pháp này chương trình dùng thông điệp empty. Empty hàm ý có một chỗ
trống. Buffer. Khi khởi tạo tiến trình Consumer gởi ngay N thông điệp empty đến
tiến trình Producer. Tiến trình Producer tạo ra một dữ liệu mới và chờ đến khi nhận
được một thông điệp empty từ consumer thì gởi ngược lại cho Consumer một
thông điệp có chứa dữ liệu mà nó tạo ra. Sau khi gởi đi thông điệp Emtry, tiến trình
consumer sẽ chờ để nhận thông điệp chứa dữ liệu từ tiến trình producer. Sau khi xử
lý xong dữ liệu thì consumer gởi lại một thông điệp empty đến tiến trình producer.
Sơ đồ điều độ sẽ như sau:
Program Producer/Consumer;
Var
Buffersize: integer; {kích thước Buffer}
M, m’: Message;
{ }
BEGIN
Buffersize = N;
ParBegin
Procedure Producer();
Begin
Repeat
<Tạo dữ liệu>;
Receive(Consumer,m);
<Tạo thông điệp dữ liệu>
Send(Consumer,m)
u
-
t
r
a
c
k
.
c
o
m
Click to buy NOW!
P
D
F
-
X
C
h
a
n
g
e
V
i
e
w
e
r
{ }
Bài toán 2: Trong môi trường hệ điều hành đa nhiệm, có thể tồn tại các file
chia sẻ, có thể là các file cơ sở dữ liệu. Nhiều tiến trình hoạt động đồng thời trong
hệ thống có thể được chia sẻ sử dụng một file cơ sở dữ liệu này. Tiến trình cần đọc
nội dung của file cơ sở dữ liệu được gọi là là tiến trình Reader. Tiến trình cần cập
nhật thông tin vào file cơ sở dữ liệu được gọi là là tiến trình Writer. Trong hệ thống
này, công tác điều độ tiến trình cần phải thực hiện các ràng buộc sau:
1. Có thể có nhiều tiến trình Reader đồng thời đọc file cơ sở dũ liệu.
2. Không cho phép một tiến trình Writer ghi vào cơ sở dữ liệu khi các tiến
trình Reader khác đang đọc cơ sở dữ liệu.
3. Chỉ có duy nhất một tiến trình Writer được phép ghi vào file cơ sở dữ
liệu
Hãy dùng các giải pháp Semafore, Monitor, Message để tổ chức điều độ cho
các tiến trình Reader và Writer trong bài toán ở trên.
II.3.4.4. Giải pháp dùng Semaphore (sự đánh tín hiệu bằng cờ)
Giải pháp này sử dụng một biến chung RC và hai semaphore (sự đánh tín hiệu bằng
cờ) là Mutex và DB.
RC (readcount) dùng để ghi nhận số lượng các tiến trình Reader muốn
truy xuất file cơ sở dữ liệu, khởi gán bằng 0.
Mutex: dùng để kiểm soát truy xuất đến RC, khởi gán bằng 1.
DB: dùng để kiểm tra sự truy xuất độc quyền đến cơ sở dữ liệu, khởi
gán bằng 1.
Sau đây là sơ đồ điều độ:
Click to buy NOW!
P
D
F
-
X
C
Click to buy NOW!
P
D
F
-
X
C
h
a
n
g
e
V
i
e
w
e
r
w
w
w
.
d
o
c
u
-
t
r
{ }
Procedure Writer();
Begin
Repeat
<Tạo dữ liệu >;
Down(Db);
<cập nhận dữ liệu >
Up(db);
Until .F.
End;
ParEnd
Click to buy NOW!
P
D
F
-
X
C
h
a
n
g
e
V
i
e
w
e
r
V
i
e
w
e
r
w
w
w
.
d
o
c
u
-
t
r
a
c
k
.
c
o
m
End.
{ }
II.3.4.5. Giải pháp dùng Monitor
Giải pháp này sử dụng một biến chung RC, để ghi nhận số lượng các tiến trình
reader muốn truy xuất cơ sở dữ liệu. Tiến trình Writer phải chuyển sang trạng thái
Click to buy NOW!
P
D
F
-
X
C
h
a
n
g
e
V
i
e
w
e
r
w
w
w
.
d
o
c
u
-
t
r
d
o
c
u
-
t
r
a
c
k
.
c
o
m
If (Okread) Then Signal(okread)
Else Signal(okwrite);
End;
Endmonitor.
{ }
BEGIN
ParBegin
Procedure Reader ();
Begin
Repeat
ReaderWriter.BeginRead();
<đọc dữ liệu>
ReaderWriter.FinishRead();
Until .F.
End;
Procedure Writer ();
V
i
e
w
e
r
w
w
w
.
d
o
c
u
-
t
r
a
c
k
.
c
o
m
Click to buy NOW!
P
D
F
-
o
m