操作系统,银行家算法模拟实现(Windows 环境 C++)
计算机操作系统课设需要,写了两个下午的银行家算法(陷在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时当前状态安全,否则不安全;
- 程序流程:
- 键盘输入max1矩阵,allocation矩阵,available数组,计算出need矩阵。
- 判断当前时刻系统的状态是否安全。true 转向3,false转向7
- 判断当前时刻request<=need。true 转向4,false 转向7
- 判断当前时刻request<=available。true 转向5,false 转向7
- 进行安全性算法检测。true 转向6,false 转向7
- 系统分配资源并继续等待指令。
- 系统不予分配资源并输出原因。
- 安全性算法 : 每次从第一个进程开始检测,如遇到所有的m项资源都可以满足时,work+=allocation,否则转入下一个进程的检测。两种情况跳出第20行的循环。
- 所有finish均为1,i无法置为-1 ,i==N时跳出循环
- 存在为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++)的更多相关文章
- 操作系统——银行家算法(Banker's Algorithm)
之前写过一篇关于死锁和银行家算法的详细描述的博客https://www.cnblogs.com/wkfvawl/p/11598647.html 写这篇博客的目的,主要是详细讲解一下银行家算法以及代码的 ...
- C语言实现 操作系统 银行家算法
/**************************************************** 银行家算法 算法思想: 1. 在多个进程中,挑选资源需求最小的进程Pmin. 可能存在多类资 ...
- python模拟银行家算法
前言: 大二第一学期学习了操作系统,期末实验课题要求模拟算法.遂根据自己学习的python写下此文.以此锻炼自己编码能力.虽说是重复造轮子,但还是自己的思路体现 代码及注释如下(银行家算法不再赘述): ...
- C程序模拟实现银行家算法
C程序模拟实现银行家算法 上周又做操作系统实验,题目是用程序模拟实现银行家算法,写了半天还真有点晕,主要是因为想尽可能符合课本上的描述,所以写出来的程序就比较恶心了,好了,银行家算法就不多说了,不了解 ...
- 【操作系统】银行家算法实现(C语言)
[操作系统]银行家算法实现(C语言) 注意:本人编码水平很菜.算是自己的一个总结.可能会有我还没有发现的bug.如果有人发现后可以指出,不胜感激. 1.银行家算法: 我们可以把操作系统看作是银行家,操 ...
- Network-Emulator-Toolkit 模拟各种网络环境 windows
背景.目标.目的 (1) 背景: 我们在使用网络时,时常遇到在正常网络环境下的代码运行一切正常,可以复杂的网络环境下的各种问题无法复现,必须搭建模拟各种网络环境,去复现问题,定位问题.不管是移动平台, ...
- linux多线程模拟银行家算法
题外话: 这应该是最近有点难度的作业了,起码比之前的理发师,读写,哲学家问题要难. 但是做好程序的结构,自顶向下,就还是不难的. 银行家算法简介: 代码: init() ...
- 用Fiddler模拟低速网络环境
有时候宽频网路用习惯了… 在开发的过程就比较少去考虑最佳化的问题… 但当有人反应说「你的网页好慢」甚至当网路速度慢,会造成你的网页跳出什么啊哩不哒的bug时要如何重现呢? 我们可以用Fiddler 这 ...
- Nginx——在Windows环境下安装
下载 Nginx是开源软件,用户可以访问 http://nginx.org/ 网站获取源码包或Windows二进制文件下载.其中1.13.x版本为开发版本,1.12.0版本为稳定版本.开发版本分支会较 ...
随机推荐
- Windows下用Composer引入官方GitHub扩展包
Windows下用Composer引入官方GitHub扩展包 1. 当你打开威武RC4版本的链接的时候,往下拉你可以看到这个,然后你要做的就是想到,百度Composer,看看是个什么鬼,别想太多,跟着 ...
- Javascript及Jquery获取元素节点以及添加和删除操作
用了javascript和jquery很久,把所有元素节点的操作总结了下,放在博客上作为记录. Javascript获取元素的主要方式有三种 1.document.getElementById('ma ...
- CentOS 7 for ARM 安装一键Lnmp失败
背景 前面把树莓派装上了CentOS 7,趁着国庆放假回来赶紧把服务端环境搭起来,为了方便就准备用一键lnmp快速部署一个,结果死活安装不成功... 报错 按照以往的经验进行安装,在我的小树莓派上安装 ...
- php 可变函数
//可变函数 function Test(){ $arr = func_get_args(); //获取所有参数 ,返回数组 $sum=0; for($i ...
- asp net core 跨平台初体验
标: 在 ubuntu 16.04 上部署一个 asp.net core 站点,打开网站后显示一段文字. 安装 net core 运行环境:ubuntu 16.04 LTS 1.添加 apt 源 ...
- Hibernate入门(四)
一 Hibernate缓存 缓存是介于应用程序和数据库之间,对数据库中的数据复制一份到缓存中,其作用就是为了减少应用程序对数据库的访问,访问数据库时先从缓存中取,提高了程序的性能.Hibernate缓 ...
- JAVA下JSON的类型输出及使用
JSON类型的输出: import java.util.ArrayList; import java.util.HashMap; import net.sf.json.JSONArray; impor ...
- Linux系统/dev/mapper目录浅谈
Linux系统的一般的文件系统名称类似于/dev/sda1或/dev/hda1,但是今天在进行系统维护的时候,利用df -h 命令敲出了/dev/mapper/VolGroup-lv_root和/de ...
- 浅谈js中的正则表达式
很多时候多会被正则表达式搞的晕头转向,最近抽出时间对正则表达式进行了系统的学习,整理如下: 正则表达式的创建 两种方法,一种是直接写,由包含在斜杠之间的模式组成:另一种是调用RegExp对象的构造函数 ...
- Java学习笔记--反射API
反射API 1.反射API的介绍 通过反射API可以获取Java程序在运行时刻的内部结构.比如Java类中包含的构造方法.域和方法等元素,并可以与这些元素进行交换. 按照 一般地面向对象的设计 ...