计算机考研408-操作系统-银行家算法

计算机考研408-操作系统-银行家算法

一、算法用途

避免死锁

二、算法背景

在现实生活的银行中,由于资金有限,客户申请贷款的数量也是有限的,每个客户在第一次申请贷款时要声明完成该项目所需的最大资金量,在满足所有贷款要求后,客户应及时归还贷款。银行家需要在客户申请的贷款数量不超过自己拥有的最大值时,都应尽量满足客户的需要。在计算机中,操作系统就好比银行家,资源就是资金,要申请资源的进程就相当于客户。银行家算法允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次分配资源的安全性。

三、算法原理

在银行家算法中,系统中的资源被分为不同类型,每个进程对这些资源有一定的需求。当一个进程请求资源时,系统会检查是否有足够的资源可用,以及分配给该进程后系统是否仍然处于安全状态。如果分配资源后系统会进入不安全状态,那么系统将拒绝分配资源,以避免可能导致死锁的情况发生。银行家算法通过动态地检查资源的分配情况,以及对未来可能的资源需求进行预测,来判断系统是否处于安全状态。如果系统处于安全状态,那么资源将被分配给进程;否则,资源分配将被延迟,直到系统重新进入安全状态。

四、算法优、缺点

1. 优点

银行家算法能够避免死锁,确保系统资源的有效利用。

2. 缺点

银行家算法需要提前知道每个进程的最大资源需求、资源分配必须是静态的等。因此,在实际应用中,银行家算法通常作为其他死锁避免策略的一部分来使用。

五、题目解析

Alt
如上表所示
P0、P1、P2、P3、P4:系统中目前运行的5个进程;
Max:进程对每个资源的最大需求;
Allocation:进程已经被分配的各类资源的数目;
Need:进程目前还需要的各类资源数目;
Available:系统中总共可以用的各资源的数目;
第一步,分析Available可知,目前可分配的资源有3个A资源、3个B资源和2个C资源;
第二步,分析Need可知,目前可分配资源可以满足请求的进程是:P1需要1个A资源、2个B资源和2个C资源;P3需要1个B资源和1个C资源,两个进程,满足其一即可;
第三步,在第二步选择满足P1进程之后(即Available减去1个A资源、2个B资源和2个C资源),Available还剩余的资源有:2个A资源、1个B资源。P1进入安全序列。P1进程完毕后会释放P1占有的所有资源(即Available加上3个A资源、2个B资源和2个C资源),此时Available还剩余的资源有:5个A资源、3个B资源和2个C资源;
·此时安全序列《P1》
第四步,再次回到第二步分析Need,目前可分配资源(Available还剩余的资源有:5个A资源、3个B资源和2个C资源)可以满足请求的进程是:P3需要1个B资源和1个C资源;P4需要4个A资源、3个B资源和1个C资源,两个进程,满足其一即可;
第五步,在第四步选择满足P3进程之后(即Available减去1个B资源和1个C资源),Available还剩余的资源有:5个A资源、2个B资源和1个C资源。P3进入安全序列。P3进程完毕后会释放P3占有的所有资源(即Available加上2个A资源、2个B资源和2个C资源),此时Available还剩余的资源有:7个A资源、4个B资源和3个C资源;
·此时安全序列《P1、P3》
第六步,再次回到第二步分析Need,目前可分配资源(Available还剩余的资源有:7个A资源、4个B资源和3个C资源)可以满足请求的进程是:P4需要4个A资源、3个B资源和1个C资源;P0需要7个A资源、4个B资源和3个C资源;P2需要6个A资源,三个进程,满足其一即可;
第七步,在第六步选择满足P4进程之后(即Available减去4个A资源、3个B资源和1个C资源),Available还剩余的资源有:3个A资源、1个B资源和2个C资源。P4进入安全序列。P4进程完毕后会释放P4占有的所有资源(即Available加上4个A资源、3个B资源和3个C资源),此时Available还剩余的资源有:7个A资源、4个B资源和5个C资源;
·此时安全序列《P1、P3、P4》
第八步,再次回到第二步分析Need,目前可分配资源(Available还剩余的资源有:7个A资源、4个B资源和5个C资源)可以满足请求的进程是:P0需要7个A资源、4个B资源和3个C资源;P2需要6个A资源,两个进程,满足其一即可;
第九步,在第八步选择满足P0进程之后(即Available减去7个A资源、4个B资源和3个C资源),Available还剩余的资源有:2个C资源。P0进入安全序列。P0进程完毕后会释放P0占有的所有资源(即Available加上7个A资源、5个B资源和3个C资源),此时Available还剩余的资源有:7个A资源、5个B资源和5个C资源;
·此时安全序列《P1、P3、P4、P0》
第十步,再次回到第二步分析Need,目前可分配资源(Available还剩余的资源有:7个A资源、5个B资源和5个C资源)可以满足请求的进程是:P2需要6个A资源;
第十一步,在第十步选择满足P2进程之后(即Available减去6个A资源),Available还剩余的资源有:1个A资源、5个B资源和5个C资源。P2进入安全序列。P2进程完毕后会释放P2占有的所有资源(即Available加上9个A资源和2个C资源),此时Available还剩余的资源有:10个A资源、5个B资源和7个C资源;
·此时安全序列《P1、P3、P4、P0、P2》
至此,所有进程均可安全运行,安全序列为P1->P3->P4->P0->P2
但是,我们在分析过程中发现,在第二步,我们也可以先选择给P3分配资源,同时,在第四步可以选择给P4分配资源,也可以在第六步选择给P0或者P2分配资源,也可以选择在第八步选择给P2分配资源,所以,银行家算法给出的安全序列在本题并不唯一,下面给出所有安全序列,供参考:
1 :P1->P3->P4->P0->P2
2 :P1->P3->P4->P2->P0
3 :P1->P4->P3->P0->P2
4 :P1->P4->P3->P2->P0
5 :P3->P1->P0->P2->P4
6 :P3->P1->P0->P4->P2
7 :P3->P1->P2->P0->P4
8 :P3->P1->P2->P4->P0
9 :P3->P1->P4->P0->P2
10:P3->P1->P4->P2->P0
11:P3->P4->P1->P0->P2
12:P3->P4->P1->P2->P0
(注:
Max = Allocation + Need
进程释放资源后的Available = 当前的Available - Need + Max
即 进程释放资源后的Available = 当前的Available + Allocation

计算过程中一定要很细心)

六、代码实现

#include <stdio.h>

#define DCB 5 //行
#define YXB 3 //列

int main() {
    // 初始化资源Available
    int available[DCB] = {3, 3, 2};

    // 初始化最大需求矩阵Max
    int max[DCB][YXB] = {
        {7, 5, 3},  
   		{3, 2, 2},  
    	{9, 0, 2},  
    	{2, 2, 2},  
    	{4, 3, 3} 
    };

    // 初始化已分配矩阵Allocation
    int allocation[DCB][YXB] = {
        {0, 1, 0},  
    	{2, 0, 0},  
    	{3, 0, 2},  
    	{2, 1, 1},  
    	{0, 0, 2}  
    };
	int need[DCB][YXB]; 
	
    // 计算需求矩阵
    for (int i = 0; i < DCB; i++) {
        for (int j = 0; j < YXB; j++) {
            need[i][j] = max[i][j] - allocation[i][j];
        }
    }

    // 检查系统是否处于安全状态
    int finish[DCB] = {0};
    int work[YXB];
    for (int i = 0; i < YXB; i++) {
        work[i] = available[i];
    }

    int safe_sequence[DCB];
    int count = 0;
    int found = 1;

    while (found) {
        found = 0;
        for (int i = 0; i < DCB; i++) {
            if (!finish[i]) {
                int j;
                for (j = 0; j < YXB; j++) {
                    if (need[i][j] > work[j]) {
                        break;
                    }
                }
                if (j == YXB) {
                    for (int k = 0; k < YXB; k++) {
                        work[k] += allocation[i][k];
                    }
                    finish[i] = 1;
                    safe_sequence[count++] = i;
                    found = 1;
                }
            }
        }
    }

    if (count == DCB ) {
        printf("系统处于安全状态,安全序列为:");
        for (int i = 0; i < DCB ; i++) {
            printf(" P%d", safe_sequence[i]);
        }
        printf("\n");
    } else {
        printf("系统处于不安全状态\n");
    }

    return 0;
}

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值