SCFS、SFJ代码实现

目录

实验所用测试数据

 FCFS代码实现

         FCFS运行结果

 SFJ代码实现

        SFJ运行结果


实验所用测试数据

  • 作业id
  • 到达时间
  • 执行时间
  • 优先权
  • 1
  • 800
  • 50
  • 0
  • 2
  • 815
  • 30
  • 1
  • 3
  • 830
  • 25
  • 2
  • 4
  • 835
  • 20
  • 2
  • 5
  • 845
  • 15
  • 2
  • 6
  • 700
  • 10
  • 1
  • 7
  • 820
  • 5
  • 0

 FCFS代码实现:

#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#include
#define MAXJOB 50
//作业的数据结构
typedef struct node
{int number;int reach_time;int need_time;int privilege;float excellent;//响应比int start_time;int wait_time;int visited;//作业是否被访问过int isreached;//作业是否抵达
}job;job jobs[MAXJOB];
int quantity;//初始化作业序列
void initial_jobs()
{int i;for (i = 0;i < MAXJOB;i++){jobs[i].number = 0;jobs[i].reach_time = 0;jobs[i].privilege = 0;jobs[i].excellent = 0;jobs[i].start_time = 0;jobs[i].wait_time = 0;jobs[i].visited = 0;jobs[i].isreached = 0;}quantity = 0;
}//重置全部作业信息
void reset_jinfo()
{int i;for (i = 0;i < MAXJOB;i++){jobs[i].start_time = 0;jobs[i].wait_time = 0;jobs[i].visited = 0;}
}//查找最早到达作业,若全部到达返回-1
int findrearlyjob(job jobs[], int count)
{int rearlyloc = -1;int rearlyjob = -1;for (int i = 0;i < count;i++){if (rearlyloc == -1){if (jobs[i].visited == 0){rearlyloc = i;rearlyjob = jobs[i].reach_time;}}else if (rearlyjob > jobs[i].reach_time && jobs[i].visited == 0){rearlyjob = jobs[i].reach_time;rearlyloc = i;}}return rearlyloc;
}
//查找当前current_time已到达未执行的最短作业,若无返回-1
int findminjob(job jobs[], int count)
{int minjob = -1;int minloc = -1;for (int i = 0;i < count;i++){if (minloc == -1){if (jobs[i].isreached == 1 && jobs[i].visited == 0){minjob = jobs[i].need_time;minloc = i;}}else if (minjob > jobs[i].need_time && jobs[i].visited == 0 && jobs[i].isreached == 1){minjob = jobs[i].need_time;minloc = i;}}return minloc;
}//读取作业数据
void readJobdata()
{FILE* fp;char fname[20];int i;//输入测试文件名printf("please input job data file name\n");scanf("%s", fname);if ((fp = fopen(fname, "r")) == NULL){printf("Error! Open file failed, please chech filename:\n");}else{//依次读取作业信息while (!feof(fp)){if (fscanf(fp, "%d %d %d %d", &jobs[quantity].number, &jobs[quantity].reach_time, &jobs[quantity].need_time, &jobs[quantity].privilege) == 4)quantity++;}printf("Output the origin job data\n");printf("----------------------------------------------------------\n");printf("\tjobID\treachtime\tneedtime\tprivilege\n");for (i = 0;i < quantity;i++){printf("\t%-8d\t%-8d\t%-8d\t%-8d\n", jobs[i].number, jobs[i].reach_time, jobs[i].need_time, jobs[i].privilege);}}
}
//FCFS
void FCFS()
{int i;int current_time = 0;int loc;int total_waitime = 0;int total_roundtime = 0;//获取最近到达的作业loc = findrearlyjob(jobs, quantity);//输出作业流printf("FCFS算法作业流\n");printf("----------------------------------------------------------\n");printf("\tjobID\treachtime\tstarttime\twaittime\troundtime\n");current_time = jobs[loc].reach_time;//每次循环找出最先到达的作业并输出相关信息for (i = 0;i < quantity;i++){if (jobs[loc].reach_time > current_time){jobs[loc].start_time = jobs[loc].reach_time;current_time = jobs[loc].reach_time;}else{jobs[loc].start_time = current_time;}jobs[loc].wait_time = current_time - jobs[loc].reach_time;printf("\t%-8d\t%-8d\t%-8d\t%-8d\t%-8d\n", loc+1, jobs[loc].reach_time, jobs[loc].start_time, jobs[loc].wait_time, jobs[loc].wait_time+jobs[loc].need_time);jobs[loc].visited = 1;current_time += jobs[loc].need_time;total_waitime += jobs[loc].wait_time;total_roundtime = total_roundtime + jobs[loc].wait_time + jobs[loc].need_time;//获取剩余作业中最近到达作业loc = findrearlyjob(jobs, quantity);}printf("总等待时间:%-8d 总周转时间:%-8d\n", total_waitime, total_roundtime);printf("平均等待时间:%4.2f 平均周转时间:%4.2f\n", (float)total_waitime / quantity, (float)total_roundtime / quantity);
}int main()
{initial_jobs();readJobdata();FCFS();reset_jinfo();system("pause");return 0;
}

 FCFS运行结果:

 SFJ代码实现:

//SFJ
void SFJschedulejob()
{int i;int current_time = 0;int loc;int total_waitime = 0;int total_roundtime = 0;//输出作业流printf("\n\nSF算法作业流\n");printf("----------------------------------------------------------\n");printf("\tjobID\treachtime\tstarttime\twaittime\troundtime\n");//从作业队列中找出最早到达的作业loc = findrearlyjob(jobs, quantity);//设置当前时间为最早到达作业的到达时间,设置与该作以同时到达的作业的到达标志current_time = jobs[loc].reach_time;jobs[loc].isreached = true;for (i = 0;i < quantity;i++){if (jobs[i].reach_time == jobs[loc].reach_time)jobs[i].isreached = true;}//获取需要运行时间最短的作业loc = findminjob(jobs, quantity);//每次循环找出运行时间最短的作业并输出相关信息for (i = 0;i < quantity;i++){jobs[loc].start_time = current_time;jobs[loc].wait_time = current_time - jobs[loc].reach_time;printf("\t%-8d\t%-8d\t%-8d\t%-8d\t%-8d\n", loc + 1, jobs[loc].reach_time, jobs[loc].start_time, jobs[loc].wait_time, jobs[loc].wait_time + jobs[loc].need_time);jobs[loc].visited = 1;int loc1 = findrearlyjob(jobs, quantity);if (jobs[loc1].reach_time <= current_time+jobs[loc].need_time)current_time += jobs[loc].need_time;elsecurrent_time = jobs[loc1].reach_time;total_waitime += jobs[loc].wait_time;total_roundtime = total_roundtime + jobs[loc].wait_time + jobs[loc].need_time;//为目前已经到达的作业做标记for (int j = 0;j < quantity;j++){if (jobs[j].reach_time <=current_time)jobs[j].isreached = true;}//获取剩余作业中最短作业loc = findminjob(jobs, quantity);}printf("总等待时间:%-8d 总周转时间:%-8d\n", total_waitime, total_roundtime);printf("平均等待时间:%4.2f 平均周转时间:%4.2f\n", (float)total_waitime / quantity, (float)total_roundtime / quantity);
}

SFJ运行结果:


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部