FCFS算法以及FJF算法实现
2018-01-07 15:32
197 查看
对于作业调度有很多种调度算法,今天就来实现一下两个各个调度算法里面最简单的两个调度算法.先来先服务和短作业优先算法.
本人C语言程序的代码量不是很多,毕竟入门就学的java所以有不完善的地方还请多指教咯.
文本末尾是两个示范输入数据
#include <stdio.h>
#include <stdlib.h>
#define SIZE 5
void fcfsSort();
void myFun(int i);
struct Job_type
{
char num; //作业号
int arrival_time; //到达时间
int runtime; //服务时间
int timeStart; //执行时间
int timeFinished; //结束时间
int timeServe; //周转时间
} x,job[SIZE];
/*
*load()
*加载函数:输入各个作业的作业号,到达时间,运行时间
*
*/
void load()
{
int i;
printf("\nEnter the Jobs' datas:\n");
for(i=0;i<SIZE;i++)
scanf("%c,%d,%d;",&job[i].num,&job[i].arrival_time,&job[i].runtime);
}
/*
*FCFS算法:
*
*/
void fcfs()
{
fcfsSort(); //对作业的到达按时间顺序进行排序
int i;
job[0].timeStart = job[0].arrival_time;
job[0].timeFinished = job[0].arrival_time + job[0].runtime;
job[0].timeServe = job[0].timeFinished - job[0].timeStart;
for(i=0;i<SIZE-1;i++){
myFun(i);
}
}
//输出函数
void show(){
int i;
for(i=0;i<SIZE;i++){
printf("NUM=%c,ARR=%d,STR=%d,FIN=%d,SER=%d\n",job[i].num,job[i].arrival_time,
job[i].timeStart,job[i].timeFinished,job[i].timeServe);
}
}
//按时间顺序进行排序
void fcfsSort(){
int i,j;
for(i=0;i<SIZE;i++){
for(j=i+1;j<SIZE;j++){
if(job[i].arrival_time>job[j].arrival_time){
struct Job_type temp = job[i];
job[i] = job [j];
job[j] = temp;
}
}
}
}
/*
*shf(int n,int tc)
*短作业优先算法
*
*
*/
void sjf(int n,int tc) //短作业调度函数
{
int i,j,k=n,t=n;
if(k==0){
job[0].timeStart = job[0].arrival_time;
job[0].timeFinished = job[0].arrival_time + job[0].runtime;
job[0].timeServe = job[0].timeFinished - job[0].timeStart;
}else{
myFun(tc);
}
k++;
//判断上一个作业结束后在集合里面按时间到达的作业个数
for(i=k;i<SIZE;i++){
if(job[i].arrival_time <= job
.timeFinished){
t = i;
}
}
//对已经到达的作业进行排序
for(i=k;i<t+1;i++){
for(j=i+1;j<t+1;j++){
if(job[i].runtime>job[j].runtime){
struct Job_type temp = job[i];
job[i] = job [j];
job[j] = temp;
}
}
}
//如果作业伟全部执行完则递归进行程序
if(t<SIZE){
sjf(k,t);
}else{
//printf("first :%d\n",t);
for(i=0;i<SIZE-1;i++){
myFun(i);
}
}
}
//抽取公共函数
void myFun(int i){
if(job[i+1].arrival_time < job[i].timeFinished)
job[i+1].timeStart = job[i].timeFinished;
else
job[i+1].timeStart = job[i+1].arrival_time;
job[i+1].timeFinished = job[i+1].timeStart + job[i+1].runtime;
job[i+1].timeServe = job[i+1].timeFinished - job[i+1].arrival_time;
}
int main()
{
load();
printf("FCFS algorithm:\n");
fcfs();
show();
printf("SJF algorithm:\n");
sjf(0,0);
show();
return 0;
}
// A,0,4;B,1,3;C,2,5;D,20,1;E,19,2;
// A,0,4;B,1,3;C,2,5;D,3,2;E,4,4;
本人C语言程序的代码量不是很多,毕竟入门就学的java所以有不完善的地方还请多指教咯.
文本末尾是两个示范输入数据
#include <stdio.h>
#include <stdlib.h>
#define SIZE 5
void fcfsSort();
void myFun(int i);
struct Job_type
{
char num; //作业号
int arrival_time; //到达时间
int runtime; //服务时间
int timeStart; //执行时间
int timeFinished; //结束时间
int timeServe; //周转时间
} x,job[SIZE];
/*
*load()
*加载函数:输入各个作业的作业号,到达时间,运行时间
*
*/
void load()
{
int i;
printf("\nEnter the Jobs' datas:\n");
for(i=0;i<SIZE;i++)
scanf("%c,%d,%d;",&job[i].num,&job[i].arrival_time,&job[i].runtime);
}
/*
*FCFS算法:
*
*/
void fcfs()
{
fcfsSort(); //对作业的到达按时间顺序进行排序
int i;
job[0].timeStart = job[0].arrival_time;
job[0].timeFinished = job[0].arrival_time + job[0].runtime;
job[0].timeServe = job[0].timeFinished - job[0].timeStart;
for(i=0;i<SIZE-1;i++){
myFun(i);
}
}
//输出函数
void show(){
int i;
for(i=0;i<SIZE;i++){
printf("NUM=%c,ARR=%d,STR=%d,FIN=%d,SER=%d\n",job[i].num,job[i].arrival_time,
job[i].timeStart,job[i].timeFinished,job[i].timeServe);
}
}
//按时间顺序进行排序
void fcfsSort(){
int i,j;
for(i=0;i<SIZE;i++){
for(j=i+1;j<SIZE;j++){
if(job[i].arrival_time>job[j].arrival_time){
struct Job_type temp = job[i];
job[i] = job [j];
job[j] = temp;
}
}
}
}
/*
*shf(int n,int tc)
*短作业优先算法
*
*
*/
void sjf(int n,int tc) //短作业调度函数
{
int i,j,k=n,t=n;
if(k==0){
job[0].timeStart = job[0].arrival_time;
job[0].timeFinished = job[0].arrival_time + job[0].runtime;
job[0].timeServe = job[0].timeFinished - job[0].timeStart;
}else{
myFun(tc);
}
k++;
//判断上一个作业结束后在集合里面按时间到达的作业个数
for(i=k;i<SIZE;i++){
if(job[i].arrival_time <= job
.timeFinished){
t = i;
}
}
//对已经到达的作业进行排序
for(i=k;i<t+1;i++){
for(j=i+1;j<t+1;j++){
if(job[i].runtime>job[j].runtime){
struct Job_type temp = job[i];
job[i] = job [j];
job[j] = temp;
}
}
}
//如果作业伟全部执行完则递归进行程序
if(t<SIZE){
sjf(k,t);
}else{
//printf("first :%d\n",t);
for(i=0;i<SIZE-1;i++){
myFun(i);
}
}
}
//抽取公共函数
void myFun(int i){
if(job[i+1].arrival_time < job[i].timeFinished)
job[i+1].timeStart = job[i].timeFinished;
else
job[i+1].timeStart = job[i+1].arrival_time;
job[i+1].timeFinished = job[i+1].timeStart + job[i+1].runtime;
job[i+1].timeServe = job[i+1].timeFinished - job[i+1].arrival_time;
}
int main()
{
load();
printf("FCFS algorithm:\n");
fcfs();
show();
printf("SJF algorithm:\n");
sjf(0,0);
show();
return 0;
}
// A,0,4;B,1,3;C,2,5;D,20,1;E,19,2;
// A,0,4;B,1,3;C,2,5;D,3,2;E,4,4;
相关文章推荐
- 机器学习算法——PCA算法介绍以及Java实现
- 遗传算法解决TSP问题实现以及与最小生成树的对比
- 模式匹配算法以及KMP的javascript实现
- c语言实现赫夫曼树的构建以及生成赫夫曼编码(《数据结构》算法6.12)
- 排序算法的C语言实现以及各个算法的时间复杂度和空间复杂度分析(冒泡排序)
- Java实现二叉树,以及先序、中序、后序遍历算法的实现
- 堆排序(基本思想以及算法实现)
- 顺序表创建以及查找排序算法(含有顺序查找算法、带哨兵站顺序查找、折半查找算法、冒泡排序)的C++实现在vs2013环境下实现
- java各种算法排序图解以及原码实现
- LRU算法的实现使用linkedHashMap方法,以及使用双链表+hashtable方法
- 对Weka中DBSCAN算法的分析以及在C#中的实现
- 遗传算法解决TSP问题实现以及与最小生成树的对比
- 18位身份证号验证算法的原理以及C#实现和在管理系统的应用
- 目标检测算法(二)——具体原理以及实现
- 二分查找,二叉查找树(二叉排序树)的基本思想以及算法实现
- # 数据挖掘算法 ## 18大经典DM算法 18大数据挖掘的经典算法以及代码实现,涉及到了决策分类,聚类,链接挖掘,关联挖掘,模式挖掘等等方面,后面都是相应算法的博文链接,希望能够帮助大家学。 目前
- 数据结构与算法——插入排序以及C++函数模板实现
- MD5的简介以及实现其算法原理的各种语言的代码
- Python 实现的Binary Search 算法以及效率的对比
- Partition算法以及其应用详解下(Golang实现)