读写者问题之读者优先

  1. process Reader(void)  
  2. {  
  3.     while(1)  
  4.     {  
  5.         P(mutex);  
  6.         ReadCnt++;  
  7.         if(1 == ReadCnt)  
  8.         P(w);  
  9.         V(mutex);  
  10.         /*对数据集进行读操作*/  
  11.         P(mutex);  
  12.         ReadCnt--;  
  13.         if(0 == ReadCnt)  
  14.             V(w);  
  15.         V(mutex);  
  16.     }  
  17. }  
  18. process Writer(void)  
  19. {  
  20.     while(1)  
  21.     {  
  22.         P(w);  
  23.         /*对数据集进行写操作*/  
  24.         V(w);  
  25.     }  
  26. 对于一开始对读进程计数器进行加锁,防止其他读进程访问的原因是:
  27. 因为读进程的第一个和最后i一个十分重要,第一个读进程要阻塞写进程操作,需要跟写进程去抢占资源
  28. 而最后一个读进程需要释放跟写进程抢来的资源
  29. 如果第一个写进程刚刚执行完r++操作,还没来得及判断,这时第二个写进程也执行了这句操作
  30. 那么就无法判断出这是一个第一个读进程操作
  31. 而并不是说读进程之间不能同时进行,当 第一个进程执行完 V(mutex),准备去执行读操作是,第二个进程拿到这个计数器资源,计数器增加然后释放之后,第二个进程也可以进行读操作,而此时可以跟第一个读操作同时进行,于此,释放了锁资源,第三个进程也可以继续进行读操作

读者优先:
1.写者、读者互斥访问文件资源。
2.多个读者可以同时访问文件资源。

3.只允许一个写者访问文件资源。

为了防止写进程一直在阻塞

产生了写着优先:

上述条件没有发生改变:还是读写互斥,可以多个读者访问资源,只能一个读者访问

多的是:只要有一个写者想要去访问,不管是读者已经在进行还是跟读者正在抢占资源,一定是写着优先

读者正在读,也会先等会,让写着先去写

在读者优先算法中还没有出现读者的优先级一定高于写着,只是两者公平的去抢占资源,只是读者读者之间可以同时进行,只有当读者为0之后,才能使写着工作,读者优先体现在:一旦一个读者抢到资源,对于第二个读者来说,它不需要在执行p(mutex)资源的抢占了,这个资源对他来说就是开放的,他可以源源不断地进行读操作,直到最后一个读操作才有放出资源的权力,等于是写操作一直等着所有的读操作完成

但是在第一个资源抢占的过程中,并不存在谁的优先级比较高。

但是这里直接加入了写者优先级比较高,首先,读抢资源抢占不过写,其次,读的过程中有可能被阻塞。直到所有写着都完成,读者才有机会去读





猜你喜欢

转载自blog.csdn.net/chengchaonan/article/details/80798649