#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. Wannafly挑战赛9 E - 组一组

    链接:https://www.nowcoder.net/acm/contest/71/E来源:牛客网 题目描述 有一个长为 n 的数列 A,其中有 m 个限制条件,条件有两种: 1.对于区间 [l,r ...

  2. Git学习 之 安装

    1.官网下载 https://git-scm.com/downloads 2.修改安装目标路径,其他默认安装 3.通过系统管理员身份打开cmd,输入git 检查是否安装成功

  3. 在生产环境中安全执行更新删除SQL脚本的技巧

    今天在生产环境上解决问题,由于广发银行的管理制度是开发公司是不允许确生产环境的,所以我们只能把要更新的语句发给运营中心,由运营中心的投产人员执行,我们则在旁边看着:在他执行的时候发现了一个很有趣的技巧 ...

  4. Ubuntu VNC 打开spyder无法输入(检测不到键盘配置)解决方法

    在ubuntu中安装好spyder后, 打开spyder发现无法输入. 在打开spyder的终端窗口,有如下提示: QXcbConnection: Failed to initialize XRand ...

  5. Android 原生 MediaPlayer 和 MediaCodec 的区别和联系(二)

    目录: (3)Android 官方网站 对 MediaPlayer的介绍 正文:  Android 官方网站 对 MediaPlayer的介绍         MediaPlayer      pub ...

  6. SQL Server 索引知识-应用,维护

    创建聚集索引 a索引键最好唯一(如果不唯一会隐形建立uniquier列(4字节)确保唯一,也就是这列都会复制到所有非聚集索引中) b聚集索引列所占空间应尽量小(否则也会使非聚集索引的空间变大) c聚集 ...

  7. RHEL7: How to configure a rc-local service

    问题: linux7 /etc/rc.local 不生效: [root@bogon mysql3306]# uname -aLinux bogon 3.10.0-862.el7.x86_64 #1 S ...

  8. iOS设计模式 - 中介者

    iOS设计模式 - 中介者 原理图 说明 用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 注:中介者对象本身没有复用价值 ...

  9. (1)Map集合 (2)异常机制 (3)File类 (4)I/O流

    1.Map集合(重点)1.1 常用的方法 Set<Map.Entry<K,V>> entrySet() - 用于将Map集合转换为Set集合. 其中Map.Entry<K ...

  10. ZT 用gdb调试core dump文件

    用gdb调试core dump文件 转载自:http://blog.chinaunix.net/u2/83905/showart_2134570.html 在Unix系统下,应用程序崩溃,一般会产生c ...