作者:明明如月学长, CSDN 博客专家,大厂高级 Java 工程师,《性能优化方法论》作者、《解锁大厂思维:剖析《阿里巴巴Java开发手册》》、《再学经典:《Effective Java》独家解析》专栏作者。
一、AI 讲解
死锁产生的四大条件
死锁是指多个进程在运行过程中因争夺资源而造成的一种僵局。要发生死锁,以下四个条件必须同时满足:
| |
---|
| |
| |
| 已经分配给一个进程的资源,在未使用完之前,不能强行剥夺。 |
| 存在一种进程资源的循环等待链,每个进程持有下一个进程所需要的至少一个资源。 |
死锁的预防
预防死锁的策略是通过破坏死锁的四个必要条件中的一个或多个来实现的:
| |
---|
| |
| 在进程启动时请求所有必需的资源,避免在运行中请求。 |
| 如果一个已经持有资源的进程请求新的资源并且不能立即得到,它必须释放已占有的资源。 |
| |
死锁的避免
死锁避免是指系统在资源分配过程中避免进入不安全状态,从而避免死锁。主要有两种方法:
有序资源分配法
- 将系统中的所有资源类型按照一定的顺序编号。
- 所有进程必须严格按照编号顺序请求资源。
- 这种方法破坏了循环等待条件。
银行家算法
- 类似于银行贷款系统,系统对每个进程提出的最大资源需求量进行了解。
- 当一个进程请求资源时,系统判断分配资源后是否还处于安全状态,只有在安全状态下才分配资源。
- 银行家算法可以确保系统处于安全状态,避免死锁。
银行家算法,听起来是不是有点像银行家在做财务决策时的一种算法呢?这其实是一个用于计算机操作系统中避免死锁(Deadlock)的著名算法。我们可以通过一个简化的银行放贷的例子来理解它。
想象一下,有一个小镇上的银行,这个银行有限的资金用于放贷给镇上的商人。银行家,也就是银行的负责人,必须确保银行不会因为放出过多的贷款而破产,同时也要尽量满足每个商人的贷款需求。为了做到这一点,银行家会采用一种策略:在放贷前,先计算放贷后银行的资金状况,确保即使所有商人突然都来要求最大额度的贷款,银行也不会资不抵债。
在计算机操作系统中,银行家算法的作用类似。系统资源(比如内存、CPU时间)是有限的,多个程序(我们可以把它们想象成镇上的商人)同时运行时会请求这些资源。操作系统(银行家)必须决定如何分配有限的资源给这些程序,以避免发生死锁(就像确保银行不会破产一样)。
具体来说,银行家算法遵循以下几个步骤来避免死锁:
- 初始状态:系统了解每个程序可能需要的最大资源数量,以及系统目前可用的资源数量。
- 请求资源:程序在运行时会请求所需的资源。如果请求的资源数量超过了该程序之前声明的最大需求,系统会拒绝分配资源(因为这违背了事先的约定)。
- 检查安全性:在分配资源之前,系统会模拟资源分配后的状态,确保此次资源分配后,系统仍然处于一个“安全状态”。安全状态意味着系统能够按某种顺序满足所有程序的最大资源需求,而不会导致死锁。
- 资源分配:如果判断系统分配资源后仍然处于安全状态,那么系统就会分配资源给请求的程序。否则,请求会被暂时挂起,直到系统能够安全地分配资源。
通过这种方式,银行家算法能够有效地避免系统资源的不当分配导致的死锁问题。简单来说,就像一个谨慎的银行家,它通过预测和规划,确保了系统的健康运行,避免了“财务危机”。
二、AI 出题
(1)题目
- 死锁的哪个条件指出至少要有一个资源必须是不可共享的?
- A. 互斥条件
- B. 请求与保持条件
- C. 不可剥夺条件
- D. 循环等待条件
- 预防死锁的策略之一是要求进程启动时请求所有必需的资源,这破坏了哪个死锁条件?
- A. 互斥条件
- B. 请求与保持条件
- C. 不可剥夺条件
- D. 循环等待条件
- 下列哪种方法不是死锁避免的策略?
- A. 有序资源分配法
- B. 银行家算法
- C. 预先分配所有资源
- D. 分配最少资源
- 在银行家算法中,如果一个进程的资源请求会导致系统进入不安全状态,则该请求:
- A. 会被立即满足
- B. 不会被满足
- C. 会被部分满足
- D. 会被延迟满足
- 破坏循环等待条件可以通过哪种方式实现?
- A. 允许进程动态请求资源
- B. 将所有资源编号,强制进程按顺序申请资源
- C. 允许资源被剥夺并分配给其他进程
- D. 增加资源数量
- 死锁发生的四个必要条件不包括下列哪项?
- A. 互斥条件
- B. 并发条件
- C. 请求与保持条件
- D. 循环等待条件
- 哪个策略是通过允许系统在运行时剥夺进程资源来预防死锁的?
- A. 有序资源分配法
- B. 银行家算法
- C. 请求与保持条件破坏法
- D. 不可剥夺条件破坏法
- 在有序资源分配法中,如果进程P1占有资源3,想要申请资源2,系统应该如何处理?
- A. 分配资源2给P1
- B. 强制P1释放资源3后才能申请资源2
- C. 直接拒绝P1的请求
- D. 允许P1保留资源3并申请资源2
- 如果一个系统使用银行家算法避免死锁,那么在分配资源时必须确保:
- A. 所有进程按顺序申请资源
- B. 进程可以随时请求资源
- C. 分配后系统处于安全状态
- D. 所有资源都不会被完全占用
- 破坏请求与保持条件可能会导致的问题是:
(2)答案和解析
- 答案:A。互斥条件是指每个资源要么已分配给一个进程,要么就是可用的,表明资源不可共享。
- 答案:B。通过在进程启动时就请求所有必需的资源,可以破坏请求与保持条件,避免进程在运行中再请求资源。
- 答案:C。预先分配所有资源是预防死锁的策略,而不是避免死锁的策略。
- 答案:B。根据银行家算法,如果一个进程的请求导致系统进入不安全状态,该请求不会被满足。
- 答案:B。通过将所有资源编号并强制进程按顺序申请资源,可以破坏循环等待条件。
- 答案:B。并发条件不是死锁发生的必要条件之一。
- 答案:D。通过允许系统剥夺进程的资源并重新分配,可以破坏不可剥夺条件。
- 答案:B。在有序资源分配法中,进程必须按照资源编号顺序申请资源,因此系统应强制P1释放资源3后才能申请编号较小的资源2。
- 答案:C。使用银行家算法时,必须确保分配资源后系统仍处于安全状态,以避免死锁。
- 答案:A。破坏请求与保持条件可能导致系统效率降低,因为它要求进程在开始执行前就请求所有必需的资源。
三、真题