第3章死锁
死锁是多道程序并发执行带来的另一个严重问题,它是操作系统乃至并发程序设计中*难处理的问题之一。进程死锁产生的根本原因有两个: 一是竞争资源; 二是进程间推进的顺序不合理。死锁处理不好将会导致整个系统运行效率下降,甚至不能正常运行。操作系统设计者必须高度重视死锁现象。死锁普遍存在,对于死锁,不存在**的、彻底的解决方案,只能在众多可行方案中选择一个折中方案。
本章主要讲解死锁的基本概念、死锁的处理策略、死锁的预防、死锁的避免以及死锁的检测和解除。本章需要**掌握:
了解死锁的基本概念; 了解死锁的检测、死锁解除的方法;
理解死锁的产生的原因; 理解死锁预防与死锁避免的区别;
掌握死锁���生的4个必要条件; 掌握系统**状态及其判别方法; 掌握处理死锁的方法;
学会银行家算法及其应用。
3.1死锁的定义和产生原因
3.1.1死锁的定义
死锁是指一组并发执行的进程彼此等待对方释放资源,而在没有得到对方占有的资源之前不释放自己所占有的资源,导致彼此都不能向前推进,称该组进程发生了死锁。
死锁产生后,若无外力干预,陷入死锁的各个进程都永远不能向前推进,导致这些进程不能正常结束。同时,要求共享使用死锁进程所占资源的其他进程,或者需要与死锁进行某种合作的其他进程也会受到牵连,也不能正常结束。*终可能导致系统瘫痪,给系统和用户带来极大损失。因此,操作系统设计者必须对死锁现象予以充分重视。
死锁问题不仅普遍存在于计算机系统中,在日常生活中也广泛存在。现实生活中交通死锁问题较为常见。例如,某交通路口恰有4辆汽车几乎同时到达,并相互交叉停了下来,如图31(a)所示。如果该路口没有采取任何交通管理措施,4辆车同时驶过十字路口,就会发生如图31(b)所示的场面。*终结果是4辆车都在等待对方车辆后退,但谁也不先让,所以都不能通过该路口,出现交通死锁现象。
图31交通阻塞导致死锁示意图
在该例中,可把每辆汽车行驶过十字路口看作一个进程,系统中共有4个这样的进程并发执行。十字路口可看作4个临界资源,如图31(a)中标注的a、b、c和d所示。每个汽车进程在过路口都要依次申请其中的两个资源。1号汽车申请a和b资源; 2号汽车申请b和c资源; 3号汽车申请c和d资源; 4号汽车申请d和a资源。出现死锁情况时,1号汽车占据a资源和申请b资源; 2号汽车占据b资源和申请c资源; 3号汽车占据c资源和申请d资源; 4号汽车占据d资源和申请a资源。此时,若不采取外力措施干预,如交通警察未赶到现场进行疏导管理,4辆汽车将永远互相等待。在死锁解除前,如果此后还有其他汽车想通过该十字路口,由于4个路口资源都已经分配,故也不能通过,因此造成更多进程阻塞。
在计算机系统中,凡是涉及临界资源(即互斥资源)申请的并发进程间都可能发生死锁。举一个计算机系统中的简单实例,如某系统中有P1和P2两个进程并发执行,P1和P2两个进程在执行过程中都需要使用一台打印机和一台CDROM驱动器。该系统中只有一台打印机和一台CDROM驱动器,两者均为临界资源。假设进程P1和P2的执行过程如图32所示。
图32两个并发进程的执行情况图
当进程P1申请打印机成功时,恰巧此时进程发生切换,调度程序选中P2执行,P1暂时变为就绪态等待调度程序调度。进程P2首先申请CDROM驱动器,此时该设备处于空闲状态,故系统把它分配给进程P2。这时,P1和P2两个进程都不能向前继续推进。进程P1申请CDROM驱动器,但CDROM驱动器已被P2占用,只能被阻塞,等待进程P2使用完毕后,释放CDROM驱动器给它; 进程P2向前推进时,申请打印机,但打印机此时被进程P1占用,P2也只好阻塞,等待进程P1使用完毕后释放。因此P1和P2两个进程都陷入了相互等待的状态,形成了死锁。
通过上面介绍的例子可以发现,死锁具有以下特点。
(1) 陷入死锁的进程是系统并发进程中的一部分,且至少要有两个进程,单个进程不会形成死锁。
(2) 陷入死锁的进程彼此都在等待对方释放资源,形成一个循环等待链。
(3) 死锁形成后,在没有外力干预时,陷入死锁的进程不能自己解除死锁,死锁进程无法正常结束。
(4) 如不及时解除死锁,死锁进程占有的资源不能被其他进程所使用,导致系统中更多进程阻塞,造成资源利用率下降。
3.1.2死锁产生的原因
产生死锁的原因可归结为两点。
(1) 竞争资源。当系统中供多个进程所共享的资源不足以同时满足它们的需要时,引起它们对资源的竞争而产生死锁。
(2) 进程推进顺序不当。进程在运行过程中,请求和释放资源的顺序不当,导致了进程死锁。
1. 竞争资源
死锁产生的根本原因是资源竞争且分配不当。因为多道程序并发执行,造成多个进程在执行过程中所需要的资源数远远大于系统能提供的资源数。如图32所示例子中的进程P1和P2两个进程之所以产生死锁,就是因为系统中的打印机和CDROM驱动器不够用,如果为了防止死锁而配置多台打印机和CDROM驱动器,从成本角度看是不现实的。由于各个进程对资源的需求量是动态变化的,虽然有多个并发执行的进程,但某个时刻它们对打印机提出的请求可能只有一个,甚至没有,系统配置多台打印机就造成了资源的浪费。
计算机系统中有很多资源,按照占用方式来分,可分为可剥夺资源与不可剥夺资源。
(1) 可剥夺资源。某进程在获得这类资源后,即使该进程没有使用完,该类资源也可以被其他进程剥夺使用。例如,优先级高的进程可以抢占优先级低的进程的处理器; 如可把一个进程从一个存储区转移到另一个存储区,在主存紧张时,还可将一个进程从主存调出到辅存上,即剥夺该进程在主存的空间。可见,CPU、主存和磁盘均属于可剥夺资源,竞争可剥夺资源不可能出现死锁。
(2) 不可剥夺资源。当系统把这类资源分配给某进程后,不能强行收回,只能在进程使用完后自行释放,然后其他进程才能使用。例如,当一个进程已开始刻录光盘时,如果突然将刻录机分配给另一个进程,其结果必然会损坏正在刻录的光盘,因此只能等刻录好光盘后由进程自身释放刻录机。另外,打印机、刻录机和CDROM驱动器等都属于不可剥夺资源。
2. 进程推进的顺序不当
并发执行的进程在运行中存在异步性,彼此之间相对执行速度不定,存在着多种推进顺序。并发进程间推进顺序不当时会引起死锁。
为了更好地描述进程P1和进程P2的推进顺序,图33给出了两者的推进顺序示意图。横轴表示进程P1的执行进展,纵轴表示进程P2的执行进展,R1和R2表示资源。从原点出发的不同路径分别表示两个进程以不同的速度向前推进。图中给出了4种不同的执行路径,表示4种不同的进程间推进顺序。
……