一、死锁,饥饿,死循环
死锁:各进程互相等待对方手里的资源,导致各进程都阻塞,无法向前推进的现象
饥饿:由于长期得不到想要的资源,某进程无法向前推进的现象,例如:短进程优先算法
死循环:某进程执行过程中一直跳不出某个循环的现象
二、死锁产生的必要条件
产生死锁必须同时满足以下四个条件,只要其中任一条件不成立,死锁就不会发生。
- 互斥条件:只有对必须互斥使用的资源的争抢才会导致死锁
- 不剥夺条件:进程所获得的资源在未使用完之前,不能由其他进程强行夺走,只能主动释放
- 请求和保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源又被其他进程占有,此时请求进程被阻塞,但又对自己已有的资源保持不放。
- 循环等待条件:存在一种进程资源的循环等待链,链中的每一个进程已获得的资源同时被下一个进程所请求
注意:发生死锁时一定有循环等待,但发生循环等待时未必死锁。
三、什么时候会发生死锁
总之,对不可剥夺资源的不合理分配,可能导致死锁。
四、死锁的处理策略
1.预防死锁
即破坏死锁产生的必要条件
2.避免死锁
安全序列:指如果系统按照这种序列分配资源,则每个进程都能顺利完成,只要能找出一个安全序列,系统就是安全状态。
系统处于不安全状态未必死锁,但死锁时一定处于不安全状态。系统处于安全状态一定不会死锁。
(1)银行家算法
(2)银行家算法步骤
- 检查此次申请是否超过了之前声明的最大需求数
- 检查此时系统剩余的可用资源是否还能满足这次请求
- 试探着分配,更改各数据结构
- 用安全性算法检查此次分配是否会导致系统进入不安全状态
(3)安全性算法步骤
检查当前的剩余可用资源是否能满足某个进程的最大需求,如果可用,就把该进程加入安全序列,并把该进程持有的资源全部回收,不断重复上述过程,看最终是否能让所有进程都加入安全序列。