银行家算法--申请资源

这篇具有很好参考价值的文章主要介绍了银行家算法--申请资源。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

银行家算法–申请资源

问题描述:
输入N个进程(N<=100),以及M类资源(M<=100),初始化各种资源的总数,T0时刻资源的分配情况。例如: 假定系统中有5个进程{P0,P1,P2,P3,P4}和三类资源{A,B,C},各种资源的数量分别为10、5、7,在T0时刻的资源分配图如下:
银行家算法--申请资源
输入申请资源的进程以及申请各类资源的数目,判断是否分配。若分配,输出”可以找到安全序列,可以分配。“并输出分配后的系统状态。若不分配,输出”找不到安全序列,不予分配。“并输出当前系统状态。

输入格式:
第一行输入进程数量N,第二行输入资源类数M,第三行输入M类资源个类资源的总数,以下N行分别输入每个进程的名字,该进程对M类资源的最大需求以及已分配资源。最后一行输入申请进程的名字和申请各类资源的数目。

输出格式:
若分配,输出”可以找到安全序列,可以分配。“并输出分配后的系统状态。

若不分配,给出不分配的原因:

  1. 若输入的进程的名字不正确,输出”查无此进程。“并输出当前系统状态。
  2. 若申请的资源数目大于最大需求,输出”需求不合理,不予分配。“并输出当前系统状态。
  3. 若申请的资源数目大于剩余资源,输出”剩余资源不足,不予分配。“并输出当前系统状态。
  4. 若找不到安全序列,输出”找不到安全序列,不予分配。“并输出当前系统状态。

输入样例1:
在这里给出一组输入。例如:

5
3
10 5 7
P0 7 5 3 0 1 0
P1 3 2 2 2 0 0
P2 9 0 2 3 0 2
P3 2 2 2 2 1 1
P4 4 3 2 0 0 2
P1 1 0 2

输出样例1:
在这里给出相应的输出。例如:

可以找到安全序列,可以分配。
name max allocation need available
P0 7 5 3 | 0 1 0 | 7 4 3 | 2 3 0
P1 3 2 2 | 3 0 2 | 0 2 0 |
P2 9 0 2 | 3 0 2 | 6 0 0 |
P3 2 2 2 | 2 1 1 | 0 1 1 |
P4 4 3 2 | 0 0 2 | 4 3 0 |

输入样例2:
在这里给出一组输入。例如:

5
3
10 5 7
P0 7 5 3 0 1 0
P1 3 2 2 2 0 0
P2 9 0 2 3 0 2
P3 2 2 2 2 1 1
P4 4 3 2 0 0 2
P5 1 0 2

输出样例2:
在这里给出相应的输出。例如:

查无此进程。
name max allocation need available
P0 7 5 3 | 0 1 0 | 7 4 3 | 3 3 2
P1 3 2 2 | 2 0 0 | 1 2 2 |
P2 9 0 2 | 3 0 2 | 6 0 0 |
P3 2 2 2 | 2 1 1 | 0 1 1 |
P4 4 3 2 | 0 0 2 | 4 3 0 |

代码实现(C语言):

#include<stdio.h>
#include<string.h>
typedef struct process{
    char name[2];
    int max[4],allocation[4],need[4];
    bool flag;
}p;

void countNeed(p pro[],int available[],int available_01[],int proNumber,int sourNumber);
int checkSafe(p pro[],int available[],int available_01[],int proNumber,int sourNumber,char requireName[],int requireSource[]);
void printAll(p pro[],int available[],int proNumber,int sourNumber);

int main(){
    int proNumber,sourNumber,flag,i,j;
    scanf("%d",&proNumber);
    scanf("%d",&sourNumber);
    int available[sourNumber],available_01[sourNumber],requireSource[sourNumber];
    p pro[proNumber];
    char requireName[2];
    //初始化资源总数
    for(i=0;i<sourNumber;i++){
        scanf("%d",&available[i]);
    }
    //初始化进程的资源使用情况
    for(i=0;i<proNumber;i++){
        scanf("%s",&pro[i].name);
        pro[i].flag = false;
        for(j=0;j<sourNumber;j++){
            available_01[j] = available[j];
            scanf("%d",&pro[i].max[j]);
        }
        for(j=0;j<sourNumber;j++){
            scanf("%d",&pro[i].allocation[j]);
        }
    }
    //初始化请求进程及其资源请求数
    scanf("%s",&requireName);
    for(j=0;j<sourNumber;j++){
            scanf("%d",&requireSource[j]);
        }
    
    countNeed(pro,available,available_01,proNumber,sourNumber);
    
    flag = checkSafe(pro,available,available_01,proNumber,sourNumber,requireName,requireSource);
    if(flag == 0){
        printf("可以找到安全序列,可以分配。\n");
        printAll(pro,available_01,proNumber,sourNumber);
    }
    if(flag == 1){
        printf("查无此进程。\n");
        printAll(pro,available_01,proNumber,sourNumber);
    }
    if(flag == 2){
        printf("需求不合理,不予分配。\n");
        printAll(pro,available_01,proNumber,sourNumber);
    }
    if(flag == 3){
        printf("剩余资源不足,不予分配。\n");
        printAll(pro,available_01,proNumber,sourNumber);
    }
    if(flag == 4){
        printf("找不到安全序列,不予分配。\n");
        printAll(pro,available_01,proNumber,sourNumber);
    }
    
    return 0;
}

void countNeed(p pro[],int available[],int available_01[],int proNumber,int sourNumber){
    int i,j;
    for(i=0;i<proNumber;i++){
        for(j=0;j<sourNumber;j++){
            pro[i].need[j] = pro[i].max[j] - pro[i].allocation[j];
            available[j] -= pro[i].allocation[j];
            available_01[j] = available[j];
        }
    }
}

int checkSafe(p pro[],int available[],int available_01[],int proNumber,int sourNumber,char requireName[],int requireSource[]){
    int i,j,sum=0,sum1=0,sum2=0,count=0,countRequire=-1;
    bool flagAll = false,flagAll_01 = false;
    //进行名称和请求资源数和need资源数的比较
    for(i=0;i<proNumber;i++){
        if(strcmp(requireName,pro[i].name) == 0) {
            countRequire=i;
            for(j=0;j<sourNumber;j++){
                if(requireSource[j]<=pro[i].need[j]) sum1++;
                if(requireSource[j]<=available[j]) sum2++;
        }
    }
}
    //printf("%d %d %d \n",countRequire,sum1,sum2);
    
    //countRequire != -1存在进程名称相等的进程
    if(countRequire != -1&&sum1 == sourNumber &&sum2 == sourNumber){
    	//对请求的进程进行初始化 
    	for(j=0;j<sourNumber;j++){
    		    available[j] -= requireSource[j];
                pro[countRequire].allocation[j] += requireSource[j];
                pro[countRequire].need[j] -= requireSource[j];
        }
        
        while(sum<proNumber){
         for(i=0;i<proNumber;i++){
         	sum1 = 0;
            if(pro[i].flag == false){
                 for(j=0;j<sourNumber;j++){
                    if(pro[i].need[j]<=available[j]) sum1++;
                    }
            
            if(sum1 == sourNumber) {
                    for(j=0;j<sourNumber;j++)
                    available[j] += pro[i].allocation[j];
                    
            pro[i].flag = true;
            sum++;
        } 
      }
    }
        count+=6;
        if(count == 54) break;
  }
    }
    else if(countRequire == -1){
        return 1; //1.若输入的进程的名字不正确,输出”查无此进程。“并输出当前系统状态。
    }else if(sum1 != sourNumber) return 2; //2.若申请的资源数目大于最大需求,输出”需求不合理,不予分配。“并输出当前系统状态。
    else if(sum2 != sourNumber) return 3; //3.若申请的资源数目大于剩余资源,输出”剩余资源不足,不予分配。“并输出当前系统状态。
 
    if(sum == proNumber) {
    	 for(j=0;j<sourNumber;j++){
    	 	available_01[j] -=  requireSource[j];
		 }
                
		return 0;  //给人家分配!
}
    else if(sum != proNumber) {
    	for(j=0;j<sourNumber;j++){
    	 	pro[countRequire].allocation[j] -= requireSource[j];
            pro[countRequire].need[j] += requireSource[j];
		 }
	return 4; //4.若找不到安全序列,输出”找不到安全序列,不予分配。“并输出当前系统状态。
    
}
}
 

void printAll(p pro[],int available[],int proNumber,int sourNumber){
    printf("name max allocation need available\n");
    int i,j;
    for(i=0;i<proNumber;i++){
        printf("%s ",pro[i].name);
        for(j=0;j<sourNumber;j++){
            printf("%d ",pro[i].max[j]);
        }
        printf("| ");
        for(j=0;j<sourNumber;j++){
            printf("%d ",pro[i].allocation[j]);
        }
        printf("| ");
        for(j=0;j<sourNumber;j++){
            printf("%d ",pro[i].need[j]);
        }
        if(i == 0){
            printf("| ");
            for(j=0;j<sourNumber;j++){
                if(j == sourNumber-1)
            printf("%d",available[j]);
                else printf("%d ",available[j]);
        }
       }else printf("|");
        printf("\n");
    }
}


写在最后各位看到此博客的小伙伴,如有疑问或者不对的地方请及时通过私信我或者评论此博客的方式指出,以免误人子弟。多谢!

谢谢浏览!文章来源地址https://www.toymoban.com/news/detail-435868.html

到了这里,关于银行家算法--申请资源的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [操作系统] 银行家算法

    如果系统按照这种序列分配资源,则每个进程都能顺利完成。只要能找出一个安全序列,系统就是安全状态。 当然,安全序列可能有多个 。 此时你是一位成功的银行家,手里有100亿资金… 此时有三个企业想找你贷款,分别是企业B,企业A,企业T B:“大哥,我最多要借70亿

    2023年04月08日
    浏览(35)
  • 操作系统-银行家算法

    目录 一、银行家算法 二、银行家算法的流程和数据结构 1.数据结构 2.步骤流程 3.安全性算法 三、举例 解题思路 答案 为了避免死锁,出现了银行家算法。 系统必须确保是否有足够的资源分配给一个进程,若有,再计算分配后系统是否会处于不安全状态,若安全,才会分配。

    2024年02月02日
    浏览(44)
  • 操作系统实验——银行家算法

    掌握银行家算法思想,并能编程实现。 1、在Linux环境下编译运行程序; 2、按照教材的算法编写; 3、(*)输入数据从文本文件中读出,不从键盘录入,数据文件格式见以下说明; 4、主要数据结构的变量名和教材中的一致,包括Available、Max、Allocation、Need、Request、Work、Fin

    2024年02月01日
    浏览(39)
  • C语言实现银行家算法

    银行家算法 最初是由荷兰计算机科学家艾兹赫尔·迪杰斯特拉(Edsger W. Dijkstra)于1965年提出的。当时他正致力于解决多道程序设计中产生的死锁问题。在多道程序设计中,由于不同进程之间共享有限的系统资源,如内存、I/O设备等,因此存在一个进程等待其他进程释放资源而

    2024年02月05日
    浏览(40)
  • 银行家算法 源码+实验报告(用了自取)

    XI`AN TECHNOLOGICAL UNIVERSITY 课程设计报告 实验课程名称 操作系统—银行家算法     专    业 :计算机科学与技术          班    级 :                姓    名 :                   学    号 :          实验学时 :                     

    2024年02月09日
    浏览(43)
  • 操作系统实验 银行家算法C++

    实验目的: 编程实现安全性算法及银行家算法,以帮助深刻理解银行家算法避免死锁的原理。 算法流程图:     实现代码:    验证数据: 运行结果:     说明: 本文章是在原作者的银行家算法文章基础上依据实验课要求修改和完善的,仅供参考,侵权删。  原作者地址

    2024年02月05日
    浏览(44)
  • C++ 银行家算法与时间片轮转调度算法结合

    声明:未经允许,请勿转载 一.实验目的 (1) 掌握 RR(时间片调度) 算法,了解 RR 进程调度 (2) 了解死锁概念,理解安全状态,并且理解银行家算法 (3) 利用 RR 进程调度与银行家算法结合,写出一个简单的项目 二.实验原理 2.1 时间片调度算法       在分时系统中都采用时间片轮

    2024年02月08日
    浏览(40)
  • 银行家算法——C++实现 [ 开源代码 + 详细解析 ]

    ✅ (原创,纯手敲,开源免费,2021的最后一篇) Banker Algorithm 🏦 ◆ 说明 :上述算法的核心实现采用了 “DFS + 回溯” 的方法,详见后文的源代码。另外,如果把 C++ 代码里面的 “ p_num=1; ” 注释掉,得到的是另一个结果。我虽然输入是“0”,但代码里后面我直接把 p_num 赋值

    2023年04月26日
    浏览(74)
  • 【操作系统原理实验】银行家算法模拟实现

    选择一种高级语言如C/C++等,编写一个银行家算法的模拟实现程序。1) 设计相关数据结构;2) 实现系统资源状态查看、资源请求的输入等模块;3) 实现资源的预分配及确认或回滚程序;4) 实现系统状态安全检查程序;5) 组装各模块成一个完整的模拟系统。 (1)设计思想: 1、

    2024年02月01日
    浏览(44)
  • 【操作系统】银行家算法个人出题例题 (含答案)

    1.银行家算法是代表性的避免死锁的算法,在进程调度中具有重要作用。请结合所学知识回答以下问题:(23分——加长版) (1)银行家算法使用的四个必要的数据结构是:可用资源向量Available,____________,分配矩阵Allocation,需求矩阵Need。(1分) (2)以下是银行家算法具体实现

    2024年02月12日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包