高响应比作业调度
#include <malloc.h> #include <cstdio> #include <cstring> #define N 10 typedef struct table { char name[8]; // 作业名 float in_well; // 进入输入井的时间 float begin_run; // 开始运行时间 float run_time; // 运行时间 float end_run; // 结束运行时间 float turnover_time;// 周转时间 }jobtable; void init(jobtable job[], int n) { int i, j; printf("input %d job information\n", n); printf("in_well run_time name\n"); for(i = 0; i < n; ++ i) { scanf("%f %f %s", &job[i].in_well, &job[i].run_time, job[i].name); job[i].begin_run = 0.0; job[i].end_run = 0.0; job[i].turnover_time = 0.0; } } void print(jobtable job[], int n) { int i; printf("name in_well run_time begin_run end_run turnover_time\n"); for(i = 0; i < n; ++ i) { printf("%s\t%0.1f\t%0.1f\t", job[i].name, job[i].in_well, job[i].run_time); if(job[i].begin_run == 0.0 && job[i].end_run == 0.0 && job[i].turnover_time == 0.0) { printf(" \n"); } else { printf("%9.1f%9.1f\t%0.1f\n", job[i].begin_run, job[i].end_run, job[i].turnover_time); } } } void swap(jobtable job[], int p, int q) { float temp1; char temp2[8]; strcpy(temp2, job[p].name); strcpy(job[p].name, job[q].name); strcpy(job[q].name, temp2); temp1 = job[p].in_well; job[p].in_well = job[q].in_well; job[q].in_well = temp1; temp1 = job[p].run_time; job[p].run_time = job[q].run_time; job[q].run_time = temp1; } // 模拟当前作业表的调度过程 float response_ratio(jobtable job[], int n) { int i, j, temp; float average_time, ratio1, ratio2; job[0].begin_run = job[0].in_well; job[0].end_run = job[0].begin_run + job[0].run_time; job[0].turnover_time = job[0].end_run - job[0].begin_run; average_time = job[0].turnover_time; for(i = 1; i < n; ++ i) { if(job[i].in_well <= job[i - 1].end_run) { j = i + 1; temp = i; ratio1 = 1 + (job[i - 1].end_run - job[i].in_well) * 1.0 / job[i].run_time; while(j < n && job[j].in_well <= job[i - 1].end_run) { ratio2 = 1 + (job[i - 1].end_run - job[j].in_well) * 1.0 / job[j].run_time; if(ratio2 > ratio1) { temp = j; } j ++; } if(temp != i) { swap(job, i, temp); } } job[i].begin_run = job[i - 1].end_run; job[i].end_run = job[i].begin_run + job[i].run_time; job[i].turnover_time = job[i].end_run - job[i].in_well; average_time = average_time + job[i].turnover_time; } return (average_time / n); } int main() { int n; float ave_turnover_time; jobtable job[N]; printf("input job numbers\n"); scanf("%d", &n); if(n <= N) { printf("按照进入输入井的先后顺序初始化作业表\n"); init(job, n); printf("initial station\n"); print(job, n); ave_turnover_time = response_ratio(job, n); printf("termination station\n"); print(job, n); printf("ave_turnover_time is : %.1f\n", ave_turnover_time); } else { printf("error!\n"); } return 0; } /* 0 120 a 30 60 b 90 15 c */