#include

#include

#include

int Available[10];           //可使用资源向量

int Max[10][10];             //最大需求矩阵

int Allocation[10][10]={0};      //分配矩阵

int Need[10][10]={0};            //需求矩阵

int Work[10];                //工作向量

int Finish[10];              //状态标志

int Request[10][10];         //进程申请资源向量

int Pause[10];

int List[10];

int i,j;

int n;                       //系统资源总数

int m;                       //总的进程数

int a;                       //当前申请的进程号

int l,e;                     //计数器

int b=0,c=0,f=0,g;           //计数器

void mainenter()//主要的输入部分代码

{

printf("请输入系统总共有的资源数:");

scanf("%d",&n);

printf("请输入总共有多少个进程:");

scanf("%d",&m);

for(i=1;i<=n;i++)

{

printf("第%d类资源有的资源实例:",i);

scanf("%d",&Available[i]);

}

for(i=1;i<=m;i++)

{

for(j=1;j<=n;j++)

{

printf("进程P[%d]对第%d类资源的最大需求量:",i,j);

scanf("%d",&Max[i][j]);

Need[i][j]=Max[i][j];

}

}

}

void mainrequest()  //进程提出新申请的代码部分

{

printf("请输入申请资源的进程:");

scanf("%d",&a);

for(i=1;i<=n;i++)

{

printf("请输入进程P[%d]对%d类资源的申请量:",a,i);

scanf("%d",&Request[a][i]);

if(Request[a][i]>Need[a][i])

printf("n出错!进程申请的资源数多于它自己申报的最大量n");

if(Request[a][i]>Available[i])

printf("nP[%d]必须等待n",a);

//以下是试探性分配

Available[i]=Available[i]-Request[a][i];

Allocation[a][i]=Allocation[a][i]+Request[a][i];

Need[a][i]=Need[a][i]-Request[a][i];

Work[i]=Available[i];

}

for(i=1;i<=m;i++)

{

Pause[i]=Available[i];//Pause[i]只是一个暂时寄存的中间变量,为防止在下面

//安全性检查时修改到Available[i]而代替的一维数组

Finish[i]=false;

}

for(g=1;g<=m;g++)

{

for(i=1;i<=m;i++)

{

b=0;                 //计数器初始化

for(j=1;j<=n;j++)

{

if(Need[i][j]<=Pause[j])

{

b=b+1;

}

if(Finish[i]==false&&b==n)

{

for(l=1;l<=n;l++)

{

Pause[l]=Pause[l]+Allocation[i][l];

}

Finish[i]=true;

printf("$ %d ",i);//依次输出进程安全序列之一中每个元素

}

}

}

}

printf("n");

for(i=1;i<=m;i++)

{

if(Finish[i]==true) f=f+1;//统计Finish[i]==true的个数

}

if (f==m)

{

printf("safe static");

f=0;//将计数器f重新初始化,为下一次提出新的进程申请做准备

}

else

{

printf(" unsafe static ");//以下代码为当系统被判定为不安全状态时

//返回提出申请前的状态

for(i=1;i<=n;i++)

{

Available[i]=Available[i]+Request[a][i];

Allocation[a][i]=Allocation[a][i]-Request[a][i];

Need[a][i]=Need[a][i]+Request[a][i];

}

}

}

void mainprint()

{

printf("当前的系统状态n");

printf("        目前占有量     最大需求量      尚需要量 n进程");

for(i=1;i<=n;i++)

for(j=1;j<=n;j++)

{

printf("  %d类",j);

}

for(i=1;i<=m;i++)

{

printf("nP[%d]",i);

for(j=1;j<=n;j++)

{

printf("   %d ",Allocation[i][j]);

}

for(j=1;j<=n;j++)

{

printf("   %d ",Max[i][j]);

}

for(j=1;j<=n;j++)

{

printf("   %d ",Need[i][j]);

}

}

printf("nn系统剩余资源量:   ");

for(i=1;i<=n;i++)

{

printf("   %d ",Available[i]);

}

printf("n");

}

void main()

{ int k,h=1;

while(h)

{  system("cls");

{

printf("nn            ★ 欢迎使用本程序 ★n");

printf("nn  1:输入系统的资源数、申请进程数、每个类资源的实例数");

printf("n  2:……………………………………  输入进程的资源申请");

printf("n  3:……………………………………………  输出系统状态");

printf("n  4:…………………………………………………  退出程序");

printf("nn please choose ");

scanf("%d",&k);

}

switch(k)

{

case 1:mainenter();      break;

case 2:mainrequest();      break;

case 3:mainprint();      break;

case 4:h=0;        break;

}

printf("n");

system("pause");

}

system("cls");

printf("nn       谢谢使用 n");

printf("nn  See you next time!!!nnn");

}

c语言银行家算法模拟程序,银行家算法C语言模拟程序相关推荐

  1. 实验题目:用银行家算法和随机算法实现资源分配

    实验题目:用银行家算法和随机算法实现资源分配 实验原理: 银行家算法的分配资源是:当某个进程提出资源申请时,假定先分配资源给它,然后查找各进程的剩余请求,检查系统剩余资源量是否由于进程的分配而导致系统 ...

  2. 操作系统——银行家算法(银行家和房地产开发商的爱恨情仇)

    操作系统--银行家算法 什么是银行家算法 银行家算法(Banker's Algorithm)是一个避免死锁(Deadlock)的著名算法,是由艾兹格·迪杰斯特拉在1965年为T.H.E系统设计的一种避 ...

  3. 【每日算法】C语言8大经典排序算法(2)

    接上文--->[每日算法]C语言8大经典排序算法(1) 二.插入类排序 插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中 ...

  4. 数据结构源码笔记(C语言):置换-选择算法

    //实现置换-选择算法#include<stdio.h> #include<malloc.h> #include<string.h> #include<std ...

  5. Algorithm:C+语言实现之数组相关算法(和为定值的两个数、和为定值的m个数、荷兰国旗、长度为2n的洗牌算法、任意长度数组的洗牌算法)

    Algorithm:C+语言实现之数组相关算法(和为定值的两个数.和为定值的m个数.荷兰国旗.长度为2n的洗牌算法.任意长度数组的洗牌算法) 目录 数组 1.寻找和为定值的两个数 2.和为定值的m个数 ...

  6. Algorithm:C++语言实现之队列相关算法(最短路径条数问题、拓扑排序)

    Algorithm:C++语言实现之队列相关算法(最短路径条数问题.拓扑排序) 目录 队列 1.最短路径条数问题 2.拓扑排序 队列 1.最短路径条数问题

  7. Algorithm:C++语言实现之链表相关算法(单链公共结点问题、一般LCA、括号匹配、最长括号匹配、逆波兰表达式Reverse Polish Notation、直方图矩形面积、收集雨水问题)

    Algorithm:C++语言实现之链表相关算法(单链公共结点问题.一般LCA.括号匹配.最长括号匹配.逆波兰表达式Reverse Polish Notation.直方图矩形面积.收集雨水问题) 目录 ...

  8. Algorithm:C++语言实现之贪心法算法相关问题

    Algorithm:C++语言实现之贪心法算法相关问题 目录 一.贪心法 一.贪心法 1.LIS的算法分析

  9. Algorithm:C++语言实现之链表相关算法(链表相加、链表的部分翻转、链表划分、链表去重、重复元素全部删除)

    Algorithm:C++语言实现之链表相关算法(链表相加.链表的部分翻转.链表划分.链表去重.重复元素全部删除) 目录 一.链表 1.1.链表相加 1.2.链表相加 2.1.链表的部分翻转 2.2. ...

  10. Algorithm:C++语言实现之字符串相关算法(字符串的循环左移、字符串的全排列、带有同个字符的全排列、串匹配问题的BF算法和KMP算法)

    Algorithm:C++语言实现之字符串相关算法(字符串的循环左移.字符串的全排列.带有同个字符的全排列.串匹配问题的BF算法和KMP算法) 目录 一.字符串的算法 1.字符串的循环左移 2.字符串 ...

最新文章

  1. Python学习日志(5)- Numpy
  2. java中的日期时间的计算与比较
  3. Yii2系列教程三:Database And Gii
  4. 我的vscode配置 利用Settings Sync一键安装
  5. Wave 文件(5): 获取 Wave 文件的格式信息
  6. 浙江义乌计算机中专学校,浙江义乌有没有中专学校?
  7. Dijkstra Algorithm (迪杰斯特拉算法)
  8. Java多线程学习十三:synchronized 和 Lock 区别以及孰优孰劣,如何选择?
  9. rbf神经网络参数设置_基于梯度下降法的RBF神经网络逼近(03)
  10. Kettle Spoon入门教程
  11. Java基础——链表
  12. 外星人笔记本 键盘灯不亮解决 Alienware 13
  13. 计算机病毒鼻祖拟推新型搜索技术挑战谷歌,美科学家将推新型搜索引擎挑战谷歌...
  14. OpenCv鼠标事件
  15. HDU6184 Counting Stars
  16. 2017CS231n李飞飞深度视觉识别笔记(二)——图像分类
  17. MFC中画出圆形按钮,告别方形普通按钮
  18. c#为什么用的人很少
  19. hog特征与fhog特征
  20. nacos和eruka的区别

热门文章

  1. mysql hibernate 分页查询_hibernate分页查询的实现
  2. android 软件 加密方法,Android中WIFI常见的几种加密方式(详细)
  3. php 检测 变量是否设置,PHP中检测一个变量是否有设置的函数是什么?
  4. mysql数据库产生的背景_MySql路途之mysql背景
  5. 梭织布印染后整理瑕疵最全解读
  6. VS2013下使用QT和MFC的错误解决方案
  7. java web listener_JavaWeb:Listener
  8. ThinkJS入门+实例(实现认证权限等基本功能)
  9. Trace obtained enqueue information by set event 10704
  10. centos7安装mysql主从_centos7 安装mysql 和主从复制