-
死锁:各进程互相等待对方手里的资源,导致各进程都阻塞,无法向前推进
-
饥饿:由于长期得不到想要的资源,某进程无法向前推进
-
死循环:某进程执行过程中一直跳不出某个循环
(需同时满足)
- 互斥条件:对必须互斥使用的资源进行抢夺
- 不剥夺条件:进程所获得的资源在未使用完之前,不能被其他进程强行夺走,只能是主动释放
- 请求并保持条件:进程在申请新的资源时,至少已经保持了一个资源
- 循环等待条件:一种进程资源的循环等待链
(1)系统资源的竞争
- 系统中的不可剥夺资源数量不足以满足多个进程的需要,会因资源抢夺而陷入僵局,如磁带机、打印机等
(2)进程推进顺序非法
- 进程在运行过程中,请求和释放资源的顺序不当,会导致死锁
(3)信号量使用不当
- 进程间彼此互相等待对方发来的消息,会使进程无法向前推进
预防死锁 (破坏死锁产生的四个必要条件之一)
- 破坏互斥条件:把只能互斥使用的资源改为允许共享使用
- 破坏不可剥夺条件:
1.当某个进程请求新的资源得不到满足时,必须立即释放手头的所有资源
2.当某个进程需要的资源被其他进程占有时,可由操作系统协助强行剥夺,一般要考虑优先级 - 破坏请求并保持条件:采用静态分配方法,即进程在运行之前一次性申请完所有需要的资源
- 破坏循环等待条件:采用顺序资源分配法,给资源编号,要求进程在申请资源时按编号递增的顺序申请,同类资源一次性申请完
避免死锁
-
安全序列:就是指如果系统按某种序列分配资源,则每个进程都能顺利完成,只要能找出一个安全序列,系统就是安全状态。安全状态一定不会发生死锁,不安全状态有可能发生死锁,死锁一定是在不安全状态。
-
银行家算法:在进程提出资源申请时,先预判此次分配是否会导致系统进入不安全状态。如果会进入不安全状态,就暂时不答应这次请求,让该进程先阻塞等待。
-
数据结构的描述:
-
安全性算法步骤:
- 检查当前的剩余可用资源是否能满足某个进程的最大需求,如果可以,就把该进程加入安全序列,并把该进程持有的资源全部回收
- 不断重复上述过程,看最终是否能够让所有人都加入安全序列
- 银行家算法步骤:
- 检查此次申请是否超过了之前声明的最大需求数
- 检查此时系统剩余的可用资源是否还能满足这次请求
- 试探性分配,更改各数据结构
- 用安全性算法检查此次分配是否会导致系统进入不安全状态
死锁的检测及解除
检测系统是否发生死锁:资源分配图
检测过程:找到既不阻塞又不是孤点的进程,消去它所有的请求边和分配边,使之成为孤点,比如P1,然后归还所有资源,供因等待这些资源而阻塞的进程,比如P2。
用死锁检测算法化简资源分配图后,还连着边的进程就是死锁进程
死锁解除方法
- 资源剥夺法
- 撤销进程法
- 进程回退法



