读写优先问题

关于读写问题的

读优先

代码如下:

Mutex  WR =1;
Mutex  CountMutex =1;
int   count=0;
//首先编写write的大概框架;
void write(){
  //由于读写以及写写之间需要互斥,所以使用WR隔离;
  //保证了写与写以及读与写之间的互斥; 
  P(WR);
  write operation;
  V(WR);  
}
// read的大概框架如下,其中为了保证读与读之间不互斥,而读与写之间互斥
// 主要通过记录当前读者的个数;
void read(){
  P(CountMutex);
  if(count==0)//表明当前是第一个读者,需要获得读写锁
  P(WR);
 count++;//在获取之后需要++表明已经有读写获取读写锁,并且变量操作要互斥                                         
 V(CountMutex);
 read();
 P(CountMutex);
 count--;        
 if(count==0)//在当前没有读者的时候,需要释放资源
 V(WR);
 V(CountMutex);
}//以上的编写需要注意读者何时取得资源与何时释放资源,以上的写法只是为了读与读之间可以并行的进行读操作,而在进行读操作时可以与写隔离;

//上面的编写仍然存在一个问题就是,在写操作进行时候,如果此时如果有写者先等待资源,这个时候如果同时有读者等待资源,这样并不能保证读者优先执行,所以为了保证绝对的读者优先,需要让用一个互斥量让后续的写者排队;
额外定义:
Mutex QueMutex=1;
因此写者可以这样写:
void write(){
  //由于读写以及写写之间需要互斥,所以使用WR隔离;
  //保证了写与写以及读与写之间的互斥; 
  P(QueMutex);//这样保证了一旦有写者执行后面的写进程会等待队列资源而不是读写资源,保证了读操作的绝对优先;
  P(WR);
  write operation;
  V(WR);  
  V(QueMutex);
}

写优先

写优先需要注意,如果有读写进程同时在等待,需要优先执行写;结合上面的读优先,可以先把框架搭好;

Mutex WR =1;  //读写资源;
Mutex RCountMutex =1;
Mutex WCountMutex =1;
Mutex QueMutex =1;
int   WCount = 0;
int   RCount = 0;

void write(){   //模仿之前的读者写,但是注意谢谢之间还是互斥的;
  P(WCountMutex);
  if(WCount==0)
     P(QueMutex);//先获得排队资源;保证一旦有写者在,后面的写者                     
  WCount++;      //就不需要排队了;
  V(WCountMutex);  

  P(WR); //进行读写资源互斥
  write operation;
  V(WR);

  P(WCountMutex);
  WCount--;
  if(WCount==0)
    V(QueMutex);
  V(WCountMutex); 
}
//先把最基本的框架写好;
void read( ){
  P(RCountMutex); 
  if(RCount==0)
    P(WR);
  RCount++;
  V(RCountMutex);      

  read operation;

  P(RCountMutex); 
  RCount--;
  if(Rcount==0)
    P(WR);
  V(RcountMutex);  
}
//接下来考虑如果读写进程同时排队如何保证写进程优先获得资源;
就像写者那样,读者也需要排队,需要保证如下两点:

1.读进程如果正在执行,此时如果一旦有写进程在等待,则优先执行写;
2.写进程如果在执行,后面的写不需要排队直接等待读写资源;
read改造如下:
额外声明: Mutex TempMutex =1;

void read( ){
  P(TempMutex);//保证有且仅有一个读者在等待队列资源,其余的卡在了这个互斥量上
  P(QueMutex); //保证在等待队列资源;
  P(RCountMutex); 
  if(RCount==0)
    P(WR);
  RCount++;
  V(RCountMutex);
  V(QueMutex);
  V(TempMutex);

  read operation;

  P(RCountMutex); 
  RCount--;
  if(Rcount==0)
    P(WR);
  V(RcountMutex);  
}

//用信号量做写优先的问题的时候,读需要好好斟酌一下,这里面为了保证绝对的优先级,在读者上做的事情与 读优先时所做的事情一致!

关于公平读写 ,也是利用了排队的思想,很简单这里不再赘述,如有任何问题欢迎批评指正,以上均为伪代码,注重的是逻辑,你也可以通过pthread等一些线程库进行实际的编写。

只要你脑子有相应的逻辑,代码的编写自然水到渠成!

你可能感兴趣的:(操作系统课件)