计算机操作系统课设需要,写了两个下午的银行家算法(陷在bug里出不来耽误了很多时间),参考计算机操作系统(汤子瀛)

    实现过程中不涉及难度较大的算法,仅根据银行家算法的思想和步骤进行实现。以下为详细步骤:  

  •  定义:

max1[ ][ ] : 最大需求矩阵,max1[i][j]为第i条进程的第j项资源的最大需求数目;

      allocation[ ][ ] : 分配矩阵,allocation[i][j]为第i条进程已分得的第j项资源的数目;

      need[ ][ ] : 需求矩阵,need[i][j]为第i条进程尚需要的第j项资源的数目;

      available[ ] : 可利用资源量,available[i]为系统中第i项资源的可分配数目;

      request[ ][ ] : 请求矩阵,request[i][j]表示第i条进程对第j项资源的请求数目;//可以改成一维数组

    int safe (int n,int m,int work) : n条进程,m项进程,返回值为1时当前状态安全,否则不安全;

  •  程序流程:   
  1. 键盘输入max1矩阵,allocation矩阵,available数组,计算出need矩阵。
  2. 判断当前时刻系统的状态是否安全。true 转向3,false转向7 
  3. 判断当前时刻request<=need。true 转向4,false 转向7 
  4. 判断当前时刻request<=available。true 转向5,false 转向7
  5. 进行安全性算法检测。true 转向6,false 转向7
  6. 系统分配资源并继续等待指令。
  7. 系统不予分配资源并输出原因。
  • 安全性算法  :  每次从第一个进程开始检测,如遇到所有的m项资源都可以满足时,work+=allocation,否则转入下一个进程的检测。两种情况跳出第20行的循环。
  1. 所有finish均为1,i无法置为-1 ,i==N时跳出循环
  2. 存在为0的finish,但直至i==N时,仍未有新的work<need出现(从最近的一次i==-1算起),i==N时跳出循环

  第50行进行检测区分上述两种情况,如安全返回1,否则返回0;

以下为完整的代码实现:(另附测试数据)

 #include<bits/stdc++.h>
int max1[][]= {};
int allocation[][]= {};
int need[][]= {};
int finish[]= {};
int available[]= {};
int request[][]= {};
int waitq[]= {};
int waitnum=;
int safeq[]= {};
int safe (int N , int M ,int work[])
{
int s=;
memset(finish,,*sizeof(int));
for(int i=; i<M; i++)
{
work[i]=available[i];
}
int flag=;
for(int i=; i<N; i++)
{
flag=;
if(!finish[i])
{
for(int j=; j<M; j++)
{
if(need[i][j]>work[j])
{
flag=;
break;
}
}
if(flag)
{
for(int j=; j<M; j++)
{
work[j]+=allocation[i][j];
printf(" %d ",work[j]);
}
for(int j=; j<; j++)
printf("%d ",available[j]);
printf("program %d\n",i);
safeq[s++]=i;
finish[i]=;
i=-;
}
}
}
int te=;
for(int i=; i<; i++)
if(!finish[i])
te=;
return te;
}
void print(int pn,int yn)
{
printf("current status\n");
char a='A';
int i2=;
for(i2=; i2<; i2++)
{
switch(i2)
{
case :
printf("Max:");
for(int i=; i<yn-; i++)
printf(" ");
printf(" ");
break;
case :
printf("Allocation:");
for(int i=; i<yn-; i++)
printf(" ");
printf(" ");
break;
case :
printf("Need:");
for(int i=; i<yn-; i++)
printf(" ");
break;
case :
printf("Available:");
for(int i=; i<yn-; i++)
printf(" ");
printf(" ");
printf("\n");
break;
}
}
for(i2=; i2<; i2++)
{
switch(i2)
{
case :
for(int j=; j<yn; j++)
printf("%c ",a+j);
break;
case :
for(int j=; j<yn; j++)
printf("%c ",a+j);
break;
case :
for(int j=; j<yn; j++)
printf("%c ",a+j);
break;
case :
for(int j=; j<yn; j++)
printf("%c ",a+j);
break; }
}
printf("\n");
for(int i=; i<pn; i++)
{
for(int j=; j<yn; j++)
{
printf("%d ",max1[i][j]);
}
for(int j=; j<yn; j++)
{
printf("%d ",allocation[i][j]);
}
for(int j=; j<yn; j++)
{
printf("%d ",need[i][j]);
}
if(i==)
for(int j=; j<yn; j++)
printf("%d ",available[j]);
printf("\n");
}
}
int main()
{
int work[]= {};
int pn,yn;
printf("Please input the number of the program\n");
scanf("%d",&pn);
printf("Please input the number of the element\n");
scanf("%d",&yn);
printf("Please input Max and Allocation of the program \n");
for(int i=; i<pn; i++)
{
for(int j=; j<yn; j++)
{
scanf("%d",&max1[i][j]);
}
for(int j=; j<yn; j++)
{
scanf("%d",&allocation[i][j]);
}
for(int j=; j<yn; j++)
{
need[i][j]=max1[i][j]-allocation[i][j];
}
}
printf("Please input the Available \n");
for(int i=; i<yn; i++)
{
scanf("%d",&available[i]);
work[i]=available[i];
} if(safe(pn,yn,work))
{
printf("it is safe now \n");
for(int i=; i<pn; i++)
printf("%d ",safeq[i]);
printf("\n");
printf("is the one of the safe sequence \n");
}
else
printf("it is not safe now\n"); if(safe(pn,yn,work))
{
while()
{
int num;
int ex;
int judge=;
printf("if you want to exit , please input 0 else input 1 \n");
scanf("%d",&ex);
if(!ex)
break;
printf("Please input the number of the request program \n");
scanf("%d",&num);
printf("Please input the Request \n");
for(int i=; i<yn; i++)
{
scanf("%d",&request[num][i]);
if(request[num][i]>need[num][i])
{
judge=;
printf("error!\n");
break;
}
}
if(judge)
{
int wait=;
for(int i=; i<yn; i++)
{
if(request[num][i]>available[i])
{
wait=;
printf("wait because request>available!\n");
break;
}
}
if(!wait)
{ for(int j1=; j1<yn; j1++)
{
available[j1]-=request[num][j1];
allocation[num][j1]+=request[num][j1];
need[num][j1]-=request[num][j1];
}
if(safe(pn,yn,work))
{
printf("it is safe now \n");
for(int i=; i<pn; i++)
printf("%d ",safeq[i]);
printf("\n");
printf("is the one of the safe sequence \n");
printf("complete !!!!!!!\n");
}
else
{
for(int j1=; j1<yn; j1++)
{
available[j1]+=request[num][j1];
allocation[num][j1]-=request[num][j1];
need[num][j1]+=request[num][j1];
}
printf("wait because it is not safe \n");
}
} }
}
}
print(pn,yn);
} /*
5
3
7 5 3 0 1 0
3 2 2 2 0 0
9 0 2 3 0 2
2 2 2 2 1 1
4 3 3 0 0 2
3 3 2
1
1
1 0 2
1
4
3 3 0
1
0
0 2 0
0 */

操作系统,银行家算法模拟实现(Windows 环境 C++)的更多相关文章

  1. 操作系统——银行家算法(Banker's Algorithm)

    之前写过一篇关于死锁和银行家算法的详细描述的博客https://www.cnblogs.com/wkfvawl/p/11598647.html 写这篇博客的目的,主要是详细讲解一下银行家算法以及代码的 ...

  2. C语言实现 操作系统 银行家算法

    /**************************************************** 银行家算法 算法思想: 1. 在多个进程中,挑选资源需求最小的进程Pmin. 可能存在多类资 ...

  3. python模拟银行家算法

    前言: 大二第一学期学习了操作系统,期末实验课题要求模拟算法.遂根据自己学习的python写下此文.以此锻炼自己编码能力.虽说是重复造轮子,但还是自己的思路体现 代码及注释如下(银行家算法不再赘述): ...

  4. C程序模拟实现银行家算法

    C程序模拟实现银行家算法 上周又做操作系统实验,题目是用程序模拟实现银行家算法,写了半天还真有点晕,主要是因为想尽可能符合课本上的描述,所以写出来的程序就比较恶心了,好了,银行家算法就不多说了,不了解 ...

  5. 【操作系统】银行家算法实现(C语言)

    [操作系统]银行家算法实现(C语言) 注意:本人编码水平很菜.算是自己的一个总结.可能会有我还没有发现的bug.如果有人发现后可以指出,不胜感激. 1.银行家算法: 我们可以把操作系统看作是银行家,操 ...

  6. Network-Emulator-Toolkit 模拟各种网络环境 windows

    背景.目标.目的 (1) 背景: 我们在使用网络时,时常遇到在正常网络环境下的代码运行一切正常,可以复杂的网络环境下的各种问题无法复现,必须搭建模拟各种网络环境,去复现问题,定位问题.不管是移动平台, ...

  7. linux多线程模拟银行家算法

    题外话: 这应该是最近有点难度的作业了,起码比之前的理发师,读写,哲学家问题要难. 但是做好程序的结构,自顶向下,就还是不难的. 银行家算法简介:                 代码: init() ...

  8. 用Fiddler模拟低速网络环境

    有时候宽频网路用习惯了… 在开发的过程就比较少去考虑最佳化的问题… 但当有人反应说「你的网页好慢」甚至当网路速度慢,会造成你的网页跳出什么啊哩不哒的bug时要如何重现呢? 我们可以用Fiddler 这 ...

  9. Nginx——在Windows环境下安装

    下载 Nginx是开源软件,用户可以访问 http://nginx.org/ 网站获取源码包或Windows二进制文件下载.其中1.13.x版本为开发版本,1.12.0版本为稳定版本.开发版本分支会较 ...

随机推荐

  1. 容器常用操作 - 每天5分钟玩转 Docker 容器技术(25)

    前面讨论了如何运行容器,本节学习容器的其他常用操作. stop/start/restart 容器 通过 docker stop 可以停止运行的容器. 容器在 docker host 中实际上是一个进程 ...

  2. \classes\META-INF\MANIFEST.MF (系统找不到指定的路径。)

    开发项目重启eclipse 发现了如下错误! 解决方法 选择出现错误的项目 点击clean 即可~

  3. mysql之 mysql 5.6不停机主从搭建(一主一从基于GTID复制)

    环境说明:版本 version 5.6.25-log 主库ip: 10.219.24.25从库ip:10.219.24.22os 版本: centos 6.7已安装热备软件:xtrabackup 防火 ...

  4. 基于FPGA的均值滤波算法的实现

    前面实现了基于FPGA的彩色图像转灰度处理,减小了图像的体积,但是其中还是存在许多噪声,会影响图像的边缘检测,所以这一篇就要消除这些噪声,基于灰度图像进行图像的滤波处理,为图像的边缘检测做好夯实基础. ...

  5. 【毕业设计】基于Android的家校互动平台开发(内含完整代码和所有文档)——爱吖校推(你关注的,我们才推)

    ☆ 写在前面 之前答应大家的毕业答辩之后把所有文档贡献出来,现在答辩已过,LZ信守承诺,把所有文档开源到了GitHub(这个地址包含所有的代码和文档以及PPT,外层为简单的代码).还望喜欢的朋友们,不 ...

  6. 微软SQL Server认证最新信息(17年5月22日更新),感兴趣的进来看看哟

    之前一直有在关注微软认证的一些消息,由于最新的SQL Server认证加入了2016的相关内容,导致课程资料需要大部分更新,但是微软更新相对比较慢,并且经常改版,目前发现的最新的MCP Cert Pa ...

  7. node.js搭建代理服务器请求数据

    1.引入node.js中的模块 var http = require("http"); var url = require("url"); var qs = r ...

  8. Oracle数据库和客户端字符集

    1.查看数据库字符集信息 SQL> select * from nls_database_parameters;其中,NLS_CHARACTERSET是当前数据库的字符集. 2.客户端字符集 客 ...

  9. explode和implode的运用

    $kesu_list=DD('Kesu.Kesu')->kesu_list(); foreach($kesu_list[0] as $key=>$val){ $reason_id_list ...

  10. 【原创】源码角度分析Android的消息机制系列(六)——Handler的工作原理

    ι 版权声明:本文为博主原创文章,未经博主允许不得转载. 先看Handler的定义: /** * A Handler allows you to send and process {@link Mes ...