避免死锁------银行家算法

本文中的相关理论出自该书:  计算机操作系统(第四版)(汤小丹等编)

        在死锁产生的必要条件一文中,提到了死锁产生的四个必要条件,本文将通过银行家算法来阐述如何避免死锁的产生。在介绍该算法之前先介绍有关系统状态的概念。

        在避免死锁产生时,系统的状态可分为安全状态和不安全状态。当系统处于安全状态时可以避免产生死锁,反之,当处于不安全状态时,就会产生死锁。

安全状态

        安全状态,是指系统能够按照某种进程推进顺序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. 设置变量

扫描二维码关注公众号,回复: 867146 查看本文章

可利用资源向量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)。直到所有进程都顺利完成。




猜你喜欢

转载自blog.csdn.net/sandmm112/article/details/80081787
今日推荐