-----------------------------
- 涉及内容:
- 2020/11/2
- 识记读者-写者特征:
- 1. 资源占用
- 2. 改变资源,即写入信息
- 3. 不会改变资源,仅读取信息,不做其他操作
- 4. 组团的方式
经典问题
题目描述如下:
有读者和写者两组进程,共享一个文件,当两个或以上的读进程同时访问共享数据时不会产生副作用,但若某个写进程和其他进程(读进程或写进程)同时访问
共享数据时则可能导致数据不一致的错误。因此要求:① 允许多个读者同时对文件执行读操作;
② 只允许一个写者往文件中写信息;
③ 任一写者在完成操作之前不允许其他读者或写者工作;
④ 写者执行写操作前,应让已有的读者和写者全部推出
- 应该了解内容:
- 同步关系:进程之间存在依赖关系,即一个进程的执行需要依赖与其他进程的消息或者信号,从而唤醒该进程
- 互斥关系:进程之间共享资源,但同一时刻只能有一个进程能够获取到资源,其他进程则需等待
- p : 表示申请一个资源
- v : 表示释放一个资源
- 析:读者与写者之间对于文件的访问属于互斥关系,写者与写者之间也是互斥关系。而读者与读者之间不存在互斥,
但是读者需要时刻清点人数(作用:清楚知道有多少读者在阅读文件,当最后一个读者离开的时候就需要释放互斥信号量),
这里需要设置互斥信号量,因为当两个读者刚好同一时刻阅读时,需要可能造成人数混乱,所以需要设置互斥(同一时刻清点一个读者,
若同时有多个想要阅读时,也只能先允许一个读者阅读,记录人数之后,就放下一个读者进行阅读,,,)
同时,当读者在读文件时,写者不能进行写操作。读者一直读文件,那么会造成写者一直在等待,陷入饥饿甚至饿死的情况,
可以使用写进程优先解决,下方参数说明解释
需要区分题目中的多个读进程同时访问与分析中的同一时刻读者互斥,两者并不冲突,下一时刻又有一个读者进行文件阅读,
此时文件内同时有两个进程在读文件
- 参数说明:
- rmutex:读者之间的互斥信号量,表示同一时刻只能允许一个读者进入文件进程读文件
- wr:写者与读者之间的互斥信号量
- wmutex:写者优先信号量,即发出一个请求,有写者需要进行写操作,让想进入文件的读者处于等待状态,然后只需要等文件里的读者完成任务
之后就可先执行写者任务
- count:计数器,用于清点读者个数
semaphore rmutex = 1 , wmutex = 1 , wr = 1;
int count = 0;
writer(){
while(1) {
p(wmutex); // 发出写者信号量
p(wr);
writing;
v(wr);
v(wmutex);
}
}
reader () {
while(1) {
p(wmutex); // 检查是否有写者在请求写操作
p(rmutex);
if(count==0) // 此处的作用是用于检查自己是否是第一个读者,因为文件可同时被多个读进程访问,所以只要第一个请求进入文件即可,后面的人数直接++
p(wr);
count++;
v(rmutex);
reading;
p(rmutex);
count--;
if(count==0) // 检查自己是否是最后一个读者,若是,则释放互斥信号
v(wr);
v(rmutex);
consume the item;
}
}
to be continued...
--------------------
不断修正,不断笔记,能力有限,若有不妥之处,望不吝指教。
-----------------------------------------------------------------------