目录
第1关:先来先服务调度算法
任务描述
本关任务:编写一个先来先服务器调度算法解决一个实际的进程调度问题,并打印出每个进程的完成时间、周转时间和带权周转时间
相关知识
为了完成本关任务,你需要掌握:1.先来先服务调度算法,2.进程周转时间和平均周转时间的计算方法。
先来先服务调度算法FCFS
FCFS是最简单的调度算法,该算法既可用于作业调度,也可用于进程调度。当在作业调度中采用该算法时,系统将按照作业到达的先后次序来进行调度,或者说它是优先考虑在系统中等待时间最长的作业,
周转时间和带权周转时间
周转时间=完成时间-到达时间
带权周转时间=周转时间/执行时间
编程要求
给定一组进程的到达时间和服务时间,实现先来先服务调度算法,并打印出调度结果,包括每个进程的完成时间、周转时间和带权周转时间。
进程 到达时间 服务时间
A 0 3
B 2 6
C 4 4
D 6 5
E 8 2
分析:
先来先服务调度算法
按照先后次序进行完成
首先从前往后遍历结构体数组,
如果到达时间小于或等于当前时间,则可以完成该作业,
否则到达时间大于当前时间则需要等待,即将当前时间更新为到达时间
答案:
#include <stdio.h> #include <string.h> #define N 5 typedef struct JCB { char name[10]; int arriveTime; //到达时间 int serveTime; //服务时间 int finishTime; //完成时间 int aroundTime; //周转时间 float waroundTime; //带权周转时间 }PCB; void input(PCB pcb[N]) { strcpy(pcb[0].name,"A"); pcb[0].arriveTime = 0; pcb[0].serveTime = 3; strcpy(pcb[1].name,"B"); pcb[1].arriveTime = 2; pcb[1].serveTime = 6; strcpy(pcb[2].name,"C"); pcb[2].arriveTime = 4; pcb[2].serveTime = 4; strcpy(pcb[3].name,"D"); pcb[3].arriveTime = 6; pcb[3].serveTime = 5; strcpy(pcb[4].name,"E"); pcb[4].arriveTime = 8; pcb[4].serveTime = 2; int i = 0; for(; i < N; ++i) { pcb[i].finishTime = 0; pcb[i].aroundTime = 0; pcb[i].waroundTime = 0; } } void output(PCB pcb[N]) { int i = 0; printf("进程\t"); printf("完成时间\t"); printf("周转时间\t"); printf("带权周转时间\t\n"); for(; i < N; ++i) { printf("%s\t",pcb[i].name); printf("%d\t\t",pcb[i].finishTime); printf("%d\t\t",pcb[i].aroundTime); printf("%f\t\t\n",pcb[i].waroundTime); } } //先来先服务调度算法 void FCFS(PCB pcb[N]) { //请补充先来先服务算法的实现代码 int i; int currentTime=0; for(i=0;i<N;i++) { if(pcb[i].arriveTime>currentTime)//到达时间晚于当前时间,等待 { currentTime=pcb[i].arriveTime; } currentTime=currentTime+pcb[i].serveTime;//更新当前时间 pcb[i].finishTime=currentTime;//更新完成时间 pcb[i].aroundTime=pcb[i].finishTime-pcb[i].arriveTime;//计算周转时间 pcb[i].waroundTime=1.0*pcb[i].aroundTime/pcb[i].serveTime;//计算带权周转时间 } } int main() { PCB pcb[N]; input(pcb); FCFS(pcb); printf("先来先服务FCFS:\n"); output(pcb); printf("\n"); }
第2关:短作业优先调度算法
任务描述
本关任务:编写一个先来先服务器调度算法解决一个实际的进程调度问题,并打印出每个进程的完成时间、周转时间和带权周转时间
相关知识
为了完成本关任务,你需要掌握:1.短作业优先调度算法,2.进程周转时间和平均周转时间的计算方法。
短作业优先调度算法SJF
SJF算法是以作业的长短来计算优先级,作业越短,其优先级越高。作业的长短是以作业所要求的运行时间来衡量的。SJF算法可以分别用于作业调度和进程调度,处理机优先选择运行时间短的作业或者进程。
周转时间和带权周转时间
周转时间=完成时间-到达时间
带权周转时间=周转时间/执行时间
编程要求
给定一组进程的到达时间和服务时间,实现短作业优先调度算法,并打印出调度结果,包括每个进程的完成时间、周转时间和带权周转时间。
进程 到达时间 服务时间
A 0 3
B 2 6
C 4 4
D 6 5
E 8 2
分析:
短作业优先调度算法
服务时间越短优先级越高
寻找到达时间小于等于当前时间,且服务时间最短的作业完成
答案:
#include <stdio.h> #include <string.h> #define N 5 typedef struct JCB { char name[10]; int arriveTime; //到达时间 int serveTime; //服务时间 int finishTime; //完成时间 int aroundTime; //周转时间 float waroundTime; //带权周转时间 }PCB; void input(PCB pcb[N]) { strcpy(pcb[0].name,"A"); pcb[0].arriveTime = 0; pcb[0].serveTime = 3; strcpy(pcb[1].name,"B"); pcb[1].arriveTime = 2; pcb[1].serveTime = 6; strcpy(pcb[2].name,"C"); pcb[2].arriveTime = 4; pcb[2].serveTime = 4; strcpy(pcb[3].name,"D"); pcb[3].arriveTime = 6; pcb[3].serveTime = 5; strcpy(pcb[4].name,"E"); pcb[4].arriveTime = 8; pcb[4].serveTime = 2; int i = 0; for(; i < N; ++i) { pcb[i].finishTime = 0; pcb[i].aroundTime = 0; pcb[i].waroundTime = 0; } } void output(PCB pcb[N]) { int i = 0; printf("进程\t"); printf("完成时间\t"); printf("周转时间\t"); printf("带权周转时间\t\n"); for(; i < N; ++i) { printf("%s\t",pcb[i].name); printf("%d\t\t",pcb[i].finishTime); printf("%d\t\t",pcb[i].aroundTime); printf("%f\t\t\n",pcb[i].waroundTime); } } //短作业优先调度算法 void SJF(PCB pcb[N]) { //请补充短作业优先算法的实现代码 int st[N]={0};//标记是否完成 int currentTime=0;//记录当前时间 int minx;//查找每次的最小执行时间 int index;//记录下标 for(int i=0;i<N;i++) { minx=0x3f3f3f3f;//为了查找最小值,先赋予一个无穷大的值,0x3f3f3f3f是一个很大的值 for(int j=0;j<N;j++) { if(!st[j]&&pcb[j].arriveTime<=currentTime)//如果没完成,并且到达时间小于等于当前时间 { if(minx>pcb[j].serveTime)//则判断执行时间是否比记录的执行时间小 { minx=pcb[j].serveTime;//是则记录下来 index=j; } } } st[index]=1;//完成则标记,置为1 currentTime=currentTime+pcb[index].serveTime;//更新当前时间 pcb[index].finishTime=currentTime;//计算完成时间 pcb[index].aroundTime=pcb[index].finishTime-pcb[index].arriveTime;//计算周转时间 pcb[index].waroundTime=1.0*pcb[index].aroundTime/pcb[index].serveTime;//计算带权周转时间 } } int main() { PCB pcb[N]; input(pcb); SJF(pcb); printf("短作业优先SJF:\n"); output(pcb); printf("\n"); }
第3关:高响应比优先调度算法
任务描述
本关任务:编写一个高响应比优先调度算法解决一个实际的进程调度问题,并打印出每个进程的完成时间、周转时间和带权周转时间
相关知识
为了完成本关任务,你需要掌握:1.先来先服务调度算法,2.进程周转时间和平均周转时间的计算方法。3、响应比的计算方法
高响应比优先调度算法HRRN
在批处理系统中,FCFS算法所考虑的只是作业的等待时间,而忽视了作业的运行时间。而SJF算法正好与之相反,只考虑作业的运行时间,而忽视了作业的等待时间。高响应比优先调度算法则是既考虑了作业的等待时间,又考虑作业运行时间的调度算法,因此既照顾了短作业,又不致使长作业的等待时间过长,从而改善了处理机调度的性能。 高响应比优先算法引入了响应比的概念,响应比定义如下 响应比=(等待时间+运行时间)/运行时间 高响应比优先算法每次选择响应比最高的进程,进程的响应比是动态变化的,既考虑了进程的等待时间,也考虑了进程的服务时间。
周转时间和带权周转时间
周转时间=完成时间-到达时间
带权周转时间=周转时间/执行时间
编程要求
给定一组进程的到达时间和服务时间,实现高响应比优先调度算法,并打印出调度结果,包括每个进程的完成时间、周转时间和带权周转时间。
进程 到达时间 服务时间
A 0 3
B 2 6
C 4 4
D 6 5
E 8 2
分析:
高响应比优先调度算法
响应比高的优先
计算每个作业的响应比,再挑选其中最高的先完成
标签:处理机,int,调度,算法,时间,周转,pcb From: https://blog.csdn.net/qwertf123/article/details/139686759答案:
#include <stdio.h> #include <string.h> #define N 5 typedef struct JCB { char name[10]; int arriveTime; //到达时间 int serveTime; //服务时间 int finishTime; //完成时间 int aroundTime; //周转时间 float waroundTime; //带权周转时间 }PCB; void input(PCB pcb[N]) { strcpy(pcb[0].name,"A"); pcb[0].arriveTime = 0; pcb[0].serveTime = 3; strcpy(pcb[1].name,"B"); pcb[1].arriveTime = 2; pcb[1].serveTime = 6; strcpy(pcb[2].name,"C"); pcb[2].arriveTime = 4; pcb[2].serveTime = 4; strcpy(pcb[3].name,"D"); pcb[3].arriveTime = 6; pcb[3].serveTime = 5; strcpy(pcb[4].name,"E"); pcb[4].arriveTime = 8; pcb[4].serveTime = 2; int i = 0; for(; i < N; ++i) { pcb[i].finishTime = 0; pcb[i].aroundTime = 0; pcb[i].waroundTime = 0; } } void output(PCB pcb[N]) { int i = 0; printf("进程\t"); printf("完成时间\t"); printf("周转时间\t"); printf("带权周转时间\t\n"); for(; i < N; ++i) { printf("%s\t",pcb[i].name); printf("%d\t\t",pcb[i].finishTime); printf("%d\t\t",pcb[i].aroundTime); printf("%f\t\t\n",pcb[i].waroundTime); } } //高响应比优先调度算法 void HRRN(PCB pcb[N]) { //请补充高响应比优先调度算法实现代码 int st[N]={0};//判断是否完成 int xyb;//响应比 int currentTime=0;//当前时间 int index; for(int i=0;i<N;i++) { xyb=0; for(int j=0;j<N;j++) { if(st[j])continue; int run=currentTime-pcb[j].arriveTime;//计算等待时间 int t=(run+pcb[j].serveTime)/pcb[j].serveTime;//计算响应比 if(xyb<t)//找到响应比最高的下标 { xyb=t; index=j;//记录响应比最高的下标 } } st[index]=1;//完成则标记,置为1 currentTime=currentTime+pcb[index].serveTime;//更新当前时间 pcb[index].finishTime=currentTime;//计算完成时间 pcb[index].aroundTime=pcb[index].finishTime-pcb[index].arriveTime;//计算周转时间 pcb[index].waroundTime=1.0*pcb[index].aroundTime/pcb[index].serveTime;//计算带权周转时间 } } int main() { PCB pcb[N]; input(pcb); HRRN(pcb); printf("高响应比优先HRRN:\n"); output(pcb); }