银行家算法

银行家算法,第1张

银行家算法 银行家算法 C语言

文章目录
  • 银行家算法 C语言
  • 前言
  • 一、银行家算法是什么?
  • 二、C语言代码(ubuntu下运行,已成功)
    • 1.实现效果
    • 2.代码及详细注释
  • 三、调代码时遇到的错误


前言

*** 作系统实验记录–银行家算法
一、实验目的
1)掌握安全性检测原理
2)掌握银行家算法

二、实验要求
1、要求学生进一步掌握如何 死锁的避免,进一步熟练使用数 组进行程序的设计及实现。
2、实现银行家算法、安全性检测算法。
3. 实验环境
1)每人一组,独立完成实验内容。
2)个人电脑1台,linux系统,安装gcc和vi等软件。

三、银行家算法中的数据结构:
1)可利用资源向量Available
2)最大需求矩阵Max
3)分配矩阵Allocation
4)需求矩阵Need。
安全性算法:
为每个进程分配所需要的资源,直至满足全部进程都能够顺利执行,不产生死锁。即能够找到满足全部进程执行的安全序列(路径)。
银行家算法:
如果进程申请的资源没有超过范围,先假定将该资源分配给该进程,而后更新相关数据机构,判断分配资源后系统是否安全。如果安全,则可以分配,反之则不分配。

四、算法流程图

一、银行家算法是什么?

必须学会1
必须学会2
看完之后,请日思夜想,你已经是一个银行家,在偌大事务中,你首先要解决的是银行家算法。怎么来衡量自己对该算法是否过关:
1.你的“巨有钱银行”面临了什么问题?提示:项目人申请借款,借吗?
2.借款的标准是什么?提示:申请是否合理,借了之后会不会倒闭?

二、C语言代码(ubuntu下运行,已成功)

关于写代码的经验,模仿别人的代码,把知识装进自己的脑子里。先熟悉整个代码逻辑,一个一个函数地去理解,先知道该函数的大概作用,然后在debug的过程中(也就是把每个函数调通的过程,可以使用printf()函数来调),加深理解。后面就可以很好地用起来了,百炼成钢!

1.实现效果

2.代码及详细注释
//银行家算法完整版

# include 
# include 

char NAME[100] = {0};    //资源名称
int Available[100]={0};  //可用资源数
int Max[50][100]={0};    //各个进程最大需求资源
int Need[50][100] = {0}; //各个矩阵实时所需资源
int Allocation[50][100] = {0};  //实时分配资源
int Request[50]={0};            //请求分配资源

int N=100;   //设定的最大资源数
int M=50;    //设定的最大进程数

//初始设定,包括初始的资源名称,资源数,进程数
//各个进程最大需求资源,和对各个进程初始分配的资源数

void init(){
        int i=0,j=0,m=0,n=0;  //i,j用来做循环,n,m分别用来更新最大资源数和进程数
        int number=0,flag=0;  //number用作记录单个资源数,falg标识数据是否异常,1为异常
        char name=' ' ;       //记录进程名的变量
        int temp[100]={0};    //记录各类资源的使用情况

        printf("系统可用资源种类为(<100):n");
        scanf("%d",&n);
        N = n;
        for(i=0;iAvailable[j]){
                                        flag = 1;
                                }
                        }
                }
                if(flag){
                        printf("n资源最大需求量大于系统中资源最大量,请重新输入n");

                }
        }while(flag);//获取合理的数据后退出


        do{
                flag = 0;
                printf("请输入各进程已经分配的资源量[Allocation]:n");
                for(i=0;iMax[i][j]){
                                        flag = 1;
                                }
                                Need[i][j] = Max[i][j] - Allocation[i][j];
                                temp[j] += Allocation[i][j];
                        }
                }
                if(flag){
                        printf("分配的资源大于最大需求量,请重新输入!n");
                        for(j = 0;j ");
                }
        }
        printf("n");
        return 1;
} 
void bank(){
        int flag = 1;   //申请资源是否合理标识
        int i=0,j=0;

        printf("请输入请求分配资源的进程号(1-%d):",M);
        scanf("%d",&i);

        printf("请输入进程P%d要申请的资源个数:n",i);
        for(j = 0;jNeed[i][j]){
                        printf("进程P%d申请的资源大于它需要的资源",i+1);
                        printf("分配不合理,不予分配!n");
                        flag = 0;
                        break;
                }
                else if(Request[j]>Available[j]){
                        printf("进程%d申请的资源大于现有的资源",i+1);
                        printf("分配不合理,不予分配!n");
                        flag = 0;
                        break;

                }
        }

        if(flag){ //合理只是第一个条件,接下来就是看是否安全
                test(i);
                if(Safe){
                         printf("准了!!");
                         showdata();
                }
                else if(!Safe()){
                        Retest(i);
                        showdata();
                }
        }
}
int main(){
        char choice;
        printf("t--------------------------------------------n");
        printf("t||                                        ||n");
        printf("t||          银行家算法的实现              ||n");
        printf("t||                                        ||n");
        printf("t||                                        ||n");
        printf("t--------------------------------------------n");
        init();
        showdata();
        if(!Safe()) {exit(0);}//避免一开始的要求就死锁


        do{
                printf("**********************************************n");
                printf("n");
                printf("n");
                printf("t---------------银行家算法演示---------------n");
                printf("           R(r):请求分配              n");
                printf("           E(e):退出                  n");
                printf("t--------------------------------------------n");
                printf("请选择:n");
                getchar();  //获取字符,程序就等着键盘
                scanf("%c",&choice);
                switch(choice){
                        case'r':
                        case'R':
                                bank();
                                break;
                        case'e':
                        case'E':
                                exit(0);
                }

        }while(choice);
        return 0;
}

三、调代码时遇到的错误

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5690801.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存