操作系统(第四章 进程同步、管程、死锁)
操作系统
一、进程同步、互斥
1. 进程同步
2. 进程互斥
为了实现对临界资源的互斥访问,同时保证系统整体性能,遵循以下原则:
- 空闲让进。临界区空闲时,可以允许一个请求进入临界区的进程立即进入临界区
- 忙则等待。当已有进程进入临界区时,其他试图进入临界区的进程必须等待
- 有限等待。对请求访问的进程,应保证能在有限时间内进入临界区(保证不会饥饿)
- 让权等待。当进程不能进入临界区,应立即释放处理机,防止进程忙等待
3. 进程互斥(对临界资源的访问)的三种实现方法
(1) 进程互斥的软件实现方法
- 如果没有注意互斥
(2) 进程互斥的硬件实现
(3)在操作系统或程序设计语言实现某种级别的支持(具体方法在 三、)
二、锁
三、信号量机制
1. 信号量机制
2. 用信号量机制实现进程互斥、同步、前驱关系
3. 进程同步互斥问题
(1)生产者-消费者问题
系统中有一组生产者进程和一组消费者进程,生产者进程每次生产一个产品放入缓冲区,消费者进程每次从缓冲区中取出一个产品并使用。(注:这里的“产品”理解为某种数据)
生产者、消费者共享一个初始为空,大小为 n 的缓冲区
只有缓冲区投满时,生产者才能把产品放入缓冲区,否则必须等待
- 代码实现:
?P、V操作顺序能否更改
若先执行3,对资源上了锁之后执行4,
此时会卡在4,被阻塞
此时切换回生产者,执行1,
但资源被消费者上锁并未解锁,所以生产者也被阻塞
总结:
实现互斥的P一定要在实现同步的P之后
V的顺序可以调换
但最好把PV的范围控制较小
(2)多生产者-多消费者问题
- 代码实现:
(3)吸烟者问题
- 代码实现:
(4)读者-写者问题
- 代码实现:
问题:对于count变量的检查和赋值无法一气呵成(设置另一个互斥信号)
潜在问题:只要有读进程还在继续,写进程就会一直阻塞,可能饿死
(5)哲学家进餐问题
- 代码实现:
1)
2)
3)