先给出概念
死锁:
一组进程中,每个进程都无限等待被改组进程中另一进程所占有的资源,因而永远无法得到资源,这种现象称为进程四艘
,这一组进程称为死锁进程
活锁:
先加锁,再轮询(忙等待),进程可以上CPU,时间配额用完后下CPU,既无进展也没有阻塞
饥饿:
由于资源分配策略问题导致某个进程永远无法上CPU运行
死锁产生的必要条件:
互斥使用:
一个资源每次只能给一个进程使用
占有且等待:
或称为请求和保持,进程在申请新的资源的同时保持对原有资源的占有
不可抢占:
或称为不可剥夺,资源申请者不能强行从占有者手中夺取资源,只能由占有者自愿释放
循环等待:
存在一个进程等待的队列,形成一个进程等待环路
死锁的解决方案:
第一种是不考虑此问题,俗称鸵鸟算法,鸵鸟在伤害来的时候,直接把头埋进沙子的做法
第二种是不让死锁发生,又分为2种
一种是死锁预防,通过设计合适的资源分配算法,不让死锁发生,这是一种静态策略
一种是死锁避免,以不让死锁发生为目标,跟踪并评估资源分配的过程,根据评估结果决策是否分配,这是动态策略
死锁预防的几种做法:死锁发生需要4个必要条件,所以只要破坏其中一种就可以预防死锁
第1种:互斥使用。做法是独占资源变为共享资源,如"守护进程/线程"(daemon)
第2种:占有且等待。有2种做法,第(1)种是每个进程运行前必须一次性申请所要求的的所有资源,且资源都满足时才给予一次性分配,这样会导
致资源利用率低,以及"饥饿现象";第(2)种是每个进程在申请新的资源不能立即得到满足而变为等待状态之前,必须释放已占有的全部资源,再需
要时则重新申请,这样也可能导致饥饿现象,且下次申请时,资源的状态可能已经改变
第3种:不可抢占。这个一般是CPU和内存用到,不讲
第4种:循环等待。将系统中的所有资源编号,进程在申请资源时严格按照编号递增的次序进行,否则不予分配,通常按照资源使用的频繁性,常用
的放在前面
死锁避免:银行家算法,最后一个进程申请资源的时候如果将产生死锁,不予分配
第三种是让死锁发生,通过死锁检测和解除来解决问题
死锁检测是通过操作系统不断监视系统进展情况来判断死锁是否真的发生,一旦发生,接触死锁并以最小的代价恢复运行
检测时机:定时检测或系统资源利用率下降时检测死锁
死锁检测算法的简单实现:首先每个进程,每个资源指定唯一的编号;建立一张资源分配表记录各进程与其占用的资源的关系;建立一张资源申请表,
记录各进程与其需要申请的资源的关系,以某个进程开始为起点,查找是否存在一个最终自我等待的环路
解除方案:原则是以最小代价恢复系统的运行,一般有如下方式
撤销所有死锁进程(代价大)
进程回退再启动(Roll back),需要记录大量中间点,开销大
按照某种原则逐一撤销死锁进程,比如Mysql的最少占用锁的进程回滚策略
按照某种原则逐一抢占资源
哲学家就餐问题