读写者的四种优先调度方式
2014-02-14 17:17
274 查看
读写者是一个著名的问题:
一个黑板,读者可以读取黑板上的东西,写者可以向黑板上写东西.并且有如下规则:
1.可以有多个读者同时读取黑板上的数据
2.只能有一个写者在黑板上写东西.
3.读者和写者不能同时操作黑板,即读写不能同时发生.
读者优先方法:
读者队列和写者队列,读者和写者抢夺黑板的控制权.每当读者获得黑板控制权以后就会将写者阻塞在黄线上,并且连续到来的读者可以畅通无阻的读取黑板上的数据.
而当写者获得控制权后只能用于自己,自己操作完黑板后,后续写者还是要和到来的读者竞争.这样就会造成读者优先享有黑板控制权.准确的说读者会一次获得,直到上一个读者读完黑板数据还没有读者到来,这样就会交出控制权(家族性质,维护团体权益,为后面的读者着想.).而写者就自己单干,每次执行完后都会交出控制权.
代码:
读者写者交替执行.
由于读者家族护短,总是维护自己家族的人,写者就想,我也要维护自己家族的人,即读者和写者各自都要维护后续到来的自己人.
由于读者和写者两个家族总是护短,终于有一次大大出手,最后商定,我们都不管了,让后辈自己去争吧.
就像这样,读者不会阻塞写者,写者也不阻塞读者,每一个新到来的读者和写者总是一起竞争.
代码:
由于读者家族新生一辈很强悍,打得写者家族遍历鳞伤,于是写者家族重启保护后一辈(后续到来的写者)的政策.
就像这样:
一个黑板,读者可以读取黑板上的东西,写者可以向黑板上写东西.并且有如下规则:
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); }
相关文章推荐
- 只读事务的一些概念
- Unity3d策略模式
- FW: diff between =null and is NULL in sql
- 使用ajax上传/下载文件方法
- Necklace
- 几种web报表打印方案的比较
- CentOS6.5系统挂载NTFS分区的移动硬盘
- C# 服务端编程监听IP和端口号
- [Leetcode] Candy (Java)
- LA 3989 - Ladies' Choice 稳定婚姻问题
- LA 3989 - Ladies' Choice 稳定婚姻问题
- MVC 介绍
- 调用方法说明
- OpenCore介绍
- C语言 static extern
- Android中shape详解
- android 模拟器安装apk
- struts2 select绑定数据
- 移动计算最新科研成果评述
- Linux/CentOS 开启防火墙