进程调度之FCFS算法(先来先运行算法)
#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算法(先来先运行算法)的更多相关文章
- Eclipse直接运行算法第4版例子(重定向和读取指定路径文件)
Eclipse直接运行算法第4版例子(重定向和读取指定路径文件) 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://b ...
- JVM内存管理------GC算法精解(复制算法与标记/整理算法)
本次LZ和各位分享GC最后两种算法,复制算法以及标记/整理算法.上一章在讲解标记/清除算法时已经提到过,这两种算法都是在此基础上演化而来的,究竟这两种算法优化了之前标记/清除算法的哪些问题呢? 复制算 ...
- JVM之GC算法、垃圾收集算法——标记-清除算法、复制算法、标记-整理算法、分代收集算法
标记-清除算法 此垃圾收集算法分为“标记”和“清除”两个阶段: 首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记对象,它的标记过程前面已经说过——如何判断对象是否存活/死去 死去的对象就会 ...
- [2] TensorFlow 向前传播算法(forward-propagation)与反向传播算法(back-propagation)
TensorFlow Playground http://playground.tensorflow.org 帮助更好的理解,游乐场Playground可以实现可视化训练过程的工具 TensorFlo ...
- 算法导论-矩阵乘法-strassen算法
目录 1.矩阵相乘的朴素算法 2.矩阵相乘的strassen算法 3.完整测试代码c++ 4.性能分析 5.参考资料 内容 1.矩阵相乘的朴素算法 T(n) = Θ(n3) 朴素矩阵相乘算法,思想明了 ...
- JVM内存管理之GC算法精解(复制算法与标记/整理算法)
本次LZ和各位分享GC最后两种算法,复制算法以及标记/整理算法.上一章在讲解标记/清除算法时已经提到过,这两种算法都是在此基础上演化而来的,究竟这两种算法优化了之前标记/清除算法的哪些问题呢? 复制算 ...
- JVM-GC算法(二)-复制算法&&标记整理算法
这次我和各位分享GC最后两种算法,复制算法以及标记/整理算法.上一篇在讲解标记/清除算法时已经提到过,这两种算法都是在此基础上演化而来的,究竟这两种算法优化了之前标记/清除算法的哪些问题呢? 复制算法 ...
- 数据结构和算法(Golang实现)(26)查找算法-哈希表
哈希表:散列查找 一.线性查找 我们要通过一个键key来查找相应的值value.有一种最简单的方式,就是将键值对存放在链表里,然后遍历链表来查找是否存在key,存在则更新键对应的值,不存在则将键值对链 ...
- 数据结构和算法(Golang实现)(27)查找算法-二叉查找树
二叉查找树 二叉查找树,又叫二叉排序树,二叉搜索树,是一种有特定规则的二叉树,定义如下: 它是一颗二叉树,或者是空树. 左子树所有节点的值都小于它的根节点,右子树所有节点的值都大于它的根节点. 左右子 ...
- 数据结构和算法(Golang实现)(29)查找算法-2-3树和左倾红黑树
某些教程不区分普通红黑树和左倾红黑树的区别,直接将左倾红黑树拿来教学,并且称其为红黑树,因为左倾红黑树与普通的红黑树相比,实现起来较为简单,容易教学.在这里,我们区分开左倾红黑树和普通红黑树. 红黑树 ...
随机推荐
- 12:计算2的N次方
12:计算2的N次方 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 任意给定一个正整数N(N<=100),计算2的n次方的值. 输入 输入一个正整数N ...
- C#防止WebBrowser在新窗口中打开链接页面
在日常的开发中,大家有时需要用WebBrowser加载URL,来实现某些功能.而这时,我们就不希望所打开的页面中的链接,在新窗口中打开,因为这样的话,实际上是用系统默认的浏览器打开了,从而脱离了你的W ...
- windows如何查看nvidia显卡(GPU)的利用率和温度
windows如何查看nvidia显卡(GPU)的利用率和温度 nvidia-smi 只要在文件夹C:\Program Files\NVIDIA Corporation\NVSMI里找到文件nvidi ...
- RxJava + Retrofit完成网络请求
1.前言 本文基于RxJava.Retrofit的使用,若是对RxJava或Retrofit还不了解的简友可以先了解RxJava.Retrofit的用法再来看这篇文章. 在这片文章之前分别单独介绍过R ...
- Android View的事件分发机制和滑动冲突解决方案
这篇文章会先讲Android中View的事件分发机制,然后再介绍Android滑动冲突的形成原因并给出解决方案.因水平有限,讲的不会太过深入,只希望各位看了之后对事件分发机制的流程有个大概的概念,并且 ...
- 使用 CLI 创建 Azure VM 的自定义映像
自定义映像类似于应用商店映像,不同的是自定义映像的创建者是你自己. 自定义映像可用于启动配置,例如预加载应用程序.应用程序配置和其他 OS 配置. 在本教程中,你将创建自己的 Azure 虚拟机自定义 ...
- Redis搜索引擎设计
以下图片是基于自身对知识掌握的基本能力而画出的,并没有系统全面的读过活跃于互联网大牛的著作(个人认为那样会限制自身的思维空间),因此,若图片里存在错误,敬请批评指正,谢谢! 除非互联网项目,传统的制造 ...
- FileTable的创建和使用
1. 首先要在实例级别启用FILESTREAM,打开Sql Server Configuration Manager窗口,双击需要设置的SQL SERVER实例进行设置. 2. 需要更改 SQL SE ...
- 山寨"每日故宫"应用的图层遮罩效果
山寨"每日故宫"应用的图层遮罩效果 最终效果: 应用中的效果: 素材图片: 源码: // // ViewController.m // 每日故宫 // // Created by ...
- 详细讲解WaterRefreshLoadMoreView的使用
详细讲解WaterRefreshLoadMoreView的使用 效果图: 加载控件的源码在如下网址中:上拉加载下拉刷新控件WaterRefreshLoadMoreView 使用的源码: // // V ...