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 gii pháp này chương trình dùng thông điệp empty. Empty hàm ý 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 dliệu thì consumer gởi lại một thông điệp empty đến tiến trình producer.
Sơ đồ điu độ 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)
Until .F.
End;
{ ----------------------------------------}
Procedure Consumer ()
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
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
w
w
w
.
d
o
c
u
-
t
r
a
c
k
.
c
o
m
Var I:integer;
Begin
For I := 0 to N Do Send(Producer ,m);
Repeat
Receive(Producer ,m);
<Lấy dữ liệu từ thông điệp>
Send (Producer,m);
<Xử lý dữ liệu >
Until .F.
End.
Parend
END.
{--------------------------------------------------------}
Bài toán 2: Trong môi trường hệ điều nh đa nhim, có thể tồn tại c file
chia sẻ, thể là các file cơ sdữ liệu. Nhiều tiến trình hoạt động đồng thời trong
hệ thống thể được chia ssdụng một file s dữ liu này. Tiến trình cn đọc
nội dung của file sdữ liệu được gọi là tiến trình Reader. Tiến trình cn cập
nhật thông tin vào file cơ sdliệu được gọi là là tiến trình Writer. Trong hthống
này, công tác điều độ tiến trình cn phải thực hiện các ràng buộc sau:
1. 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ơ sdữ liu khi các tiến
trình Reader khác đang đọc s dữ liệu.
3. Ch duy nhất một tiến trình Writer được phép ghi vào file cơ sdữ
liu
Hãy dùng các giải pháp Semafore, Monitor, Message để tổ chc đ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 đánhn hiệu bằng cờ)
Giải pháp này sdụ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 slượng c tiến trình Reader mun
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ơ sdữ liu, khởi
gán bng 1.
Sau đây là sơ đồ điều độ:
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
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
w
w
w
.
d
o
c
u
-
t
r
a
c
k
.
c
o
m
Program Producer/Consumer;
Const
Mutex: Seamafore = 1;
Db : Seamafore = 1;
Rc : byte = 0;
{------------------------------------}
BEGIN
ParBegin
Procedure Reader();
Begin
Repeat
Down(mutex);
Rc = Rc+1;
If Rc = 1 then Down(db);
Up(mutex); {chấm dứt truy xuất Rc}
<Đọc dữ liệu >;
Down(mutex)
Rc = Rc-1
If Rc = 0 then Up(db);
Up(mutex);
< Xử lý dữ liệu đọc được>
Until .F.
End;
{--------------------------------------------}
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
w
w
w
.
d
o
c
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
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 sdụng một biến chung RC, để ghi nhn s lượng c tiến trình
reader muốn truy xuất s dữ liệu. Tiến trình Writer phi chuyển sang trạng ti
khoá nếu RC > 0. Khi ra khỏi đon ng tiến trình Reader cuối cùng sđánh thc
tiến trình Write đang bị khoá.
Sau đây là sơ dồ điu độ:
Program Producer/Consumer;
Monitor Readerwriter
Condition Okwrite,Okread
Var
Rc: integer;
Busy: boolean = False;
{-------------------------------------}
Procedure Beginread()
Begin
If (busy) then wait(okread);
Rc = Rc+1;
Signal(okread);
End;
Procedure Finishread()
Begin
Rc = Rc - 1;
If Rc = 0 Then Wait(okwrite);
End;
Procedure Beginwrite();
Begin
Rc = Rc - 1;
If (busy) or (Rc <> 0) Then Wait(okwrite);
Busy = True;
End;
Procedure FinishWrite()
Begin
Busy = False;
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
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
w
w
w
.
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 ();
Begin
Repeat
ReaderWriter.BeginWrite();
<đọc dữ liệu>
ReaderWriter.FinishWrite();
Until .F.
End;
Parend
END.
{------------------------------------------------}
II.3.4.6. Giải pháp dùng Message
Giải pháp này cn phải một tiến trình Sever điều khiển việc truy xuất sd
liu. Các tiến trình Writer Reader gửi c thông điệp yêu cu truy xuất đến
server và nhn từ Sever các thông điệp hồi đáp tương ứng.
Sơ đồ điu độ sẽ như sau:
Program Producer/Consumer;
Begin
ParBegin
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
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
w
w
w
.
d
o
c
u
-
t
r
a
c
k
.
c
o
m