2.3 进程管理(经典进程同步问题)
互斥:
P
临界资源
V
同步:
前置事件
V
P
后置事件
一、生产者-消费者问题
系统中有一组生产者进程和一组消费者进程,生产者进程每次生产一个产品放入缓冲区,消费者进程每次从缓冲区中取出一个产品并使用;
生产者、消费者共享一个初始为空、大小为n的缓冲区;
只有缓冲区没满时,生产者才能把产品放入缓冲区,否则必须等待;
只有缓冲区不空时,消费者才能从中取出产品,否则必须等待;
缓冲区是临界资源,各进程必须互斥地访问。
1、分析关系
生产者和消费者访问缓冲区是互斥的;
生产者和消费者的工作需要同步,即生产完成之后才能消费。
2、设置信号量
3、实际代码
实现互斥的P操作一定要在实现同步的P操作之后
两个V操作可以交换顺序
二、多生产者-多消费者问题
有父亲、母亲、儿子、女儿四人,其中:
父亲往盘子中放苹果;
母亲往盘子中放橘子;
女儿从盘子中拿苹果;
儿子从盘子中拿橘子;
只有盘子空时才能放水果;
只有有需要的水果时才能拿水果。
1、分析关系
互斥
对盘子的访问是互斥的
同步
父亲放入苹果后,女儿才能拿苹果
母亲放入橘子后,儿子才能拿橘子
盘子为空时才能放水果
2、设置信号量
3、实际代码
由于本问题缓冲区为1,可以考虑不设置信号量。
三、吸烟者问题
系统中有一个供应者和三个吸烟者,吸烟者吸烟需要自己卷烟,其中
卷烟需要烟草、纸、胶水三种材料
每个吸烟者各有其中的一种材料
供应者每次会提供其中两种材料,并由缺少该材料的吸烟者拿取
吸烟者制作完烟并抽掉后,发出信号,供应者放下一组物品
1、分析关系
可以将桌子视为容量为1的缓冲区,并且将两种材料分别视为三种组合:
组合一:纸+胶水
组合二:烟草+胶水
组合三:烟草+纸
互斥
对桌子的访问需要互斥进行
同步
桌上有组合一,第一个抽烟者取走物品
桌上有组合二,第二个抽烟者取走物品
桌上有组合三,第三个抽烟者取走物品
发出完成信号后,供应者将下一个组合放到桌上
2、信号量设置
3、实际代码
四、读者-写者问题
有读者和写者两组并发进程,共享一个文件。要求:
读者可以同时读取文件;
同一时间只能有一个写者进行写操作;
任一写着完成写操作之前不允许其他进程进行读或写操作;
写者执行写操作前,应让其他读者和写者全部退出。
1、关系分析
互斥
写进程和写进程之间
写进程和读进程之间
2、信号量设置
然而,以上信号量设置有可能导致饿死,具体如下代码一所示,因此,增加一个信号量
3、实际代码
以上代码存在饿死现象,即一直有读进程占用,写进程始终无法运行
因此,引入了“写优先”的信号量:
当然,这种实际上是各个读、写进程之间公平运行,并不是准确的写优先。
五、哲学家进餐问题
在一个桌子上,有5位哲学家,其中
每位哲学家之间摆着一根筷子,共计5根
哲学家平时在思考人生,饿了就会尝试拿起左右手的筷子(一根一根的拿)
如果筷子在别人手上,则等待
拿起了两根筷子时,哲学家开始进食
用餐完毕后放下筷子继续思考
1、关系分析
设计有三种思路来防止死锁:
将拿左右筷子的动作整体设为互斥操作
最多只允许四个人拿筷子
只允许奇数号的哲学家拿起左边的筷子;偶数号的哲学家拿起右边的筷子
2、信号量设置
3、实际代码
实现了只有当左右手筷子都可用时才拿起筷子
最后更新于