4.1 死锁的概念
死锁:一组进程中,每个进程都无限等待被该组进程中其它进程所占有的资源,在无外力介入的条件下,将因永远分配不到资源而无法运行的现象
死锁发生的原因:资源竞争、并发执行顺序的不当
竞争不可剥夺资源引起死锁,对可剥夺资源的竞争不会引起死锁
死锁发生的四个必要条件
- 互斥条件:一段时间内某资源只能由一个进程占用
- 请求和占有条件/请求并保持条件:指进程已经占有至少一个资源,但又提出了新的资源请求,而该资源已被其它进程占有,此时请求进程阻塞,但又对自己已获得的其它资源保持不放。
- 不可剥夺条件:指进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放。
- 环路等待条件:指在发生死锁时,必然存在一个进程— —资源的环形链(资源分配图含圈,但不一定会发生死锁,因为同类资源数可能大于1)
活锁:是指任务或者执行者没有被阻塞,由于某些条件没有满足,导致一直重复尝试,失败,尝试,失败。
- 处于活锁的实体是在不断的改变状态,即所谓的“活”;活锁有可能自行解开,死锁则不能。避免活锁的简单方法是采用先来先服务的策略。
4.2 处理死锁的基本方法
不允许死锁发生:
- 预防死锁(静态)
- 避免死锁(动态):在资源分配之前进行判断
允许死锁发生
- 检测与解除死锁
- 无所作为:鸵鸟算法
4.2.1 死锁预防
破坏死锁的四个必要条件,限制进程有关资源的申请。
- 打破互斥条件:即允许进程同时访问某些资源。eg:Spooling技术
- 打破占有且申请条件:可以实行资源预先分配策略。只有当系统能够满足当前进程的全部资源需求时,才一次性地将所申请的资源全部分配给该进程,否则不分配任何资源。
- 这种策略的缺点:程序执行是动态的,不可预测其所需要的全部资源
- 资源利用率低,有些资源可能只在最后才用到一次,但会被一直占用
- 降低了程序的并发性。资源有限+会存在浪费
- 打破不可剥夺条件:即允许进程强行从占有者那里夺取某些资源。就是说,当一个进程已占有了某些资源,它又申请新的资源,当不能立即被满足时,须释放所占有的全部资源,以后再重新申请。这种预防死锁的方法实现起来困难,会降低系统性能
- 打破循环等待条件:实行资源有序分配策略。对资源的请求必须严格按资源序号递增的顺序提出。存在以下缺点:
- 限制了进程对资源的请求,同时给系统中所有资源合理编号也是件困难事,并增加了系统开销;
- 为了遵循按编号申请的次序,暂不使用的资源也需要提前申请,从而增加了进程对资源的占用时间。
4.2.2 死锁避免
对进程所发出的每一个申请资源命令进行动态检查。死锁避免不严格限制产生思索的四个必要条件,不限制进程有关资源的申请。
并非所有的不安全状态都是死锁状态,但当系统进入不安全状态后,便可能进入死锁。
银行家算法 【王道P141】
银行家算法的特点:
- 允许互斥、部分分配和不可抢占,可提高资源利用率
- 要求事先说明最大资源要求,在现实中很困难
4.2.3 死锁检测和解除
死锁检测算法主要是根据资源分配图/进程-资源图检查是否有循环等待。
框表示资源,圆圈表示进程
死锁定理:系统中某个时刻t为死锁状态的充要条件是t时刻系统的资源分配图是不可完全化简的。
死锁解除
死锁解除重要的是以最小的代价恢复系统的运行
- 撤消进程:强制撤掉部分甚至全部死锁的进程,直至有足够的资源可用,死锁状态消除为止
- 剥夺资源:使用挂起挂起一些死锁进程,剥夺它们的资源以解除死锁,待条件满足时,再激活进程
- 进程回退法:让一个/多个进程回退到足以回避死锁的地步