(备战招聘)操作系统之进程死锁

大家好,今天给大家介绍进程死锁,这是操作系统原理中比较重要的一部分。
首先介绍进程死锁的定义
进程死锁:
一组进程中,每个进程都无限等待被该组进程中另一进程所占有的资源,因而永远无法得到的资源,这种现象被称为进程死锁,这一组进程就称为死锁进程。如果死锁发生,会浪费大量系统资源,甚至导致系统崩溃
举一个最形象的例子,汽车过马路的例子
(备战招聘)操作系统之进程死锁
(备战招聘)操作系统之进程死锁
那么为什么会出现进程死锁的现象呢?
1、竞争资源,当系统*多个进程共享资源如打印机、公共队列的情况下,该资源无法满足进程需求,引起进程竞争而产生死锁
2、进程间的推进顺序非法,进程在运行过程中,请求和释放资源的顺序不当,同样导致死锁
以下两个图分别为两种情况的例子
(备战招聘)操作系统之进程死锁
(备战招聘)操作系统之进程死锁
有死锁当然也有活锁
活锁的定义为
进程1和进程2都可以使用同一个资源,但是两者之间由于优先级相同,互相礼让导致一直进入CPU轮训却都不使用资源,不断循环。
(备战招聘)操作系统之进程死锁
如上图例子,进程A与进程B在系统中并发执行,当进程A给资源1加锁以后,这个时候CPU切换到进程B,进程B对资源2加锁。当再次进入进程A以后,算法不断去轮询资源2,然后进程A直到离开CPU,进程B也是同理,但是两个进程既无进展也不阻塞。

进程死锁有四个必要条件:
1、互斥使用(资源独占)
一个资源每次只能给一个进程使用
2、占有且等待(请求和保持资源)
进程在申请新的资源的同时,保留对原有资源的占有
3、不可抢占(不可剥夺)
资源申请者不能强行从资源占有者手中剥夺资源,资源只能由占有者自愿释放
4、循环等待
存在一个进程等待队列, {P1 , P2 , … , Pn}, 其中P1等待P2占有的资源,P2等待P3占有的资源,…, Pn等待P1占有的资源,形成一个进程等待环路

谈到死锁就要谈到死锁的预防
从两个角度来考虑,死锁的预防分为两种办法
1、不让死锁发生
死锁预防采用静态策略(设置合适的资源分配算法,不让死锁发生)和动态策略(以不让死锁发生为目标,跟踪并评估资源分配过程,根据评估结果决策是否分配 )
2、让死锁发生
死锁检测与解除

死锁的预防通常思路是在设计系统时,通过确定资源分配算法,排除发生死锁的可能性具体的做法是防止产生死锁的四个必要条件中任何一个条件发生,也就是破坏四个必要条件之一
1、破坏互斥现象
把独占资源变为共享资源
2、破坏占有等待现象
如一个进程在申请新的资源不能立即得到满足而变为等待状态之前,必须释放已占有的全部资源,若需要再重新申请或者要求每个进程在运行前必须一次性申请它所要求的所有资源,且仅当该进程所要资源均可满足时才给予一次性分配
3、破坏不可抢占现象
当一个进程申请的资源被其他进程占用时,可以通过操作系统抢占这一资源(两个进程优先级不同)
4、破坏循环等待条件
把系统中所有资源编号,进程在申请资源时必须严格按资源编号的递增次序进行,否则操作系统不予分配