经典同步问题(哲学家进餐等)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
问题分析
同步问题描述: ● 当缓存满时,生产者必须等消费者从缓 存取走产品。设同步信号量为empty,其 初值为?。 ● 当缓存空时,消费者必须等生产者 放产品至缓存。设同步信号量为full,其初 值为?。
问题分析
互斥问题描述: ● 将有界缓存视为临界资源。由于两个进 程都要访问缓冲区,但是无论是生产者进 程向缓冲区放入产品,还是消费者进程从 缓冲区取走产品,都不能同时进行。所以, 两个进程访问缓冲区必须互斥地执行。 ● 设互斥信号量mutex的初始值为1, 以实现两进程对缓冲区访问的互斥。
问题分析
所以,为了实现生产者进程和消费者进 程的同步与互斥,设置三个信号量:
两个同步信号量empty和full, 一个互斥信号量mutex,
并在这三个信号量上施加正确的P、V 操作,就可保障两进程正确无误地运行。
思考
• (1)若将两个P操作互换位置,结果如何? • (2)若将两个V操作互换位置,结果又如
4
而5号没有人
与他竞争,若得4号在与3号的竞 到左边的筷争中没有得到筷子,
子 则5号得到4号筷子,
进餐
1
无论4号5号谁 得到4号筷子,都 有一个可以进餐
2 哲学家3号
若4号在与3号 的竞争中得到 哲学筷家4号子,则与5号 竞争4号筷子.
问题提出
某数据库有一个写进程、多个读进程, 它们之间读、写操作的互斥要求是:写进 程运行时,其他读、写进程不能对数据库 进行操作。读进程之间不互斥,可以同时 读数据库。请用信号量及PV操作描述这一 组进程的工作过程。
解题步骤
• (2)确定互斥信号量的个数、含义 • (3)用P、V操作描述关系
问题提出
有5个哲学家他们围坐在一张圆桌旁,每 人面前有一菜盘,各菜盘之间有一根筷子。
每个哲学家或思考问题或就餐,当思考 问题时放下筷子,饥饿的时候就吃菜。
想要夹菜时必须获得两根筷子,且每人 只能从自己的左边和右边去取筷子,只有 在他拿到两只筷子时才能进餐。就餐后放 下筷子以供别人使用,自己继续思考问题。
问题提出
设有4个哲学家围坐在一张圆桌前讨论 问题和进餐。在在讨论时每人手中什么都 不拿,当需要进餐时,每人需要用刀和叉 各一把。餐桌上的布置如图所示,共有两 把刀和两把叉,每把刀或叉供相邻的两个 人使用。
请用信号量及PV操作说明4位哲学家的 同步过程。
问题分析和解题步骤
• (1)确定进程的 个数及其工作内容
此时5号条件满 足,可在下一时 钟周期拿左筷子
哲学家5号
此时4号条件 不再满足,放
下筷子.
3号开始进餐, 同时1号放下 右边的筷子
哲学家3号
哲学家4号
1号放下左边筷 子的同时,3号 可拿起右边筷
子
哲学家1号
哲学家2号
这种方法将出现1,2
号哲学家单键1号筷
子,3,4号哲学家竞争
5
3号筷子的情况.
哲学家5号
对于写进程与读进程、写进程与写进程来说,数据库 是临界资源,一次只能被一个进程使用。所以设置 wmutex为互斥信号量,其初值为“1”。
所以,本题有两个临界资源:共享变量count和数据库, 对它们要实施互斥操作。
• (3)用类C语言描述同步关系。
课堂习题
三个进程P1,P2,P3协作解决文件打 印问题,P1将文件记录从磁盘读入内存的 缓冲区1,每执行一次读一个记录;P2将缓 冲区1的内容取出放到缓冲区2中;P3将缓 冲区2的内容打印出来,每执行一次打印一 个记录。缓冲区的大小和一个记录大小一 样。
解题步骤
• (1)确定进程的个数及工作。本题只有读写两类进程, 各自的工作如图所示。
• (2)确定信号量的个数、含义及PV操作。 本题应当设置2个信号量和1个共享变量:countwk.baidu.com共享
变量,记录当前正在读数据库的进程数目;
rmutex为读互斥信号量,使进程互斥地访问共享变量 count,其初值为1;
哲学家 筷子 盘子
哲学家5号
哲学家1号
哲学家2号
1 5
2 哲学家3号
4 3
哲学家4号
先拿左,拿到后再 拿右,成功后进餐. 吃完后先放左再放 右.虽可保证不会 有相邻的同时进餐, 但可能死锁,如动
画所示.
5
哲学家5号
哲学家1号 1
哲学家2号 2
哲学家3号
此时没有一个哲学
4
家可以完成进餐.
3
哲学家4号
问题分析
本题涉及对同一个数据库的读写操作。当多个 进程对其读时,因不改变其中的数值,可以不加 限制。当既有的读进程,又有写进程时,应加以 限制。此时,数据库就是一个临界资源,读写进 程必须对其进行互斥操作。
因为写进程执行时,不能执行其他读写进程, 所以还必须设置一个计数器统计读进程的个数。 如果是第一个读进程,就与写进程竞争数据库。 如果是最后一个读进程,就释放数据库。因计数 器是一个临界资源,所以多个读进程对计数器的 操作又是互斥操作。 这是一个互斥问题,也是典型的读者和写者问题。
1号哲学家 开始进餐,完 成后放下筷 子,其它哲学5 家开始进餐
哲学家5号
哲学家1号 1
哲学家2号 2
哲学家3号
4
此时5号哲学家被 禁止拿筷子.1号哲
学家拿起他右边即 5号哲学家左边的
3 哲学家4号
设1号进餐,则 3,4两位哲学 家可以拿筷子
1号进餐完毕, 哲放学家下1号筷子,先
左后右.
哲学家2号
何?
应注意的问题(总结)
(1) 在每个程序中必须先做P(mutex) 后做V(mutex),二者要成对出现。
(2) 对同步信号量full和empty的P、V 操作同样必须成对出现,但它们分别位于 不同进程的代码中。
(3) 无论在生产者进程中还是在消费者 进程中,两个P操作的次序都不能颠倒。应 先执行同步信号量的P操作,再执行互斥信 号量的P操作;否则可能造成进程死锁
解决方法
• (1)至多只允许有4位哲学家同时去拿左边的筷 子,最终能保证至少有一位哲学家能够进餐,并 在用毕时能释放出他用过的两只筷子,从而使更 多的哲学家能够进餐。
• (2)仅当哲学家的左、右两只筷子均可用时,才 允许他拿起筷子进餐。
• (3)规定奇数号哲学家先拿他左边的筷子,然后 再去拿右边的筷子;而偶数号哲学家则相反。最 后总会有一位哲学家能获得两只筷子而进餐。
模型分析
• (1)生产者进行生产将物品放入仓库,同一时 间只能有一个生产者将物品放入仓库,若仓库满, 生产者将等待;
• (2)消费者从仓库中取出物品,同一时间只能 有一个消费者取出物品,若仓库空,消费者等待;
• (3)生产者将物品放入仓库时消费者不能同时 取;
• (4)消费者取物品时生产者不能放入物品。