生产者消费者问题
系统中有一组生产者进程和一组消费者进程,生产者进程每次生产一个产品放入缓冲区,消费者进程每次从缓冲区中取走一个产品并使用。
1. 互斥访问:缓冲区是临界资源,必须保证进程对其互斥地访问。
2. 同步访问:只有缓冲区有产品之后才能被消费,同时,只有缓冲区有空间时才能继续生产
如何用信号量机制实现生产者、消费者进程的这些功能?
设置三个信号量:一个互斥信号量,两个同步信号量
(实现互斥的 P 操作必须放在实现同步的 P 操作之后,否则会造成死锁,退出区的两个 V 操作可以互换)
semaphore mutex = 1;
semaphore empty = n;
semaphore full = 0;
Producer () {
while (1) {
P(empty)
P(mutex);
生产
V(mutex);
V(full)
}
}
Cunsumer () {
while (1) {
P(full)
P(mutex)
消费
V(mutex)
V(empty)
}
}
死锁
什么是死锁?
各个进程互相等待对方手里的资源,导致各个进程都阻塞,无法向前推进的现象。(对不可剥夺资源的不合理分配,可能导致死锁)
死锁产生的四个必要条件?
1. 互斥条件
2. 不剥夺条件
3. 请求和保持条件
4. 循环等待条件
预防死锁
破坏死锁产生的四个必要条件中的一个或多个。
1. 破坏互斥:允许多个进程同时访问资源
2. 破坏不剥夺:操作系统强行剥夺
3. 破坏请求和保持:一次性分配所有资源(静态分配)
4. 破坏循环等待:
避免死锁
用某种方法防止系统进入不安全状态。(银行家算法)
死锁检测
为了对系统做死锁检测,必须满足:
1. 用某种数据结构来保存资源的请求和分配信息
2. 提供一种算法,利用上述信息来检测系统是否进入死锁状态
解除死锁的方法
1. 资源剥夺法。挂起(暂时放在外存上)某些死锁进程,并抢占它的资源,将这些资源分配给其他的死锁进程。
2. 撤销进程法。强制撤销部分、甚至全部死锁进程。
3. 进程回退法。让一个或多个死锁进程回退到足以避免死锁的地步。