本文中的相关理论出自该书: 计算机操作系统(第四版)(汤小丹等编)
在死锁产生的必要条件一文中,提到了死锁产生的四个必要条件,本文将通过银行家算法来阐述如何避免死锁的产生。在介绍该算法之前先介绍有关系统状态的概念。
在避免死锁产生时,系统的状态可分为安全状态和不安全状态。当系统处于安全状态时可以避免产生死锁,反之,当处于不安全状态时,就会产生死锁。
安全状态
安全状态,是指系统能够按照某种进程推进顺序1,2,...n为每个进程i分配其所需资源,直到满足每个进程对资源的最大需求,使每个进程都能顺利的完成。此时的1,2...,n就成为安全序列。如果某时刻,系统能找到这样一个安全序列,就称该时刻系统处于安全状态,否则称为不安全状态。
例如,进程1,2,3竞争打印机资源。打印机总数为12台,进程1最大所需10台,进程2最大所需4台,进程3最大所需9台。
某一时刻,进程1已获得5台,进程2已获得2台,进程3已获得2台。于是可先给进程2分配2台,进程2使用完后释放4台,再加上原有的一台共5台分配给进程1使用。进程1使用完后释放10台分配给进程3使用。此时,便找到了一个安全序列(2,1,3)既满足个进程的最大需求,有使每个进程能够顺利的执行。此时系统就处于安全状态。
如果另一时刻,进程1已获得5台,进程2获得2台,进程3获得3台。系统此时剩余2台。如果将剩余的2台分配给进程2使用,进程2使用完后释放4台。此时这四台无论给进程1还是给进程3都不满足其最大需求。即这两个进程都不能顺利的执行,所以,此时找不到一个安全序列来所有进程顺利的完成。此时,称系统处于不安全状态。
判断某时刻系统是否处于安全状态
1. 设置变量
可利用资源向量Available:Available[j] = K,表示j类资源剩余K个
最大需求矩阵Max:Max[i,j] = K,表示进程i最大需求j类资源K个
已分配矩阵Allocation:Allocation[i,j] = K,表示进程i已经被分配了j类资源K个
需求矩阵Need:Need[i,j] = K,表示进程i还需要j类资源K个
以上可以得出:Need[i,j] = Max[i,j] - Allocation[i,j]
2. 安全状态算法
设置变量work:表示系统可提供给进程继续运行的剩余资源数。初始时,work = Available
设置变量finash:表示系统是否有足够的资源分配给某进程。如果有finash为true,如果没有为false。
(1)初始时,假设finash[i]为false。
(2)如果从进程集合中找到一个进程满足:
finash[i] = false且Need[i,j] < work[j],则继续往下执行。否则,跳转到(4)
(3)当进程i获取资源后,顺利执行,并释放资源:
work[j] = work[j] + Allocation[i,j];
finash[i] = true;
继续回到(2)执行
(4)当该进程组中所有进程的finash均变为true后,说明该系统处于安全状态。否则,为不安全状态。
银行家算法
Request[i,j] = K,表示进程i需要j类资源K个。
某一时刻,进程i发出需要j类资源K个的请求,系统进行如下步骤:
(1)如果K <= Need[i,j],继续往下判断。否则出错
(2)如果K <= Available[j],继续往下执行,否则该进程发生阻塞
(3)假设给进程i分配K个资源,则:
Available[j] = Available[j] - K
Allocation[i,j] = Allocation[i,j] + K
Need[i,j] = Need[i,j] - K
(4)此时,根据安全性算法,判断系统是否处于安全状态。如果处于,就给进程i分配K个资源,否则,不分配,使进程i等待。
银行家算法的使用:
(1)首先根据安全性算法判断初始时刻系统是否处于安全状态,如果是,则继续往下进行。
(2)当某进程请求资源时,根据银行家算法判断是否对其分配资源。
(3)循环执行(2)。直到所有进程都顺利完成。