进程互斥与同步
当遇到既有互斥,也有同步问题时,可以按照以下思路来分析。
(1)首先分析是什么类型的题:纯互斥、纯同步、还是同步和互斥并存。
(2)同步+互斥题,先做同步,后做互斥。
(3)分析存在几个运行主体。
(4)站在每个运行主体的角度思考:它需要申请什么资源(条件)、释放什么资源(结果)。
(5)分析同步信号量的初值。
(6)再做互斥/纯互斥题:找到临界区(临界资源),完成互斥。
实例:苹果橘子问题
桌子上有一只盘子,最多可容纳两个水果,每次只能放入或取出一个水果。爸爸专向盘子中放苹果,妈妈专向盘子中放橘子,儿子专等吃盘子中的橘子,女儿专等吃盘子中的苹果。用PV描述以上过程。
实例:奇偶数缓冲区问题
三个进程P1、P2、P3互斥使用一个包含N个单元的缓冲区:
P1每次用produce()生成一个正整数并用put()送入缓冲区某一空单元
P2每次用getodd()从该缓冲区中取出一个奇数并用countodd()统计奇数个数
P3每次用geteven()从该缓冲区中取出一个偶数并用counteven()统计偶数个数
请用信号量机制实现这三个进程的同步与互斥活动,并说明所定义的信号量的含义,要求用伪代码描述。
实例:仓库入库问题
有一个仓库可以存放A和B两种产品,要求:(1)每次只能存入一个产品(A或B)(2)-N<A产品数量 - B产品数量<M(N和M是正整数)。试用P、V操作描述产品A与B的入库过程。
实例:理发师问题
某个理发店有n个椅子,当没有顾客时,理发师去睡觉。如果有顾客进来时,理发师正在睡觉,这个顾客会叫醒他,如果没有椅子,顾客直接离开。试用P、V操作描述以上过程。
本节资料

