- 银行家算法 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.借款的标准是什么?提示:申请是否合理,借了之后会不会倒闭?
关于写代码的经验,模仿别人的代码,把知识装进自己的脑子里。先熟悉整个代码逻辑,一个一个函数地去理解,先知道该函数的大概作用,然后在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;i Available[j]){ flag = 1; } } } if(flag){ printf("n资源最大需求量大于系统中资源最大量,请重新输入n"); } }while(flag);//获取合理的数据后退出 do{ flag = 0; printf("请输入各进程已经分配的资源量[Allocation]:n"); for(i=0;i Max[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;j Need[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; }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)