没有合适的资源?快使用搜索试试~ 我知道了~
15211088_王意如_操作系统第6次实验1
需积分: 0 0 下载量 183 浏览量
2022-08-08
21:44:40
上传
评论
收藏 279KB DOCX 举报
温馨提示
试读
6页
1. 实验目的:理解多进程、多线程协作时可能存在的问题,学会使用Linux的同步工具2. 实验目标: 参考课件中的伪代码,用多线程实现读者-写者和哲学家就餐两个
资源详情
资源评论
资源推荐
1. 实验目的:理解多进程、多线程协作时可能存在的问题,学会使用 Linux 的同步工具
2. 实验目标:
参考课件中的伪代码,用多线程实现读者-写者和哲学家就餐两个经典同步问题。
3. 实验原理:
3.1 哲学家就餐问题可以这样表述,假设有五位哲学家围坐在一张圆形餐桌旁,做以下两件
事情之一:吃饭,或者思考。吃东西的时候,他们就停止思考,思考的时候也停止吃东西。
餐桌中间有一大碗意大利面,每两个哲学家之间有一只餐叉。因为用一只餐叉很难吃到意大
利面,所以假设哲学家必须用两只餐叉吃东西。他们只能使用自己左右手边的那两只餐叉。
在求解该问题时,可以使用一个 state 数组跟踪每一个哲学家是在进餐,思考,还是饥饿状
态。一个哲学家只有在两个邻居都没有进餐时才允许进入进餐状态。因此可以使用一个信号
量数组,每一个信号量对应一位哲学家。在所需的叉子被占用时,该哲学家被阻塞。
因此,该问题可以总结为如下流程:
用一个信号量 mutex 维护一个同一时间只能有一个哲学家拿起或放下叉子的互斥,初始值
为 1。用一个大小为 n 的信号量数组 s 维护同步,初始值全部设为 0.
在拿起叉子前,先等待该信号量。获得该信号量后,将该哲学家的 state 即为 hungry,即等
待在合适的条件下获得信号量 s[i]的状态。
检测左右测哲学家的状态,若左右的哲学家都没有在就餐,即说明可以进入就餐状态,post
信号量 s[i]。此时哲学家进入就餐状态。可以处理下一个哲学家的拿起放下叉子操作,故 post
信号量 mutex。
若无法获得叉子,即左右的哲学家中有人在进餐,则阻塞当前哲学家,等待获得叉子。
在哲学家就餐结束后,进行放下叉子操作。具体实现需要先获得 mutex 信号量,保证互斥。
放下叉子,将哲学家 i 的状态置为 thinking。然后检查左右的哲学家有没有被阻塞的,若有
则 post 对应哲学家的信号量,使其可以进餐。
3.2 有读者和写者两组并发进程,共享一个文件,当两个或以上的读进程同时访问共享数据
时不会产生副作用,但若某个写进程和其他进程(读进程或写进程)同时访问共享数据时则
可能导致数据不一致的错误。因此要求:①允许多个读者可以同时对文件执行读操作;②只允
许一个写者往文件中写信息;③任一写者在完成写操作之前不允许其他读者或写者工作;④
写者执行写操作前,应让已有的读者和写者全部退出。
若读者需要读数据,需要先获得信号量 mutex,对 rc 进行+1 的操作。
在对 rc 加一后需要判断 rc 是否为 1,即当前读者是不是第一个读者。若是,则需要等待获
得信号量db,即需要等待当前没有写者写入时才可以读取。若不是,则继续读,并释放mutex,
以处理下一个读者或写者。
ali-12
- 粉丝: 28
- 资源: 328
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0