在C语言中使用银行家算法预防死锁

来源:这里教程网 时间:2026-02-16 13:53:10 作者:

在C语言中使用银行家算法预防死锁

银行家算法是一种资源分配和避免死锁的算法,在执行 “s-state “检查以寻找潜在活动并确定是否应允许继续分配之前,模拟所有资源的预定最大可能量的资源分配。

为什么银行家的算法被称为

银行家的算法之所以有这样的标题,是因为它被运用于银行业,以确定是否授权向个人提供贷款。假设一家银行有n个账户持有人,每个人的个人余额为S。当有人要求贷款时,银行首先从其拥有的资金总额中扣除贷款金额,只有当余额超过S时才会批准贷款。之所以这样做,是因为如果每个账户持有人都来取钱,银行就能简单地做到。换句话说,银行绝不会以妨碍其满足所有客户要求的方式安排其资金。银行会努力在任何时候都保持安全。

银行家的算法是用以下数据结构实现的。

设n为系统中进程的数量,m为资源种类的数量。

可用的。

这个大小为’m’的1-d数组列出了当前可用的每一类资源的数量。如果Available[j] = Rj,则有’k’个资源类型的实例。

最大。

系统中每个进程的最大需求由一个大小为’n*m’的二维数组指定。如果Max[i, j] = k,则进程Pi最多可以请求’k’个资源类型Rj的实例。

分配。

当前分配给每个进程的每种资源的数量由一个大小为’n*m’的二维数组指定。进程由Allocation[i, j] = k表示,Pi此时已经获得了’k’个资源类型的实例。Rj

需要。

每个进程的剩余资源需求显示在一个大小为’n*m’的二维数组中。进程用Need[i, j] = k表示。现在,Pi需要 “k “个资源类型的实例。RjAllocation[i, j] – Maximum[i, j] = Need[i, j)

现在分配给进程Pi的资源由Allocationi标识,而进程Pi为了完成工作可能还需要的额外资源则由Needi标识。

安全算法和资源请求算法构成了银行家的算法。

安全的算法

以下是对确定系统是否处于安全状态的方法的描述。

1) 假设Work和Finish是两个向量,每个向量的长度为m和n。初始化。Work = Available当i=1, 2, 3, 4...n时,Finish[i]为假。2) 找到一个I,使其同时 a) Finish[i] = false b) Needi <= Work 如果这样的I不存在,则转到步骤(4)3) Work = Work + Allocation[i)完成[i] = true 转到第(2)步4) 如果每一个i的Finish[i] = true那么系统就处于安全状态。

资源请求的算法

让Requesti代表进程Pi的请求阵列。进程Pi请求K个资源类型Rj的实例,用Requesti [j] = k表示。当进程Pi提出资源请求时,会发生以下事情。

1) 如果Requesti >= Needi,则进入第2步;否则,报告一个错误条件,因为该过程提出的要求超过了它所能处理的范围。2) 如果Requesti <= Accessible,则进入步骤(3);否则,Pi将不得不等待,因为资源不可用。3) 改变状态,使系统看起来已经给了Pi所需的资源。请求-可用=可用Allocationi = Allocationi + RequestiNeedi = Needi - Requesti

以下是银行家的算法的执行情况

// Banker's Algorithm#includeint main(){    // P0 , P1 , P2 , P3 , P4 are the Process names here    int n , m , i , j , k;    n = 5; // Number of processes    m = 3; // Number of resources    int alloc[ 5 ] [ 3 ] = { { 0 , 1 , 0 }, // P0 // Allocation Matrix                        { 2 , 0 , 0 } , // P1                        { 3 , 0 , 2 } , // P2                        { 2 , 1 , 1 } , // P3                        { 0 , 0 , 2 } } ; // P4    int max[ 5 ] [ 3 ] = { { 7 , 5 , 3 } , // P0 // MAX Matrix                    { 3 , 2 , 2 } , // P1                    { 9 , 0 , 2 } , // P2                    { 2 , 2 , 2 } , // P3                    { 4 , 3 , 3 } } ; // P4    int avail[3] = { 3 , 3 , 2 } ; // Available Resources    int f[n] , ans[n] , ind = 0 ;    for (k = 0; k < n; k++) {        f[k] = 0;    }    int need[n][m];    for (i = 0; i < n; i++) {        for (j = 0; j < m; j++)            need[i][j] = max[i][j] - alloc[i][j] ;    }    int y = 0;    for (k = 0; k < 5; k++){        for (i = 0; i < n; i++){            if (f[i] == 0){                int flag = 0;                for (j = 0; j < m; j++) {                    if(need[i][j] > avail[j]){                        flag = 1;                        break;                    }                }                if ( flag == 0 ) {                    ans[ind++] = i;                    for (y = 0; y < m; y++)                        avail[y] += alloc[i][y] ;                    f[i] = 1;                }            }        }    }    int flag = 1;     for(int i=0;i " , ans[i]);    printf(" P%d ", ans[n - 1]);    }    return(0);}

输出

Following is the SAFE Sequence P1 -> P3 -> P4 -> P0 -> P2........................................................Process execute din 1.33 secondsPress any key to continue.

解释。

进程在进入系统时必须预测所需资源的最大数量,这可能在合理的时间内完成。与交互式系统相比,这种方法保持了固定数量的进程。必须有特定数量的资源可供分配,才能使这种技术发挥作用。如果一个小工具坏了,意外下线,该算法将无法运作。该方法将产生开销成本,因为当有几个进程和资源时,必须为每个进程调用该方法。

相关推荐