SCFS、SFJ代码实现

SCFS、SFJ代码实现本文介绍了两种作业调度算法的实现 先来先服务 FCFS 和短作业优先 SFJ

大家好,欢迎来到IT知识分享网。

目录

实验所用测试数据

 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
  • SCFS、SFJ代码实现

 FCFS代码实现:

#include "stdio.h" #include "string.h" #include "stdlib.h" #include<stdbool.h> #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运行结果:

SCFS、SFJ代码实现

 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; else current_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运行结果:

SCFS、SFJ代码实现

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/151350.html

(0)
上一篇 2025-03-14 13:00
下一篇 2025-03-14 13:10

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信