过几天学校要操作系统考试了,打算将自己复习过程以笔记的方式记录下来,并且上传博客。主要是为了督促自己养成做笔记、写文章的好习惯,其次是因为上传博客上传文章这样的行为算是正反馈,有了成就感有了收获感才会更有动力。
什么是死锁?
在并发环境下,各进程因竞争资源而造成的一种互相等待对方手里资源,导致进程都阻塞,都无法向前推进的现象。发生死锁后若无外力干涉,这些进程都将无法向前推进。
死锁、饥饿、死循环的区别
饥饿:由于长期得不到想要的资源,某进程无法向前推进。例如在短进程优先算法(SPF),短进程不断到来,导致长进程一直得不到处理机,从而长进程饥饿。 死循环:进程执行过程中一直跳不出某个循环的现象。 区别:
- 死锁至少是2个或2个以上进程同时发生死锁。
- 一个进程可以发生饥饿。
- 死锁和饥饿是操作系统的问题,死循环是编程者(你)的问题。
死锁发生的四个必要条件
- 互斥条件:只有对互斥使用的资源争抢才会导致死锁。
- 不剥夺条件:该进程的资源只能有自己释放,不能被其他进程抢走。
- 请求和保持条件:进程至少保持了一个条件,同时还在请求新的资源。
- 循环等待条件:存在一种进程资源的循环等待链。(同类资源只有一个时,循环等待必然导致死锁)
死锁的处理策略
- 预防死锁:破坏死锁产生的四个条件中的一个。
- 避免死锁:防止系统进入不安全状态(银行家算法)。
- 死锁的检测和解除:允许死锁发生,但是操作系统会检测并解除死锁。 接下来详细展开:
1.预防死锁
- 破坏互斥条件:SPOOLing技术,把独占设备在逻辑上改造成共享设备,例如打印机,增加了输出进程来实现共享。
- 破坏不剥夺条件:不推荐,实现起来复杂,增加了开销,可能导致进程饥饿。
- 破坏请求和保持条件:静态分配方法,在进程运行前一次申请所有资源。缺点是资源利用率低,且可能导致进程饥饿。
- 破坏循环等待条件:顺序资源分配法,即每个进程按编号递增的顺序请求资源。缺点是增加新资源麻烦。
2.避免死锁
安全序列:就是如果系统按照这个顺序分配资源,每个进程都能顺利完成。只要找到一个安全序列就说明系统是安全状态。安全序列可能有多个。如果系统在安全状态,就一定不会发生死锁,反之就有可能发生死锁。
银行家算法
核心思想:在资源分配前判断这次分配会不会导致系统进入不安全状态。
如图,表示t0时刻资源的分配情况:Max表示进程对资源的最大需求数量,Allocation表示当前已分配的资源数量,Need=Max-Allocation表示进程还需要的资源数量,Available表示当前还可以分配的资源,它随着资源的分配与回收动态地改变着。
使用银行家算法对T0时刻进行分析:加上上一张表格的Available(3,3,2)之后可以明显发现Work+Allocation的规律。它表示该进程完成后,资源回收后,所有的可分配资源。然后拿Work+Allocation与Need进行比较,若满足则Finish为true,以此类推。
最终我们可以找到这样一个安全序列(P1,P3,P4,P2,P0),需要注意的是T0时刻的安全序列并不一定只有一个,但是只要能找到一个安全序列,就说明此时系统是处于安全状态的。
此时,P1进程请求资源Request(1,0,2),我们根据它的请求动态地修改初始资源分配情况,如第一张图中的小括号()内所示。Allocation=Allocation+Request ,Need=Need-Request。然后再次检查此时系统是否安全:
同样可以找到一个安全序列(P1,P3,P4,P0,P2),系统仍处于安全状态,所以该请求是可以执行的。
3.死锁检测
资源分配图:
两种结点:进程结点、资源结点
两种边:进程结点——>资源结点,表示进程想申请几个资源(每个边代表一个资源)
资源结点——>进程结点,表示已为进程分配了几个资源(每个边代表分配了一个资源)
数据结构中,使用图的邻接表可以很容易的表示。
下图表示了资源分配图的化简,首先找到一个不阻塞不独立的结点(P1),判断P1可以顺利运行释放全部资源后,去掉P1的所有边,然后判断P2也可以顺利运行了,释放P2全部资源,即去掉P2所有边。经过这一系列操作,最终图上没有任何边,则代表该图可以完全简化,就一定不会有死锁发生。
如果最终不能消除所有边,那么此时就发生了死锁,最终还连着边的那些进程就是发生死锁的进程。
如图,P1,P2进程最终发生了死锁,而P3进程则没有。
4.死锁解除
解除死锁的主要方法有:
-
资源剥夺法:挂起某些死锁进程,并抢占它的资源分配给其他死锁进程。需要主要预防进程长时间得不到资源导致的饥饿。
-
撤销进程法:强制撤销部分或所有死锁进程。优点是实现简单,缺点是代价巨大,容易功亏一篑。 优先撤销哪些进程?优先级低,已执行时间短,使用资源少,非交互式(不影响用户体验)。
-
进程回退法:回退一个或多个进程到足以避免死锁的状态。要求系统记录进程的历史记录,设置还原点。