操作系统(经典问题)-读者写者问题之读写公平竞争

题干:教材中提供的读者-写者问题的解决方案存在读者优先问题,即当有一个读进程比较活跃时,随后而来的读进程都将被允许访问资源。这样,会导致写进程可能长时间等待。而这种情况往往与实际应用需求相背。

  1. 分析教材中的程序

教材中为读者优先,其特点有写者、读者互斥访问文件资源,多个读者可以同时访问文件资源(通过readcount来控制),只允许一个写者进行写的操作(通过wmutex控制),只要有读者这在读,就不允许写者进入。

由此可看出除非有写者在写,否则读者不需要等待,读者处于高优先级进程,写者处于低优先级进程,两者通过变量wmutex完成互斥。从而导致写进程长时间的等待。

  1. 设计思想

为使得两者公平竞争,还需满足

(1)读者写者的优先级相同

(2)读者、写者互斥访问

(3)只允许有一个写者访问临界区

(4)可以有多个读者同时访问临界区的资源

3、实现方法

       (1)设置rw 信号量实现对临界资源的互斥访问。

(2)设置计数器readcount实现多个读者访问临界资源,通过设置信号量mutex实现对readcount 计数器的互斥访问。

(3)设置信号量w实现读者和写者的公平竞争

4、实现代码

int readcount=0;
semaphore w=1, mutex =1;
Reader()
{
	While(true)
	{
        wait (w);
        wait (mutex);
        if (readcount == 0)
	       wait(rw);
    	readcount++;	
    	signal (mutex);
        signal (w);
		 …
    	   perform read operation
		 …
    	wait (mutex);
    	readcount--;
    	if (readcount == 0)
    		signal (rw);
    	signal (mutex);
	}
}


Writer()
{     
	While(true)
{
    wait(w);
    wait(rw);
	    …
         perform write operation
	    …
    signal(rw);
signal(w);
}
}

 

  • 6
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值