持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第9天,点击查看活动详情
上回说到了一些关于死锁的知识点,但都只是概括性的不够细节具体,那么这篇文章就要开始具体的说一说了,先来看如何预防死锁,这里有些办法
我们都知道死锁有四个必要条件,那么就很简单了,只要我们破坏掉他四个条件中的一个就好了,就可以顺利预防死锁了,这个原理就是设计不同的资源分配算法,来保证不发生死锁。
1.破坏互斥条件
- 如果资源不需要互斥访问,就可以破坏互斥条件
- 对于某些硬件资源,可以采用特殊技术实现允许同时访问
- 对于软件资源,无法实现
2.破坏请求和保持条件
在执行时不再提出资源请求
系统要求所有进程要一次性地申请在整个运行过程中所需的全部资源,如果系统有足够资源则完全分配。
在等待时不保持任何资源
只要有一个请求的资源不可用,那么其他可用资源就都不分配给他
优点
简单、易于实现而且是安全的
缺点
- 一个用户在作业运行之前可能提不出他的作业将要使用的全部资源
- 延迟运行,用户作业必须等待,直到所有资源满足才能运行
- 一个作业运行期间,对某些设备的使用时间很短,甚至不会用到。就比如:当用户作业出错时才需要打印机输出错误信息,但采用静态分配法必须把打印机分配给该作业,并长期占用。采用该方法对系统来说是非常浪费的
3.破坏不可剥夺条件
- 一个已经拥有资源的进程,如果他再提出新资源要求而不能立即得到满足时,就必须释放已经拥有的所有资源,以后需要时在重新申请
- 实现复杂且要付出很大的代价(以前工作的失效,执行的推迟)
4.破坏环路条件
系统将所有资源按类型进行线性排序,并赋予不同的序号,所有进程对资源的请求必须严格按照资源序号递增的次序提出
优点
同前两种方法相比,他的资源利用率和系统吞吐量有比较明显的改善
缺点
进程实际需要资源的顺序不一定与资源的编号一致,因此仍然会造成资源浪费;资源的序号必须相对稳定,从而限制了新设备的增加
总结一下吧,预防死锁的原理就是设计不同的资源分配算法来保证不发生死锁,2是一种静态资源分配,3和4是动态分配资源的算法,而4是相对优异的一种预防死锁的算法。