#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 ;
}

进程调度之FCFS算法(先来先运行算法)的更多相关文章

  1. Eclipse直接运行算法第4版例子(重定向和读取指定路径文件)

    Eclipse直接运行算法第4版例子(重定向和读取指定路径文件)   版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://b ...

  2. JVM内存管理------GC算法精解(复制算法与标记/整理算法)

    本次LZ和各位分享GC最后两种算法,复制算法以及标记/整理算法.上一章在讲解标记/清除算法时已经提到过,这两种算法都是在此基础上演化而来的,究竟这两种算法优化了之前标记/清除算法的哪些问题呢? 复制算 ...

  3. JVM之GC算法、垃圾收集算法——标记-清除算法、复制算法、标记-整理算法、分代收集算法

    标记-清除算法 此垃圾收集算法分为“标记”和“清除”两个阶段: 首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记对象,它的标记过程前面已经说过——如何判断对象是否存活/死去 死去的对象就会 ...

  4. [2] TensorFlow 向前传播算法(forward-propagation)与反向传播算法(back-propagation)

    TensorFlow Playground http://playground.tensorflow.org 帮助更好的理解,游乐场Playground可以实现可视化训练过程的工具 TensorFlo ...

  5. 算法导论-矩阵乘法-strassen算法

    目录 1.矩阵相乘的朴素算法 2.矩阵相乘的strassen算法 3.完整测试代码c++ 4.性能分析 5.参考资料 内容 1.矩阵相乘的朴素算法 T(n) = Θ(n3) 朴素矩阵相乘算法,思想明了 ...

  6. JVM内存管理之GC算法精解(复制算法与标记/整理算法)

    本次LZ和各位分享GC最后两种算法,复制算法以及标记/整理算法.上一章在讲解标记/清除算法时已经提到过,这两种算法都是在此基础上演化而来的,究竟这两种算法优化了之前标记/清除算法的哪些问题呢? 复制算 ...

  7. JVM-GC算法(二)-复制算法&&标记整理算法

    这次我和各位分享GC最后两种算法,复制算法以及标记/整理算法.上一篇在讲解标记/清除算法时已经提到过,这两种算法都是在此基础上演化而来的,究竟这两种算法优化了之前标记/清除算法的哪些问题呢? 复制算法 ...

  8. 数据结构和算法(Golang实现)(26)查找算法-哈希表

    哈希表:散列查找 一.线性查找 我们要通过一个键key来查找相应的值value.有一种最简单的方式,就是将键值对存放在链表里,然后遍历链表来查找是否存在key,存在则更新键对应的值,不存在则将键值对链 ...

  9. 数据结构和算法(Golang实现)(27)查找算法-二叉查找树

    二叉查找树 二叉查找树,又叫二叉排序树,二叉搜索树,是一种有特定规则的二叉树,定义如下: 它是一颗二叉树,或者是空树. 左子树所有节点的值都小于它的根节点,右子树所有节点的值都大于它的根节点. 左右子 ...

  10. 数据结构和算法(Golang实现)(29)查找算法-2-3树和左倾红黑树

    某些教程不区分普通红黑树和左倾红黑树的区别,直接将左倾红黑树拿来教学,并且称其为红黑树,因为左倾红黑树与普通的红黑树相比,实现起来较为简单,容易教学.在这里,我们区分开左倾红黑树和普通红黑树. 红黑树 ...

随机推荐

  1. vue-router 路由懒加载

    webpack打包会将所有资源文件合并压缩成一个文件,导致最终的文件非常大,甚至超过几M,以致页面首次加载会比较慢,如下图: 其中红色标出的是在浏览器中加载的js文件,gzip压缩前已经达到500多K ...

  2. 【代码笔记】iOS-cell自动变化大小

    一,效果图. 二,工程图. 三,代码. RootViewController.h #import <UIKit/UIKit.h> @interface RootViewController ...

  3. python代码打包发布

    背景 本文介绍了python中一种最简单的代码结构的打包方式 包名称 我们先给我们的包取个名字,python包起名需要符合下面的规范 全部小写 在pypi上是唯一的 下划线分隔或没有单词分隔符(不要使 ...

  4. YOLO object detection with OpenCV

    Click here to download the source code to this post. In this tutorial, you’ll learn how to use the Y ...

  5. demo.testfire.net 靶场测试流程记录

    demo.testfire.net span::selection, .CodeMirror-line > span > span::selection { background: #d7 ...

  6. 【转】用JS完成手机短信验证按键点击事件

    原地址:https://gitee.com/RainVanilla/codes/i7jske4wdogvnb0apmfx571 试了一下,效果还可以,留着备用! <!DOCTYPE html&g ...

  7. idea 导入Mapper错误报错设置

    这个报错如图: 其实这个报错是错误,因为运行一切正常. 解决办法:

  8. Array类型

    Array类型 Array也是ECMAScript中常用类型之一,其特点是数组中的每一项都可以保存任何类型的数据,数组的大小可以动态调整. 创建数组 方式1:使用Array构造函数 var books ...

  9. Java设计模式----观察者模式详解

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3 ...

  10. LeetCode 题解之Add Binary

    1.题目描述 2.题目分析 使用string 的逆向指针,做二进制加法,注意进位问题就可以. 3.代码 string addBinary(string a, string b) { string::r ...