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

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

