死锁 《死锁的原因》 、《产生死锁的必要条件》 、《检测、避免、预防死锁的策略》---银行家算法

一、什么是死锁?
课本上的定义:
死锁定义为一组互相竞争资源或进行进程间通信的进程间的“永久” 阻塞。
当一组进程中的每个进程都在等待某个事件(资源),而仅有这组进程中的其他进程才可以触发该事件。因为没有事件能够被触发,故死锁是永久性的。
通俗的将就是:
两个或多个进程,都拥有其他进程为了继续执行而必要的系统资源,但是每一个进程在得到自己需要的资源之前不会释放自己已用有的资源。从而导致这些进程盲目等待对方释放资源,而出现永久阻塞的现象。

二、死锁产生的原因?
(1) 因为系统资源不足。
(2) 进程运行推进的顺序不合适。
(3) 资源分配不当等。

如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则
就会因争夺有限的资源而陷入死锁。其次,进程运行推进顺序与速度不同,也可能产生死锁。

三、死锁产生的必要条件有哪些?
1.互斥条件:进程要求对所分配的资源进行排它性控制,即在一段时间内某资源仅为一进程所占用。
2.占有且等待:当进程因请求资源而阻塞时,继续占有已分配的资源。
3.不剥夺条件:进程已获得的资源在未使用完之前,不能剥夺,只能在使用完时由自己释放。
4.循环等待:存在一个闭合的进程链,每个进程至少占有此链中下一个进程所需的一个资源。

四、预防、避免、检测死锁的方法
【1】预防死锁
资源一次性分配:一次性分配所有资源,这样就不会再有请求了:(破坏占有且等待条件)
只要有一个资源得不到分配,也不给这个进程分配其他的资源:(破坏占有等待条件)
可剥夺资源:即当某进程获得了部分资源,但得不到其它资源,则释放已占有的资源(破坏不可剥夺条件)
资源有序分配法:系统给每类资源赋予一个编号,每一个进程按编号递增的顺序请求资源,释放则相反(破坏环路等待条件)
产生的策略如下:
1.顺序获得锁
2.超时放弃:该方法可以按照固定时长等待锁,因此线程可以在获取锁超时以后,主动释放之前已经获得的所有的锁。

【2】死锁避免
死锁避免与死锁预防相比,可允许更多的并发。
在死锁避免中,是否允许当前的资源的分配是通过判断该请求是否可能导致死锁来决定的。因此死锁避免需要知道未来进程资源请求的情况。
避免死锁的方法:
1.进程启动拒绝 : 若一个进程的启动会导致死锁,作为不启动该进程。
2.资源分配拒绝: 若一个进程增加的资源请求会导致死锁,则不允许这一资源分配。
资源分配拒绝又称为银行家算法。
银行家算法:确保系统中的进程和资源总处于安全状态。进程请求一组资源时,假设同意该请求,因此改变了系统的状态,然后确定结果是否处于安全状态,如果是则同意该请求;如果不是,阻塞该进程直到同意该请求后系统状态仍然是安全的。
安全状态:指至少有一个资源分配序列不会导致死锁(即所有进程都能运行到结束)。
非安全状态则于此相反。
【3】死锁检测
操作系统周期性的执行一个算法来检测“循环等待” 是否存在。该算法不能保证防止死锁,它只能确定当前是否存在死锁。
关于该算法的细节这里就不加以叙述:大家可以下去查阅操作系统精髓与设计原理第六章-----并发章节加以了解。
死锁检测的目的是恢复死锁:方法如下:
1.取消所有的死锁进程(最常用)。
2.把每个进程回滚到前面定义的某些检查点,并重新启动所有进程,此时要求在系统中构建回滚和重启机制。该方法的风险是:原来的死锁可能再次发生。该方法依赖于并发进程的不确定性。
3.连续取消死锁进程直到不再存在死锁。每次取消后还需重新调用死锁检测算法,以测试是否还存在死锁。 所选取消进程的顺序应基于某种最小代价原则。
4.连续抢占资源直到不再存在死锁。与第三点一样,需要使用一种基于代价的选择方法,且在每次抢占后需要重新调用死锁检测算法。被抢占资源的进程必须回滚到获得该资源之前的状态。

上面所提到的被抢占资源的进程 和 被取消的进程选择的原则采用如下之一:

  • 目前为止消耗处理器时间最少。
  • 目前为止产生输出最少
  • 预计剩下时间最长
  • 目前为止分配资源最少总量最少
  • 优先级最低
发布了70 篇原创文章 · 获赞 12 · 访问量 9759

猜你喜欢

转载自blog.csdn.net/lovehang99/article/details/104627147
今日推荐