Appearance
2.20 经典模型:读写者模型
一、读写者模型
读写问题:
多个进程对同一个文件进行读写,要求
- 不能同时写文件
- 不能同时读和写文件可以同时读文件
- 可以同时读文件
为实现Reader与Writer进程间在读或写时的互斥而设置了一个互斥信号量Wmutex。
设置一个整型变量Readcount表示正在读的进程数目。由于只要有一个Reader进程在读,便不允许Writer进程去写。因此,仅当Readcount=0,表示尚无Reader进程在读时,Reader进程才需要执行Wait(Wmutex)操作。若wait(Wmutex)操作成功,Reader进程便可去读,相应地,做Readcount+1操作。
同理,仅当Reader进程在执行了Readcount减1操作后其值为0时,才须执行signal(Wmutex)操作,以便让Writer进程写。
Readcount是一个可被多个Reader进程访问的临界资源,因此,应该为它设置一个互斥信号量rmutex。
定义信号量
Semaphore Rmutex=1,Wmutex=1;
int ReaderCount=0;
// 以上是初始化动作
读者进程
Reader:
while(Condition)
{
P(Rmutex); // 对共享资源Rmutex加锁
if(ReaderCount==0)
{
P(Wmutex); // 读之前对临界资源文件加锁
}
ReaderCount++;
V(Rmutex);
... // 开始读文件
P(Rmutex);
ReaderCount--;
if(ReaderCount==0)
{
V(Wmutex); // 若无读进程,则对临界资源进行写解锁
}
V(Rmutex); // 对Rmutex解锁
}
写者进程
Writer:
while(Condition)
{
P(Wmutex);
...; // 写文件过程
V(Wmutex);
}
二、小剧场
这个小剧场没上一个好。。。
一点都不好理解,和原来的模型区别就在于换了个描述。。。
三、例题
有一座东西方向的独木桥,请分别用PV操作实现以下3个要求:
(1) 每次只允许一个人过桥
(2) 当独木桥上有行人时,同方向的行人可以同时过桥,相反方向的人必须等待
(3) 当独木桥上有自东向西的行人时,同方向的行人可以同时过桥,从西向东的方向只允许一个人单独过桥
解析:
(1) 桥是临界资源,对象也只有一种,过的时候P一下,过完V一下就行
(2) 相当于两类读者
(3) 和我的小剧场一样是套皮读写者模型。自西向东是写者,自东向西是读者
思考题:
四个进程A、B、C、D都要读一个共享文件F,系统允许多个进程同时读文件F。但限制是进程A和进程C不能同时读文件F,进程B和进程D也不能同时读文件F。为了使这四个进程并发执行时能按系统要求使用文件,现用P、V操作进行管理。