(操作系统原理·第三章)读者-写者问题

问题描述:

有两组并发进程:读者和写者,共享一个文件F,要求:

(1)允许多个读者可同时对文件执行读操作;

(2)只允许一个写者往文件中写信息;

(3)任一写者在完成写操作之前不允许其他读者或写者工作;

(4)写者执行写操作前,应让已有的写者和读者全部退出。


分析:

单纯使用信号量不能解决读者与写者问题,必须引入计数器rc 对读进程计数,mutex 是用于对计数器rc 操作的互斥信号量,W 表示是否允许写的信号量。


算法:

var rc: integer;
W,mutex: semaphore;
rc := 0; /* 读进程计数 */
W := 1;
mutex := 1;
procedure read;
begin
P(mutex);
rc := rc + 1;
if rc=1 then P(W);
V(mutex);
读文件;
P(mutex);
rc := rc - 1;
if rc = 0 then V(W);
V(mutex);
end;
procedure write;
begin
P(W);
写文件;
V(W);
end;


cobegin
process readeri;
process writerj;
coend.
process readeri;
begin
read;
end.
process writerj
begin
write;
end.

在上面的解法中,读者是优先的,当存在读者时,写操作将被延迟,并且只要有一个读者活跃,随后而来的读者都将被允许访问文件,从而,导致了写进程长时间等待,并有可能出现写进程被饿死。增加信号量并修改上述程序可以得到写进程具有优先权的解决方案,能保证当一个写进程声明想写时,不允许新的读进程再访问共享文件。
为了有效解决读者写者问题,有的操作系统专门引进了读者/写者锁。读者/写者锁允许多个读者同时以只读方式存取有锁保护的对象;或一个写者以写方式存取有锁保护的对象。当一个或多个读者已上锁后,此时形成了读锁,写者将不能访问有读锁保护的对象;当锁被请求者用于写操作时,形成了写状态,所有其他进程的读写操作必须等待。

你可能感兴趣的:(学习笔记)