关于进程中死锁问题的研究
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
关于进程中死锁问题的研究
摘要
死锁问题是Dijkstra于1965年研究银行家算法时首先提出的,也是计算机操作系统乃至并发程序设计中非常重要但又最难处理的问题之一。实际上死锁问题是一种具有普遍性的现象。不仅在计算机系统中,就是在其它各个领域乃至日常生活中,也都是屡见不鲜的。掌握对死锁的处理方法,对于指导我们的现实生活,都会有积极地意义。本文研究的是操作系统进程中的死锁问题。从理论上说,死锁问题的研究涉及到计算机科学中一个基本问题,即并行程序的终止性问题。本文将通过对死锁的基本概念、产生的原因和产生死锁的四个必要条件的了解,找出合理的预防、避免、检测和解除的有效方法,并将其运用到实际问题中去。
关键字:死锁的预防死锁的避免银行家算法死锁的检测死锁的解除
一、死锁的基本概念
1.1 死锁的概念
当两个或两个以上的进程因竞争系统资源而无休止的相互等待时,我们就称这些进程是死锁的,或者说它们处于死锁状态。
1.2 死锁产生的原因
1、各进程竞争有限的资源。
2、进程推进顺序不当。
1.3 产生死锁的四个必要条件
1、互斥条件。指在一段时间内,一个资源只能由一个进程独占使用,若别的进程也要求该资源,则须等待直至其占用者释放。
2、请求和保持条件。指进程已经保持了至少一个资源,但又提出新的请求,而该资源已被其他进程占用,此时请求进程阻塞,但又不释放自己已获得的资源。
3、不可剥夺条件。进程所获得的资源在未使用完之前,不能被其他进程强行夺走,而只能由其自身释放。
4、环路条件。指存在一个等待进程集合{}n P P P P ,,,,210 ,0P 正在等待一个1P 占用的资源,1P 正在等待一个2P 占用的资源,…,n P 正在的等待一个由0P 占用的资源。这些进程及其请求的资源构成一个“进程——资源”的有向循环图。
二、死锁的处理
2.1 死锁的预防
死锁的预防是排除死锁的静态策略,因为我们已经知道了导致死锁产生的四个必要条件,那么我们只须破坏这四个条件中的一个即可预防死锁。为此介绍如下4种方法。
1、共享使用法
允许一个资源部件可以由多个进程“同时”使用。这种方法在早期曾使用过,但实践证明这种方法对有些资源是行不通的。如对宽行就是由各个进程“同时”使用,结果在打印纸上交替出现了不同进程的不同信息,从而给用户带来很大的不便,故对此类资源一般都采用独占方式。由于对大多数资源来说互斥使用是完全必要的,所以通过破坏互斥条件来防止死锁是不现实的。
2、预先静态分配法
在进程调度程序选择进程时,仅当进程所需要的全部资源都能满足时,才调度它进入内存运行。或者说,在进程尚处于运行前的静态情况下,就为它分配了所需要的全部资源。显然这是一种简单而安全的预防死锁的方法,但是,若资源搭配不当,就会导致进程将延迟运行,资源利用率低。
3、采用剥夺式调度法
这种方法主要用在处理器和存储器资源调度上,是调度进程自身的开销,以及主存和磁盘的对换进程、数据的开销。但对于需要由操作员装卸私有数据的外围设备,此法就不宜使用。这种方法实现起来比较复杂,且要付出很大的代价,还可能导致反复地请求和释放资源,而使进程的执行无限延迟。这不仅延长了进程的周转时间,还增加了系统的开销,降低了系统的吞吐量。
4、有序资源使用法
系统设计者把系统中所有资源都赋予一个唯一的编号。如令输入机为1,
打印机为2,穿孔机为3,磁带机为4,等等。此法要求每个进程均应按照严格递增的次序请求资源,并且除非前一要求得到满足,否则不允许做进一步请求。这种方法较前一种方法提高了资源的利用率。特别是只要系统把比较重要或稀少的资源安排为较高的序号,便可能使最有价值的资源的利用率大大提高。但是,因为进程实际需要资源的次序并不一定与系统规定的次序相符,因此可能提前分配了暂时不需要的小序号资源,从而造成资源的浪费。
2.2 死锁的避免
死锁的避免是一种排除死锁的动态策略,允许进程动态地申请资源,但系统在分配资源之前,要先计算资源分配的安全性,若此次分配不会导致系统进入不安全状态,便将资源进行分配,否则不予以分配。
Dijkstra的银行家算法是最具代表性的避免死锁的算法,这种方法是以银行系统所采用的借贷策略为基础建立的模型。下面将详细介绍银行家算法。
1、银行家算法中的数据结构
(1)可利用资源向量Available
这是一个含有m个元素的数组,其中的每一个元素代表一类可利用的资源数目,其初始值是系统中所配置的该类全部可用资源的数目。如果
]
[,
j
Available=
K
R类资源K个。
则表示系统中现有
j
(2)最大需求矩阵Max
n⨯的矩阵,它定义了系统中n个进程中的每一个进程对m类资这是一个m
源的最大需求。如果
Max=
]
,[,
i
j
K
R类资源的最大数目为K。
则表示进程i需要
j
(3)分配矩阵Allocation
n⨯的矩阵,它定义了系统中每一类资源当前已分配给每一进这也是一个m
程的资源数。如果
Allocation=
]
,[,
i
j
K
R类资源的数目为K。
则表示进程i当前已分得
j
(4)需求矩阵Need
这也是一个m n ⨯的矩阵,用以表示每一个进程尚需的各类资源数。如果
K j i Need =],[,
则表示进程i 还需要j R 类资源K 个,方能完成其任务。
并且上述的三个矩阵有如下关系:
],[],[],[j i Alloction j i Max j i Need -=。
2、银行家算法的实现 (1)进程申请资源的情况
设i quest Re 进程i P 的请求向量,如果
K j quest i =][Re ,
表示进程i P 需要j R 类资源数为K 个。][Re j quest i 与],[j i Need 的关系可能有以下3种情况:
① ][Re j quest i >],[j i Need .
表示该进程的资源需求量已经超过它所宣布的最大值,因此认为出错。 ② ][Re j quest i =],[j i Need .
表示该进程现在对它所需求的全部资源一次申请完成。 ③ ][Re j quest i <],[j i Need .
表示该进程现在对它所需的资源再进行部分申请,剩余的资源以后可再次申请。
(2)银行家算法的描述
当进程i P 发出资源请求后,系统按一下步骤进行检查: ① 如果
],[][Re ],[j i Need j quest j i Allocation i ≤+,
便转向步骤②;否则认为出错,因为它所需求的资源数已超过它宣布的最大值。 ② 如果
],[][Re j i Available j quest i ≤,