操作系统 读写问题(读者优先写者优先)

操作系统要期末考了,读写问题之前一直弄不清楚,现在结合伪代码谈一下个人理解

读者优先

要求

读者优先问题:

  1. 允许多个读者读取;
  2. 读者在读的时候不能有写者在写;
  3. 不允许多个写者同时写;
  4. 如果写者申请写的时候有多个读者申请读,那么先读后写

分析

读者优先中,可以由多个写者和多个读者,那么需要用readercount和writercount记录

某时刻下存在的读者和写者数量,一旦存在读者/写者,立刻封锁startwr,直到所有count为0时再释放

需要使用以下信号量:

startwr:开启读/写进程

NowRW:现在是读者/写者的时间,可以控制Reader和Writer的顺序

Rmutex:使得多个读者依次进行

Wmutex:使得多个写者依次进行

伪代码

int Rmutex=0,Wmutex=0;
int RW=0,readercount=0,writercount=0;
int startrw=0;void Reader(){// 防止同时涌入多个Readerwait(Rmutex);readercount++;if(readercount==1){// 关键点wait(RW);}signal(Rmutex);// ---------------------wait(startrw);//start reading...siganl(startrw);// ---------------------wait(Rmutex);readercount--;if(readercount==0){signal(RW);}signal(Rmutex);}void Writer(){// 防止同时涌入多个Writerwait(Wmutex);wait(RW);writercount++;if(writercount==1){// 关键点wait(startrw);}signal(RW);signal(Wmutex);// ---------------------//start writing...// ---------------------wait(Wmutex);writercount--;if(writercount==0){signal(startrw);}signal(Wmutex);
}

关键点

为什么if(writercount1)限制的是startwr,if(readercount1)限制的是NowRW?

原因是startwr只是限制读写操作的执行,NowRW可以控制reader和writer的添加。

我们设置一组测试用例:reader、writer、reader、reader、writer

按照代码,

1.首先reader进入,封锁NowRW,注意readercount变为1,所以后面的两个writer无法添加,直接添加后面两个reader;

2.三个reader依次进行读操作

3.两个writer依次进行写操作。读者优先效果达成;

写者优先

要求

写者优先问题:

1.允许多个读者读取;

2.读者在读的时候不能有写者在写;

3.不允许多个写者同时写;

4.如果读者申请读的时候已经有写者在写或申请写,那么所有写者写完之后读者才能读

分析

其实和读者优先问题差不多,需要用readercount和writercount记录某时刻下存在的读者和写者数量,一旦存在读者/写者,立刻封锁startwr,直到所有count为0时再释放

需要使用以下信号量:

startwr:开启读/写进程

NowRW:现在是读者/写者的时间,可以控制Reader和Writer的顺序

Rmutex:使得多个读者依次进行

Wmutex:使得多个写者依次进行

伪代码(和读者优先类似,只是更换关键点的位置)

int startwr = 0, NowRW = 0, Rmutex = 0, Wmutex = 0;
int readercount = 0, writercount = 0;void Reader()
{// 防止同时涌入多个Readerwait(Rmutex);// 进入读状态wait(NowRW);//prepare for reading...readercount++;if (readercount == 1){wait(startwr);}signal(NowRW);signal(Rmutex);// -----------------------// start reading...readthings();// -----------------------wait(Rmutex);readercount--;if (readercount == 0){// 说明所有Reader已经读完,可以开始写了signal(startwr);}signal(Rmutex);
}void Writer()
{// 防止同时涌入多个Writerwait(Wmutex);writercount++;if (writercount == 1){wait(NowRW);}signal(NowRW);signal(Wmutex);// -----------------------wait(startwr);// start writingwritethings();signal(startwr);// -----------------------wait(Wmutex);writercount--;if (writercount == 0){signal(NowRW);}signal(Wmutex);
}

关键点

还是刚才那组测试用例:reader、writer、reader、reader、writer

按照代码,

1.首先reader进入,封锁NowRW,然后开始读,读之后释放NowRW;

2.然后writer进入,注意writercount变为1,所以后面的两个reader无法添加,直接添加最后一个writer

3.两个writer依次进行写操作;

4.最后的两个reader一次进行读操作


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部