产生原因
1.竞争不可剥夺资源(打印机和扫描机)
2.推进顺序不当
必要条件
互斥条件:一个资源一次只能给一个进程使用
不可剥夺条件:资源申请者不能强行从资源占有者的手中剥夺出去,资源只能由资源占有者主动释放。
请求和保持条件:在申请新的资源的同时保持对原有资源的占有。
循环等待条件:存在一个进程等待资源环形链(哲学家进餐问题)
死锁的预防
1.破坏互斥条件
2.破坏不可剥夺条件:在允许动态申请资源的情况下,如果一个进程申请新的资源不能立刻满足,而变为阻塞状态之前,会释放自己已经申请到的资源
3.破坏请求和保持条件:资源进行静态预分配。在运行前,一次性将其所需要的所有资源分配给该进程。这样该进程在整个运行期间,便不再提出资源要求,从而摒弃了请求条件。
【优点】:简单、易于实现且很安全
【缺点】:资源利用率很低,进程也会延迟运行
4.破坏循环等待条件: 把系统中的全部资源分别分给一个特定的序号,并且要求每个进程均应严格地按照序号递增的次序请求资源,否则操作系统不予分配。
【优点】: 基于动态分配方法,资源利用率较前提高。
【关键】: 小心安排资源序号
【问题】:
(1)各类资源序号一经安排,不宜经常地随意改动;
(2)资源序号尽可能反映多数作业的实际使用资源的顺序,但总有不合适的作业而造成资源浪费
死锁的避免和解除
死锁地避免:允许进程动态地申请资源,系统在进行资源分配之前,先计算资源分配的安全性。(银行家算法)
死锁的解除:检测到当前系统发生死锁的时候,并采取一些措施解除死锁。
典型例子
哲学家进餐问题
有五个哲学家,他们的生活方式是交替地进行思考和进餐。他们共用一张圆桌,分别坐在五张椅子上。
在圆桌上有五个碗和五支筷子,平时一个哲学家进行思考,饥饿时便试图取用其左、右最靠近他的筷子,只有在他拿到两支筷子时才能进餐。进餐完毕,放下筷子又继续思考。
死锁状况: 当五个哲学家都试图去取同一侧的筷子的时候,五个哲学家每个人都取到了一只筷子,都在等待另一只筷子,会因为循环等待而造成死锁
解决方式
方法一(破坏循环等待条件):
最多只允许四个哲学家同时取筷子,那么就至少会有一个哲学家可以拿到筷子,当其用晚餐之后就会释放两只筷子其余的哲学家就可以进餐了。
方法二(破坏不可剥夺条件):
只有哲学家同时拿到左右两只筷子的时候才允许进餐,如果没有办法同时拿到两只筷子,那么就要立刻释放手中持有的资源
方法三(破坏请求和保持条件):
资源进行静态预分配,奇数号的哲学家必须先拿起左手边的筷子,才允许去拿右手边的,偶数号的则相反。