1.什么是死锁?
多个进程互相等待对方资源,在获得对方资源之前又不释放资源的现象叫死锁。一个或多个进程死锁就会导致系统死锁。
2.发生死锁的四个必要条件(缺一不可)
(1)互斥条件:每个资源每次只能被一个线程(或进程,下同)使用。即只有对必须互斥使用的资源的争抢才会发生死锁。
①如何破坏:将互斥使用的资源改造成共享使用的资源
②缺点:并不是所有的互斥使用的资源都可以改造成共享资源。反而是为了系统的安全要保护这种互斥性。因此破坏互斥条件不可行。
(2)请求和保持条件:指当一个线程(或进程)因请求资源而阻塞时,则需对已获得的资源保持不放。
①如何破坏:
破坏“请求”条件:
每个进程在运行之前,必须一次性申请完其在整个运行期间所需要的全部资源
②缺点:
- 资源利用率低:有些资源很晚才使用却一直被占用,导致其他进程无法使用该资源
- 可能出现饥饿现象:进程由于个别资源申请不到导致进程一直无法开始
破坏“保持”条件:进程在申请资源之前释放所占有的一切资源
(3)不剥夺条件(非抢占条件):指进程(或线程)已获得的资源,在未用完之前不能被强行剥夺。
①如何破坏:
- 法一:当某进程申请新的资源得不到满足时,必须立即释放保持的一切资源。,待以后需要时重新申请。
- 法二:当某进程所请求资源被其他进程占有时,可以在操作系统的协助下强行剥夺资源。
②缺点:
- 实现起来hin复杂。
- 释放已有资源会造成前一阶段的工作失效。因此法一适用于易保存和恢复状态的资源,如CPU。
- 反复申请和释放资源会增加系统开销,降低系统吞吐量。
- 法一可能导致进程饥饿。
(4)循环等待条件:若干进程(或线程)之间形成一种头尾相接的循环等待资源关系。
①如何破坏:
顺序资源分配法:给系统中的所有资源类型进行编号,规定每个进程按编号递增的顺序请求资源,同类型资源(即编号相同)一次性申请完。(ps:如果进程后面又想申请序号低的资源(比如5),那就必须把现在拥有的序号为5及其以上的资源全部释放)
②原理分析(证明):
一个进程只有已占有小编号的资源时,才有资格申请更大编号的资源。按照这种规则,拥有大编号资源的进程不可能逆向回来申请小编号资源,也就构不成“循环”条件。
也就是说进程里总有一个进程有相对的最大号资源,如果它再次申请更大号资源,则申请的资源一定没有被占用。
(借用)
3.死锁的处理:
允许死锁发生:
- 预防死锁:破坏死锁发生的四个必要条件中的一个或几个(参考上文)
- 避免死锁:(重点)银行家算法
待补充~~~`