Skip to content

2.20 经典模型:读写者模型

Giovanna

About 716 wordsAbout 2 min

2024-08-31

一、读写者模型

读写问题:

  • 多个进程对同一个文件进行读写,要求

    • 不能同时写文件
    • 不能同时读和写文件可以同时读文件
    • 可以同时读文件

为实现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);
}

二、小剧场

这个小剧场没上一个好。。。

一点都不好理解,和原来的模型区别就在于换了个描述。。。

image.png

三、例题

有一座东西方向的独木桥,请分别用PV操作实现以下3个要求:

(1) 每次只允许一个人过桥

(2) 当独木桥上有行人时,同方向的行人可以同时过桥,相反方向的人必须等待

(3) 当独木桥上有自东向西的行人时,同方向的行人可以同时过桥,从西向东的方向只允许一个人单独过桥

解析:

(1) 桥是临界资源,对象也只有一种,过的时候P一下,过完V一下就行

(2) 相当于两类读者

(3) 和我的小剧场一样是套皮读写者模型。自西向东是写者,自东向西是读者


思考题:

四个进程A、B、C、D都要读一个共享文件F,系统允许多个进程同时读文件F。但限制是进程A和进程C不能同时读文件F,进程B和进程D也不能同时读文件F。为了使这四个进程并发执行时能按系统要求使用文件,现用P、V操作进行管理。