计算机操作系统课设需要,写了两个下午的银行家算法(陷在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. Windows下用Composer引入官方GitHub扩展包

    Windows下用Composer引入官方GitHub扩展包 1. 当你打开威武RC4版本的链接的时候,往下拉你可以看到这个,然后你要做的就是想到,百度Composer,看看是个什么鬼,别想太多,跟着 ...

  2. Javascript及Jquery获取元素节点以及添加和删除操作

    用了javascript和jquery很久,把所有元素节点的操作总结了下,放在博客上作为记录. Javascript获取元素的主要方式有三种 1.document.getElementById('ma ...

  3. CentOS 7 for ARM 安装一键Lnmp失败

    背景 前面把树莓派装上了CentOS 7,趁着国庆放假回来赶紧把服务端环境搭起来,为了方便就准备用一键lnmp快速部署一个,结果死活安装不成功... 报错 按照以往的经验进行安装,在我的小树莓派上安装 ...

  4. php 可变函数

    //可变函数    function Test(){        $arr = func_get_args();       //获取所有参数 ,返回数组    $sum=0;     for($i ...

  5. asp net core 跨平台初体验

    标: 在 ubuntu 16.04 上部署一个 asp.net core 站点,打开网站后显示一段文字.   安装 net core 运行环境:ubuntu 16.04 LTS 1.添加 apt 源 ...

  6. Hibernate入门(四)

    一 Hibernate缓存 缓存是介于应用程序和数据库之间,对数据库中的数据复制一份到缓存中,其作用就是为了减少应用程序对数据库的访问,访问数据库时先从缓存中取,提高了程序的性能.Hibernate缓 ...

  7. JAVA下JSON的类型输出及使用

    JSON类型的输出: import java.util.ArrayList; import java.util.HashMap; import net.sf.json.JSONArray; impor ...

  8. Linux系统/dev/mapper目录浅谈

    Linux系统的一般的文件系统名称类似于/dev/sda1或/dev/hda1,但是今天在进行系统维护的时候,利用df -h 命令敲出了/dev/mapper/VolGroup-lv_root和/de ...

  9. 浅谈js中的正则表达式

    很多时候多会被正则表达式搞的晕头转向,最近抽出时间对正则表达式进行了系统的学习,整理如下: 正则表达式的创建 两种方法,一种是直接写,由包含在斜杠之间的模式组成:另一种是调用RegExp对象的构造函数 ...

  10. Java学习笔记--反射API

    反射API 1.反射API的介绍 通过反射API可以获取Java程序在运行时刻的内部结构.比如Java类中包含的构造方法.域和方法等元素,并可以与这些元素进行交换.     按照 一般地面向对象的设计 ...