读者写者问题(读者优先,写者优先 ,读写公平)

读者优先

读者优先的解决方案:

互斥信号量wrt,初值是1,代表一个共享文件,解决“读-写”互斥,“写-写”互斥。

一个记数器,即整型变量readcount,记录读者数,初值是0。 来一个读者, readcount加1 当readcount =1表示是第一个读者, 则需要执行p操作抢占文件;否则表示已有读者在安全的读数据。 走一个读者,readcount减1 当readcount =0表示是最后一个读者,则需要v操作释放资源;否则表示还有读者在读数据。

readcount 为多个读者共享的变量,是临界资源。用互斥信号量mutex控制, mutex初值是1。

代码:

int readcount=0; 
semaphore mutex=1, wrt=1 ; 

读者进程:
    wait (mutex);
	readcount++;	
	if (readcount == 1)
	       wait(wrt);
	signal (mutex);
		…
	   reading is performed
		 …
	wait (mutex);
	readcount--;
	if (readcount == 0)
		signal (wrt);
	signal (mutex);


写者进程:     
      wait(wrt);
	    …
         writing is performed
	    …
      signal(wrt);

写者优先

解决方案:

在读者优先的基础上

增加信号量r,初值是1:当至少有一个写进程准备访问数据区时,用于禁止所有的读进程。

增加一个记数器,即整型变量writecount,记录写者数,初值是0。 writecount为多个写者共享的变量,是临界资源。用互斥信号量mutex2控制, mutex2初值是1。

增加mutex3,初值是1:在r上不允许建造长队列,否则写进程将不能跳过这个队列,因此,只允许一个读进程在r上排队,而所有其他读进程在等待r之前,在信号量mutex3上排队。

代码:

int readcount=0, writecount=0; 
semaphore mutex1=1, mutex2=1, mutex3=1, w=1, r=1 ; 

读者进程:
P(mutex 3);
   P(r);
      P(mutex 1);
         readcount++;
         if (readcount == 1 ) 
            P(w);
      V(mutex 1);
    V(r);
V(mutex 3);
      reading is performed
P(mutex 1);
    readcount --;
    if (readcount == 0 )
             V(w);
V(mutex 1);

写者进程:     
P(mutex 2);
    writecount++;
    if (writecount == 1 )
           P(r);
V(mutex 2);
P(w);
    writing is performed
V(w);
P(mutex 2);
    writecount --;
    if (writecount == 0)
           V(r);
V(mutex 2); 

读写公平

 

代码:

int readcount=0; 
semaphore mutex=1, rw=1 w=1; 

读者进程:
        wait (w);
        wait (mutex);
        if (readcount == 0)
	       wait(rw);
    	readcount++;	
    	signal (mutex);
        signal (w);
		…
    	   reading is performed
		 …
    	wait (mutex);
    	readcount--;
    	if (readcount == 0)
    		signal (rw);
    	signal (mutex);


写者进程:     
    wait(w);
    wait(rw);
	    …
         writing is performed
	    …
    signal(rw);
    signal(w);

 

  • 83
    点赞
  • 340
    收藏
    觉得还不错? 一键收藏
  • 40
    评论
根据引用[1]中的描述,写者优先算法和读写公平算法的区别在于对于读写进程的优先顺序不同。写者优先算法中,如果有写进程在等待,那么读进程就不能访问共享资源,这样可能会导致读进程饥饿。而读写公平算法则采取了读写公平的策略,即无论读进程还是写进程到来,都需要排队,遵循先到先得的原则,从而避免了饥饿问题。引用中的实验结果也验证了读写公平算法的正确性。 下面是两种算法的伪代码实现: 写者优先算法: ``` do { wait(wrt); // 等待写进程 // 写进程访问共享资源 signal(wrt); // 释放写进程 } while (true); do { wait(mutex); // 互斥访问读者计数器 readcount++; if (readcount == 1) { wait(wrt); // 等待写进程 } signal(mutex); // 释放读者计数器 // 读进程访问共享资源 wait(mutex); // 互斥访问读者计数器 readcount--; if (readcount == 0) { signal(wrt); // 释放写进程 } signal(mutex); // 释放读者计数器 } while (true); ``` 读写公平算法: ``` do { wait(mutex); // 互斥访问读者计数器和写者计数器 while (writecount > 0) { wait(wrt); // 等待写进程 } readcount++; signal(mutex); // 释放读者计数器和写者计数器 // 读进程访问共享资源 wait(mutex); // 互斥访问读者计数器和写者计数器 readcount--; if (readcount == 0) { signal(rdr); // 释放读进程 } signal(mutex); // 释放读者计数器和写者计数器 } while (true); do { wait(mutex); // 互斥访问写者计数器和读者计数器 writecount++; while (readcount > 0 || writecount > 1) { wait(wrt); // 等待写进程 } signal(mutex); // 释放写者计数器和读者计数器 // 写进程访问共享资源 wait(mutex); // 互斥访问写者计数器和读者计数器 writecount--; if (writecount > 0) { signal(wrt); // 释放写进程 } else { signal(rdr); // 释放读进程 } signal(mutex); // 释放写者计数器和读者计数器 } while (true); ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值