#include<stdio.h>
#define PNUMBER 5//进程个数
#define SNUMBER 3//资源种类个数 //资源的种类,三种
char stype[SNUMBER]={'A','B','C'}; //各种资源的总数量,a种资源总10,b种资源总5,c种资源总7
int avalable[SNUMBER]={,,}; //每个进程对应的完成进程需要的各种类型的资源需求量,静态值
int pmax[PNUMBER][SNUMBER]={{,,},{,,},{,,},{,,},{,,}}; //每个进程已经分配的资源情况,动态值
int allocation[PNUMBER][SNUMBER]={{,,},{,,},{,,},{,,},{,,}}; //每一个进程还需要的资源
int pneed[PNUMBER][SNUMBER]={{,,},{,,},{,,},{,,},{,,}}; //临时的数组
int request[SNUMBER]; //当前正在分配资源的进程
int pindex=; //显示每一个进程对资源拥有的现状
void showdate(); //接受进程分配的请求
void accepetRequest(); //模拟分配
void SimMllocation(int pindex); //回滚
void rollback(int pindex); //安全性检查
int checkIsSafe(); int main()
{
//主逻辑 int exit=; //显示每一个进程现状
showdate(); do
{
//接受进程分配的请求
accepetRequest(); //模拟分配资源
SimMllocation(pindex); //显示现在资源现状
showdate(); //检查是否存在安全序列,数据要保证至少一个进程能完成分配
if(checkIsSafe()==)
{
//当前进程不存在安全序列,当前进程数据回滚
rollback(pindex);
}
printf("是否继续0/1\n");
scanf("%d",&exit);
}while(exit==);
return ;
} //显示每一个进程对资源拥有的现状
void showdate()
{
int index=;
int index_=;
printf("当前资源情况.....\n");
printf("资源类类型\t资源数量\n");
for(index=;index<SNUMBER;index++)
{
printf("%c\t\t%d\n",stype[index],avalable[index]);
} printf("\n\n每一个进程所需要资源的最大值.........\n\n");
printf("进程编号\t资源类型A\t资源类型B\t资源类型C\n");
for(index=;index<PNUMBER;index++)
{
printf("%d\t\t",index);
for(index_=;index_<SNUMBER;index_++)
{
printf("%d\t\t",pmax[index][index_]);
}
printf("\n");
} printf("\n\n每一个进程所分配的情况......\n\n");
printf("进程编号\t资源类型A\t资源类型B\t资源类型C\n");
for(index=;index<PNUMBER;index++)
{
printf("%d\t\t",index);
for(index_=;index_<SNUMBER;index_++)
{
printf("%d\t\t",allocation[index][index_]);
}
printf("\n");
} printf("\n\n每一个进程还需要的资源的情况......\n\n");
printf("进程编号\t资源类型A\t资源类型\t资源类型C\n");
for(index=;index<PNUMBER;index++)
{
printf("%d\t\t",index);
for(index_=;index_<SNUMBER;index_++)
{
printf("%d\t\t",pneed[index][index_]);
}
printf("\n");
}
printf("---------------------------------------------------------------------------------------------\n");
} void accepetRequest()
{
int index=;
printf("请输入你要分配资源的进程编号(0~%d)\n",PNUMBER-);
//需要分配资源的进程
scanf("%d",&pindex);
//输入需要各种资源的具体数量
for(index=;index<SNUMBER;)
{
printf("请输入%c类资源的数量\n",stype[index]);
scanf("%d",&request[index]);
//小于进程对资源的最大要求
if(request[index]<=pmax[pindex][index]&&request[index]<=avalable[index])
{
index++;
}
}
} //模拟分配
void SimMllocation(int pindex)
{
int index=;
for(index=;index<SNUMBER;index++)
{
//总资源减少
avalable[index]-=request[index];
//当前进程已经分配的资源
allocation[pindex][index]+=request[index];
//还需要的资源
pneed[pindex][index]-=request[index];
}
} //回滚
void rollback(int pindex)
{
int index=;
for(index=;index<SNUMBER;index++)
{
avalable[index]+=request[index];
allocation[pindex][index]-=request[index];
pneed[pindex][index]+=request[index];
}//回滚与模拟分配刚好相反
} int checkIsSafe()
{
int index=;
int index_=;
int count=;
int k=;
int temp[PNUMBER];
//余下的资源要保证每一个进程都能得到资源
int finish[PNUMBER]={,,,,};
//资源
int work[SNUMBER];
for(index=;index<SNUMBER;index++)
{
work[index]=avalable[index];
}
//所有进程找到
for(index=;index<PNUMBER;index++)
{
count=;
if(finish[index]==)
continue;
//余下的资源是否能满足某一进程的需要
for(index_=;index_<SNUMBER;index_++)
{
if(pneed[index][index_]<=work[index_])
{
count++;
}
if(count==SNUMBER)
{
//余下的资源如果满足一个进程的需要,也就能回收
finish[index]=;
for(index_=;index_<SNUMBER;index_++)
{
work[index_]+=allocation[index][index_];
}
//记下此进程的编号
temp[k]=index;
k++;
//因为有资源回收,所以让所有进程试试看能不能重新分配
index=-;
}
}
}
//判断所有进程理论上是否能分配到资源
for(index=;index<PNUMBER;index++)
{
//只要有一个进程分配不到资源,则不存在安全序列
if(finish[index]==)
{
printf("***不存在安全序列***");
return ;
}
}
printf("安全序列............\n");
for(index=;index<PNUMBER;index++)
{
printf("%d--->",temp[index]);
}
printf("\n");
return ;
}

c模拟银行家资源分配算法的更多相关文章

  1. python模拟银行家算法

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

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

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

  3. 使用python模拟实现KNN算法

    一.KNN简介 1.KNN算法也称为K邻近算法,是数据挖掘分类技术之一.所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表. 2.KNN算法的核心思想是如果一个样本 ...

  4. round函数——银行家舍入算法

    在处理四舍五入时,相信大部分人会使用math.round函数(不同的语言应该都有).有没有考虑过,这个函数是不是自己所需要的? po主碰到的问题是用来计算平均分.有个顶真的学生反映,明明是86.5,怎 ...

  5. c模拟内存分配算法(首次适应算法,最佳适应算法,最坏适应算法)

    #include<bits/stdc++.h> using namespace std; /*定义内存的大小为100*/ #define MEMSIZE 100 /*如果小于此值,将不再分 ...

  6. 【WC2019笔记】模拟费用流算法

    在一条数轴上,有 $n$ 只老鼠和 $m$ 个老鼠洞. Q1 每只老鼠都只能往左走,求所有老鼠都进洞的最小代价(代价就是所有老鼠走的距离和). 每个洞只能进一只老鼠. A1 一开始陈江伦老师没说每个洞 ...

  7. 用python实现银行家算法

    编制模拟银行家算法的程序,并以下面给出的例子验证所编写的程序的正确性. 进程 已占资源 最大需求数 资源种类 A B C D A B C D P0 0 0 1 2 0 0 1 2 P1 1 0 0 0 ...

  8. (待续)C#语言中的动态数组(ArrayList)模拟常用页面置换算法(FIFO、LRU、Optimal)

    目录 00 简介 01 算法概述 02 公用方法与变量解释 03 先进先出置换算法(FIFO) 04 最近最久未使用(LRU)算法 05 最佳置换算法(OPT) 00 简介 页面置换算法主要是记录内存 ...

  9. [Algorithm] 群体智能优化算法之粒子群优化算法

    同进化算法(见博客<[Evolutionary Algorithm] 进化算法简介>,进化算法是受生物进化机制启发而产生的一系列算法)和人工神经网络算法(Neural Networks,简 ...

随机推荐

  1. Cannot perform conversion to XML from legacy HTML:

    错误信息:Cannot perform conversion to XML from legacy HTML: The nekoHTML library is not in classpath. ne ...

  2. angular自定义指令 repeat 循环结束事件;limitTo限制循环长度、限定开始位置

    1.获取repeat循环结束: 自定义指令: .directive('repeatFinish', function () { return { link: function (scope, elem ...

  3. CentOS7系列--1.3CentOS7用户管理

    CentOS7用户管理 1. 添加用户 [root@centos7 ~]# useradd jack [root@centos7 ~]# passwd jack Changing password f ...

  4. Flutter Stack布局中定位的方式

    前言 想要记录一下Stack布局中,定位的两种方式 代码 //……省略无关代码…… child: new Column( children: <Widget>[ new SizedBox( ...

  5. 在Fragment里面调用getActivity()报null

    看友盟的错误日志发现又出现了NullPointerException,然后去看代码,发现只有是上下文有空的可能,但是因为以前已经发生过这种情况所以上下文我都是在创建Fragment对象的时候从Acti ...

  6. 【转】Twitter Storm如何保证消息不丢失

    Twitter Storm如何保证消息不丢失 发表于 2011 年 09 月 30 日 由 xumingming 作者: xumingming | 可以转载, 但必须以超链接形式标明文章原始出处和作者 ...

  7. Storm概念

    概念 本文列出了Storm的主要概念及相关的信息链接.讨论到的概念有: Topologies Streams Spouts Bolts Stream groupings Reliability Tas ...

  8. maven问题总结

    1.maven下载jar包速度慢 1.maven下载jar包速度慢(解决办法) 现在maven项目非常流行,因为它对jar实行了一个非常方便的管理,我们可以通过在pom.xml文件中做对应的配置即可将 ...

  9. Oracle ALL DBA表

    select * from all_tab_comments -- 查询所有用户的表,视图等 select * from user_tab_comments -- 查询本用户的表,视图等 select ...

  10. 关于UIScrollView有些你很难知晓的崩溃情形

    关于UIScrollView有些你很难知晓的崩溃情形 为了实现以下的功能(按钮之间的切换效果): 简短的代码如下: // // RootViewController.m // BUG // // Co ...