Thứ Tư, 8 tháng 6, 2011

Mô hình Readers-Writers

Mô hình Readers-Writers
Vấn đề : Nhiều tiến trình đồng thời sử dụng một cơ sở dữ liệu. Các tiến trình chỉ cần lấy nội dung của cơ sở dữ liệu được gọi là các tiến trình Reader, nhưng một số tiến trình khác lại có nhu cầu sửa đổi, cập nhật dữ liệu trong cơ sở dữ liệu chung này, chúng được gọi là các tiến trình Writer. Các quy định đồng bộ hóa việc truy xuất cơ sỡ dữ liệu cần tuân thủ là :
Không cho phép một tiến trình Writer cập nhật dữ liệu trong cơ sở dữ liệu khi các tiến trình Reader khác đang truy xuất nội dung cơ sở dữ liệu.. (synchronisation)
Tại một thời điểm , chỉ cho phép một tiến trình Writer được sửa đổi nội dung cơ sở dữ liệu. (mutuelle exclusion).
Monitor
Sử dụng một biến chung rc để ghi nhớ số lượng các tiến trình Reader muốn truy xuất cơ sở dữ liệu. Một tiến trình Writer phải chuyển sang trạng thái chờ nếu rc > 0. KHi ra khỏi miền găng, tiến trình Reader cuối cùng sẽ đánh thức tiến trình Writer đang bị khóa.
monitor ReaderWriter
condition OKWrite, OKRead;
int rc = 0;
Boolean busy = false;

procedure BeginRead()
{
if (busy) // nếu db đang bận, chờ
wait(OKRead);
rc++; // thêm một Reader
signal(OKRead);
}
procedure FinishRead()
{
rc--; // bớt một Reader
if (rc == 0) // nếu là Reader cuối cùng
signal(OKWrite); // thì cho phép Writer
// truy xuất db
}
procedure BeginWrite()
{
if (busy || rc != 0) // nếu db đang bận, hay một
wait(OKWrite); // Reader đang đọc db,chờ
busy = true;
}
procedure FinishWrite()
{
busy = false;
If (OKRead.Queue)
signal(OKRead);
else
signal(OKWrite);
}
Reader()
{
while (TRUE)
{
ReaderWriter.BeginRead();
Read_database();
ReaderWriter.FinishRead();
}
}
Writer()
{
while (TRUE)
{
create_data(&info);
ReaderWriter.BeginWrite();
Write_database();
ReaderWriter.FinishWrite();
}
}
Trao đổi thông điệp
Cần có một tiến trình server điều khiển việc truy xuất cơ sở dữ liệu.
Các tiến trình Writer và Reader gởi các thông điệp yêu cầu truy xuất đến server và nhận từ server các thông điệp hồi đáp tương ứng .
Reader()
{
while (TRUE) {
send (server, RequestRead);
receive (server, value);
print(value); }
}

Writer()
{
while (TRUE) {
create_data(&value);
send (server, RequestWrite,value);
receive (server,OKWrite); }
}

Không có nhận xét nào:

Đăng nhận xét