读者写者问题:
声明:本博客有参考王道考研的《操作系统》
核心思想:设计了一个count的计数器,判断当前进程是否为第一个/最后一个进程,从而做不同的处理。
Describe:
有一个文件F,所有读者可以对其共享阅读(同时阅读),写者不能同时写,读者和写者也不能同时进行。
分析:
两进程: 读者、写者
进程关系: 读者——读者[非互斥]、 读者——写者[互斥]、 写者——写者[互斥]
(仅供参考,欢迎指正):
①设置信号量
semaphore rw=1; //用于实现对文件的互斥访问,当前是否有进程访问文件
semaphore mutex=1; //保证读者计数器之间互斥访问
int count=0; //记录当前读者是否唯一
semaphore w=1; //用于实现“写优先”
②P、V操作
writer(){
while(true){
P(w);
P(rw); //写者先test,当前文件是否有其他进程访问
写文件...;
V(rw); //完成写操作,释放“锁”
V(w);
}
}
reader(){
while(true){
P(w);
P(mutex); //各进程互斥访问count,实现多个读者同时读取
if(count==0) //当前是否是唯一一位读者
P(rw); //首位读者负责“加锁”
①**********************************为什么要加mutex
count++; //读者人数加1
V(mutex);
V(w);
读文件...;
P(mutex); //各进程互斥访问count
count--;
if(count==0)
V(rw); //最后一个进程负责“解锁”
V(mutex);
}
}
注释:
①当第一个读者进行互斥加锁后,第二个读者再P(rw)处进入,此时count还是0,又执行P(rw)加锁,这样后者无法与第一个读者共同读操作,必须等第一位结束。加上mutex后可以在第一位读者进行完加锁(count 0---->1)之后再进行读就可以同时进行了。因为count成了1,后者不需要再次P(rw).
总结:
1、“读写公平法”关于“写优先”的一点解释:写优先也是先来先服务原则,当读者1在读时,写者1等其完成后可进行读,如果此时来了读者2并且没有
w控制,那么读者2会插队到写者1前面;这样如果加入w,就是可以保证在写者1工作完后读者2再来读操作。
2、难点:
第一位读者要加锁:不允许其他写者访问
最后一位读者要解锁:允许其他写者访问
而且,读者之间可以同时读操作
说明:如有错误欢迎指正