c语言银行家算法
来源:互联网 发布:股票dma源码 编辑:程序博客网 时间:2024/05/22 19:03
今天晚上上操作系统实验,刚刚才把实验报告补完。。。。。。。
#include<stdio.h>
#include<stdlib.h>
#include<stdlib.h>
#define PRONUM 5
typedef struct {//数据结构是参考网上的写的,保存abc三种资源的数量,以下的矩阵都可以用这个结构体的数组来表示
int a;
int b;
int c;
}sor;
int a;
int b;
int c;
}sor;
sor max[PRONUM]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};//初始化最大需求矩阵
sor ali[PRONUM]={{0,1,0},{2,0,0},{3,0,2},{2,1,1},{0,0,2}};//初始化已分配矩阵
sor need[PRONUM]={{7,4,3},{1,2,2},{6,0,0},{0,1,1},{4,3,1}};//初始化还需要的资源矩阵
sor source={3,3,2};//初始化系统所能提供的资源矩阵
sor ali[PRONUM]={{0,1,0},{2,0,0},{3,0,2},{2,1,1},{0,0,2}};//初始化已分配矩阵
sor need[PRONUM]={{7,4,3},{1,2,2},{6,0,0},{0,1,1},{4,3,1}};//初始化还需要的资源矩阵
sor source={3,3,2};//初始化系统所能提供的资源矩阵
int safeorder[PRONUM];//记录下安全序列
void tryali(int pro,sor *s){//尝试给进程分配资源
source.a -= s->a;//修改系统可以提供的资源数目,减去刚刚分配给进程的
source.b -= s->b;
source.c -= s->c;
source.b -= s->b;
source.c -= s->c;
ali[pro].a += s->a;//修改已经分配的资源矩阵,加上刚刚分配给进程的资源
ali[pro].b += s->b;
ali[pro].c += s->c;
ali[pro].b += s->b;
ali[pro].c += s->c;
need[pro].a -= s->a;//修改need矩阵,减去刚刚分配给进程的资源
need[pro].b -= s->b;
need[pro].c -= s->c;
}
need[pro].b -= s->b;
need[pro].c -= s->c;
}
void rollback(int pro,sor *s){//将系统资源分配恢复到初始状态
source.a += s->a;//修改系统可提供的资源数目,重新加上刚刚已经分配给进程的资源
source.b += s->b;
source.c += s->c;
source.b += s->b;
source.c += s->c;
ali[pro].a -= s->a;//修改已分配资源矩阵,减去刚刚分配给进程的资源
ali[pro].b -= s->b;
ali[pro].c -= s->c;
ali[pro].b -= s->b;
ali[pro].c -= s->c;
need[pro].a += s->a;//修改need矩阵,重新加回刚刚分配给进程的资源
need[pro].b += s->b;
need[pro].c += s->c;
}
need[pro].b += s->b;
need[pro].c += s->c;
}
int safecheck(){//安全性检查
sor work=source;//因为是尝试性地分配,故不能直接修改source,而是用work来代替
int finish[PRONUM]={0,0,0,0,0};//进程在未完成之前finish的值都为0
int i=0,j=0;//i用来for循环的计数,j用来记录安全序列
for(i=0;i<PRONUM;i++){
if(finish[i]==0){//如果进程未完成
if((need[i].a<=work.a)&&(need[i].b<=work.b)&&(need[i].c<=work.c)){//并且满足申请的资源小于等于系统当前所能提供的资源
//满足上述条件则表示进程有了可以执行完毕的条件,以下就让进程执行完毕
work.a += ali[i].a;//回收进程所占有的资源
work.b += ali[i].b;
work.c += ali[i].c;
finish[i]=1;//将finish的值改为1
safeorder[j++]=i;//在安全序列中记录下进程的标号
i=-1;//因为不一定每个进程在满足量finish条件后都满足申请资源小于系统提供资源,因此for循环还要从i=0开始扫描
//因此要把i的值改变,以便重新赋值
}
}
}
for(i=0;i<PRONUM;i++){//若是所有进程的finish=1,则表示此次分配不会造成死锁,进程都可以顺利完成
if(finish[i]==0){//如果有一个进程无法完成,则表示此次分配不安全,返回0
return 0;//
}
}
return 1;//反之,返回1
}
int finish[PRONUM]={0,0,0,0,0};//进程在未完成之前finish的值都为0
int i=0,j=0;//i用来for循环的计数,j用来记录安全序列
for(i=0;i<PRONUM;i++){
if(finish[i]==0){//如果进程未完成
if((need[i].a<=work.a)&&(need[i].b<=work.b)&&(need[i].c<=work.c)){//并且满足申请的资源小于等于系统当前所能提供的资源
//满足上述条件则表示进程有了可以执行完毕的条件,以下就让进程执行完毕
work.a += ali[i].a;//回收进程所占有的资源
work.b += ali[i].b;
work.c += ali[i].c;
finish[i]=1;//将finish的值改为1
safeorder[j++]=i;//在安全序列中记录下进程的标号
i=-1;//因为不一定每个进程在满足量finish条件后都满足申请资源小于系统提供资源,因此for循环还要从i=0开始扫描
//因此要把i的值改变,以便重新赋值
}
}
}
for(i=0;i<PRONUM;i++){//若是所有进程的finish=1,则表示此次分配不会造成死锁,进程都可以顺利完成
if(finish[i]==0){//如果有一个进程无法完成,则表示此次分配不安全,返回0
return 0;//
}
}
return 1;//反之,返回1
}
int request(int pro,sor *s){//处理进程当前的资源请求
if((s->a<=need[pro].a)&&(s->b<=need[pro].b)&&(s->c<=need[pro].c)){//判断进程是否多申请了资源
if((s->a<=source.a)&&(s->b<=source.b)&&(s->c<=source.c)){//判断当前系统所能提供的资源是否满足进程申请的数量
tryali(pro,s);//满足以上条件则尝试分配
if(safecheck()==1){//判断分配后系统是否处于安全状态,如果是,返回1
return 1;
}
else{
printf("error deadlock!\n");//反之发出错误提示
printf("rolling back now.......\n");
rollback(pro,s);//将系统恢复到未分配前的状态
}
}
else {//如果当前系统提供的资源不能满足进程的申请,则出错
printf("the sources are not enough!\n");
}
}
else {//如果进程申请的资源数大于进程所需要的资源数,则出错
printf("too much application!\n");
}
return 0;//不能完成分配则返回0
}
if((s->a<=source.a)&&(s->b<=source.b)&&(s->c<=source.c)){//判断当前系统所能提供的资源是否满足进程申请的数量
tryali(pro,s);//满足以上条件则尝试分配
if(safecheck()==1){//判断分配后系统是否处于安全状态,如果是,返回1
return 1;
}
else{
printf("error deadlock!\n");//反之发出错误提示
printf("rolling back now.......\n");
rollback(pro,s);//将系统恢复到未分配前的状态
}
}
else {//如果当前系统提供的资源不能满足进程的申请,则出错
printf("the sources are not enough!\n");
}
}
else {//如果进程申请的资源数大于进程所需要的资源数,则出错
printf("too much application!\n");
}
return 0;//不能完成分配则返回0
}
void show(){//打印出各个矩阵
printf("*********************source table*****************************\n");
printf("pro max ali need source\n");
printf(" a b c a b c a b c a b c \n");
printf("p0 %d %d %d %d %d %d %d %d %d %d %d %d\n",max[0].a,max[0].b,max[0].c,ali[0].a,ali[0].b,ali[0].c,need[0].a,need[0].b,need[0].c,source.a,source.b,source.c);
printf("p1 %d %d %d %d %d %d %d %d %d \n",max[1].a,max[1].b,max[1].c,ali[1].a,ali[1].b,ali[1].c,need[1].a,need[1].b,need[1].c);
printf("p2 %d %d %d %d %d %d %d %d %d \n",max[2].a,max[2].b,max[2].c,ali[2].a,ali[2].b,ali[2].c,need[2].a,need[2].b,need[2].c);
printf("p3 %d %d %d %d %d %d %d %d %d \n",max[3].a,max[3].b,max[3].c,ali[3].a,ali[3].b,ali[3].c,need[3].a,need[3].b,need[3].c);
printf("p4 %d %d %d %d %d %d %d %d %d \n",max[4].a,max[4].b,max[4].c,ali[4].a,ali[4].b,ali[4].c,need[4].a,need[4].b,need[4].c);
printf("********welcome to huazhong agriculture university!*************\n");
}
printf("*********************source table*****************************\n");
printf("pro max ali need source\n");
printf(" a b c a b c a b c a b c \n");
printf("p0 %d %d %d %d %d %d %d %d %d %d %d %d\n",max[0].a,max[0].b,max[0].c,ali[0].a,ali[0].b,ali[0].c,need[0].a,need[0].b,need[0].c,source.a,source.b,source.c);
printf("p1 %d %d %d %d %d %d %d %d %d \n",max[1].a,max[1].b,max[1].c,ali[1].a,ali[1].b,ali[1].c,need[1].a,need[1].b,need[1].c);
printf("p2 %d %d %d %d %d %d %d %d %d \n",max[2].a,max[2].b,max[2].c,ali[2].a,ali[2].b,ali[2].c,need[2].a,need[2].b,need[2].c);
printf("p3 %d %d %d %d %d %d %d %d %d \n",max[3].a,max[3].b,max[3].c,ali[3].a,ali[3].b,ali[3].c,need[3].a,need[3].b,need[3].c);
printf("p4 %d %d %d %d %d %d %d %d %d \n",max[4].a,max[4].b,max[4].c,ali[4].a,ali[4].b,ali[4].c,need[4].a,need[4].b,need[4].c);
printf("********welcome to huazhong agriculture university!*************\n");
}
int main(){
char ch='y';//作为是否继续分配的条件判断
printf("check the system\n");
if(safecheck()==1){//检测当前的系统是否安全
printf("the system is safe now!\n");
}
else{
printf("the system is not safe now,we will get out!\n");
}
do{
int pro;
sor s;
show();//打印出当前的资源分配情况
printf("please input the number of process and the number of source:\n");
scanf("%d %d %d %d",&pro,&s.a,&s.b,&s.c);//输入申请资源的进程号以及所需各个资源的数目
if(request(pro,&s)==1){//处理资源请求
printf("success!\n");
}
else{
printf("failed!\n");
}
printf("continue or not?\n");
fflush(stdin);
ch=getchar();
}while(ch=='y');
char ch='y';//作为是否继续分配的条件判断
printf("check the system\n");
if(safecheck()==1){//检测当前的系统是否安全
printf("the system is safe now!\n");
}
else{
printf("the system is not safe now,we will get out!\n");
}
do{
int pro;
sor s;
show();//打印出当前的资源分配情况
printf("please input the number of process and the number of source:\n");
scanf("%d %d %d %d",&pro,&s.a,&s.b,&s.c);//输入申请资源的进程号以及所需各个资源的数目
if(request(pro,&s)==1){//处理资源请求
printf("success!\n");
}
else{
printf("failed!\n");
}
printf("continue or not?\n");
fflush(stdin);
ch=getchar();
}while(ch=='y');
}
测试数据:
1 1 1 1 0 7 5 4 4 4 2 1 0 2 2 1
测试结果:
1111 分配成功
0754 申请资源数目大于所需资源数目
4421 申请资源数目大于此时系统所能提供的资源数目
0221 发生死锁
0 0
- c语言银行家算法
- 银行家算法 C语言
- C语言实现银行家算法
- C语言实现银行家算法
- 【c语言/vs2010】银行家算法
- 银行家算法C语言模拟程序
- C语言实现操作系统银行家算法
- C语言实现 操作系统 银行家算法
- 银行家算法的C语言实现
- 操作系统–银行家算法c语言代码
- 银行家算法模拟-----c++语言(其实质也是c语言)
- 银行家算法c模拟
- c 银行家算法
- C ++ 银行家算法
- 银行家算法(C++)
- 银行家算法的一种实现——使用C语言
- 操作系统之——银行家算法C语言实现
- 银行家算法的C实现
- [Wondgirl] iOS-日历
- 大公司里怎样开发和部署前端代码?
- 大型JavaWeb分布式系统中关于maven多模块构建以及代码依赖管理
- 常见浏览器兼容性问题与解决方案
- skyline中改变模型颜色
- c语言银行家算法
- RxJava 详解
- 【编程之法】有趣的字符串全排列
- Android studio使用Git进行协同开发
- ThreadPoolTaskExecutor 多线程分解执行耗时任务与单线程串行执行简单比较
- 对U盘作死后怎么恢复,记在把U盘变成fedora启动盘失去内存之后
- 天气预报
- Python学习笔记(3)
- ERP实施顾问是干什么的?