您的位置:首页 > 其它

读写者的四种优先调度方式

2014-02-14 17:17 274 查看
读写者是一个著名的问题:

一个黑板,读者可以读取黑板上的东西,写者可以向黑板上写东西.并且有如下规则:
1.可以有多个读者同时读取黑板上的数据
2.只能有一个写者在黑板上写东西.
3.读者和写者不能同时操作黑板,即读写不能同时发生.

读者优先方法:



读者队列和写者队列,读者和写者抢夺黑板的控制权.每当读者获得黑板控制权以后就会将写者阻塞在黄线上,并且连续到来的读者可以畅通无阻的读取黑板上的数据.

而当写者获得控制权后只能用于自己,自己操作完黑板后,后续写者还是要和到来的读者竞争.这样就会造成读者优先享有黑板控制权.准确的说读者会一次获得,直到上一个读者读完黑板数据还没有读者到来,这样就会交出控制权(家族性质,维护团体权益,为后面的读者着想.).而写者就自己单干,每次执行完后都会交出控制权.
代码:

reader(){
p(rmutex);
r++;
if(r==1) p(ws);//1
v(rmutex);

读取数据;

p(rmutex);
r++;
if(r==0) v(ws);
v(rmutex);
}
write (){
p(ws)
写;
v(ws)

}

读者写者交替执行.

由于读者家族护短,总是维护自己家族的人,写者就想,我也要维护自己家族的人,即读者和写者各自都要维护后续到来的自己人.



reader(){
p(rs)
p(rmutex);
r++;
//维护读者家族,阻塞写者家族
if(r==1) p(ws);//1
v(rmutex);
v(rs)

读取数据;

p(rmutex);
r--;
if(r==0) v(ws);
v(rmutex);
}
write (){
p(wmutex);
w++;
//维护写者家族,阻塞读者家族
if(w==1) p(rs);
v(wmutex);

p(ws)
写数据;
v(ws)

p(wmutex);
w--;
if(w==0) v(rs);
v(wmutex);
}

由于读者和写者两个家族总是护短,终于有一次大大出手,最后商定,我们都不管了,让后辈自己去争吧.

就像这样,读者不会阻塞写者,写者也不阻塞读者,每一个新到来的读者和写者总是一起竞争.



代码:
reader(){
p(s)
p(rmutex);
r++;
//写者和读者不能同时存在
if(r==1) p(ws);//1
v(rmutex);
v(s)

读取数据;

p(rmutex);
r++;
if(r==0) v(ws);
v(rmutex);
}
reader(){
p(s)
p(wmutex);
w++;
//写者和读者不能同时存在
if(r==1) p(rs);//1
v(wmutex);
v(s)

p(ws)
写数据;
v(ws)

p(wmutex);
w++;
if(w==0) v(rs);
v(wmutex);
}


由于读者家族新生一辈很强悍,打得写者家族遍历鳞伤,于是写者家族重启保护后一辈(后续到来的写者)的政策.
就像这样:



reader(){
p(s)
p(rmutex);
r++;
//写者和读者不能同时存在
if(r==1) p(ws);//1
v(rmutex);
v(s)

读取数据;

p(rmutex);
r++;
if(r==0) v(ws);
v(rmutex);
}


writer(){
p(wmutex);
w++;
//维护读者家族,阻塞写者家族
if(r==1) p(s);//1
v(wmutex);

p(ws)
写数据;
v(ws)

p(wmutex);
w++;
if(w==0) v(s);
v(wmutex);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: