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

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

读者优先

要求

读者优先问题:

  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(){
    // 防止同时涌入多个Reader
    wait(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(){
    // 防止同时涌入多个Writer
    wait(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()
{
    // 防止同时涌入多个Reader
    wait(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()
{
    // 防止同时涌入多个Writer
    wait(Wmutex);
    writercount++;
    if (writercount == 1)
    {
        wait(NowRW);
    }
    signal(NowRW);
    signal(Wmutex);

    // -----------------------
    wait(startwr);
    // start writing
    writethings();
    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一次进行读操作

  • 4
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
在Windows2000环境下,创建一个控制台进程,此进程包含n个线程。用这n个线程来表示n个读者写者。每个线程按相应测试数据文件(后面有介绍)的要求进行读写操作。用信号量机制分别实现读者优先写者优先读者-写者问题读者-写者问题读写操作限制(包括读者优先写者优先): 1)写-写互斥,即不能有两个写者同时进行写操作。 2)读-写互斥,即不能同时有一个线程在读,而另一个线程在写。, 3)读-读允许,即可以有一个或多个读者在读。 读者优先的附加限制:如果一个读者申请进行读操作时已有另一个读者正在进行读操作,则该读者可直接开始读操作。 写者优先的附加限制:如果一个读者申请进行读操作时已有另一写者在等待访问共享资源,则该读者必须等到没有写者处于等待状态后才能开始读操作。 运行结果显示要求:要求在每个线程创建、发出读写操作申请、开始读写操作和结束读写操作时分别显示一行提示信息,以确定所有处理都遵守相应的读写操作限制。 2测试数据文件格式 测试数据文件包括n行测试数据,分别描述创建的n个线程是读者还是写者,以及读写操作的开始时间和持续时间。每行测试数据包括四个字段,各个字段间用空格分隔。第一字段为一个正整数,表示线程序号。第二字段表示相应线程角色,R表示读者,w表示写者。第三字段为一个正数,表示读写操作的开始时间:线程创建后,延迟相应时间(单位为秒)后发出对共享资源的读写申请。第四字段为一个正数,表示读写操作的持续时间。当线程读写申请成功后,开始对共 享资源的读写操作,该操作持续相应时间后结束,并释放共享资源。 下面是一个测试数据文件的例子: 2 W 4 5 3 R 5 2 4 R 6 5 5 W 5.1 3

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值