持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第26天,点击查看活动详情
什么是死锁?
死锁是两个或多个进程抢占一个资源,请求另一个进程占用的资源,等待对方完成工作,但都没有永远结束的情况。
如上图所示,在汽车(进程)占据每条道路(资源)的状态下,它们正在等待使用其他汽车(进程)使用的道路(资源),但在道路上却不能这样做或那样做.我可以给你举个例子。
发生死锁的条件?
当满足以下四个条件(必要条件和充分条件)时,可能会发生死锁
- 互斥: 一次只能有一个进程使用共享资源
- 等待: 进程在分配资源时等待另一个资源
- 无抢占: 等待进程完成工作后主动返回资源 (不能强行取走已经分配的资源)
- 循环等待: 一个进程的资源占用和被占用资源的需求关系形成一个循环等待的情况。 每个进程递归地拥有下一个进程所需的资源。
如何修复死锁?
死锁预防方法是首先防止死锁发生的方法。
-
预防互斥: 多个进程可以同时使用共享资源.
-
安全等待: 在进程执行之前分配所有必要的资源,以消除等待进程,或者只有在资源未被占用时才接受资源请求。
-
破环不可抢占条件: 允许抢占所有资源
-
破坏等待条件: 资源被线性分类并分配唯一编号,每个进程只在一个方向上请求资源,在当前占用的资源唯一编号之前或之后。
但是,这种通过防止死锁条件来防止死锁的方法存在降低系统吞吐量或资源使用效率的缺点。
- 回避
这是一种仅允许在安全状态下进行资源请求而不会发生死锁的不安全分配的方法。但是,为了避免死锁,需要进行以下假设。
- 固定数量的进程
- 修复了资源的类型和数量
- 需要知道进程所需资源的最大数量
- 资源使用后进程必须返回
安全状态
是指存在安全序列且所有进程都可以正常终止的状态。
不安全状态
可能发生死锁的状态