计算机操作系统课设需要,写了两个下午的银行家算法(陷在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. M41T11-RTC(实时时钟)

    一.理论准备 1. 主要器件:STM8单片机.M41T11时钟IC.32.768kHz晶振等. 2. 外围设备:烧录工具ST-Link/v2.串口.5v供电SATA线. 3. 主要思想:通过单片机对时 ...

  2. Azure 基础:Table storage

    Azure Storage 是微软 Azure 云提供的云端存储解决方案,当前支持的存储类型有 Blob.Queue.File 和 Table.其中的 Table 就是本文的主角 Azure Tabl ...

  3. Spring学习(7)--- @Required注解

    @Required注解是用于bean属性的setter方法 这个注解仅仅表示,受影响的bean属性必须在配置时被填充,通过在bean定义胡通过自动装配一个明确的属性值 package com.mypa ...

  4. CentOS 安装数据库笔记

    1.配置YUM源 # 下载mysql源安装包 shell.noarch.rpm # 安装mysql源 shell.noarch.rpm 检查mysql源是否安装成功 shell> yum rep ...

  5. ionic2 跳转子页面隐藏底部导航栏

    第一种方法: 在tab里面添加一个属性[tabsHideOnSubPages]='true' <ion-tab [root]="tab1Root" [tabsHideOnSu ...

  6. JAVA中使用JSONObject对象必备

    JSON 即 JavaScript Object Natation,它是一种轻量级的数据交换格式,非常适合于服务器与 JavaScript 的交互.本文将快速讲解 JSON 格式,并通过代码示例演示如 ...

  7. angularjs应用prerender.io 搜索引擎优化实践

    上一篇博文(http://www.cnblogs.com/ideal-lx/p/5625428.html)介绍了单页面搜索引擎优化的原理,以及介绍了两个开源框架的优劣.prerender框架的工作原理 ...

  8. img如果没有图片显示默认图片效果

    img如果没有图片显示默认图片效果<img src="本来要显示的图片URL" onerror="this.src='图片挂了的话要显示的默认图片URL'" ...

  9. go语言获取变量的数据类型

    package main import "fmt" import "reflect"; var y string = "sdasd" fun ...

  10. 鼠标滚轮图片放大缩小功能,使用layer弹框后不起作用

    今天在项目中遇到的一个问题:点击按钮使用layer弹框弹出一张图片,需要加一个鼠标滚轮放大缩小,图片也跟着放大缩小的功能.于是在网上找了一个demo. DEMO: <!DOCTYPE html ...