一、实验目的
模拟单处理器系统的进程调度,采用短作业优先的进程调度算法作为进程设计算法,以加深对进程的概念及进程调度算法的理解.
二、实验内容
#include #include #include #include #define N 5 struct PCB { 进程名称 到达时间 运行时间 完成时间 int zhouzhuan_time; //周转时间 带权周转时间 bool finished; //是否运行完成 }; //进程初始化 struct PCB pcb[N]= //进程输出函数 void output() 进程名 到达时间 运行时间 完成时间 周转时间 带权周转时间\\n"); printf(" %s %d %d %d %d %f\\n",pcb[i].name,pcb[i].arrive_time,pcb[i].run_time,pcb[i].finish_time,pcb[i].zhouzhuan_time,pcb[i].daiquan_time); } void main() int last_finishedPCB_index; //记录上一次已经运行的进程的数组下标 // 运行第一个到达的进程 得到它的完成时间、周转时间等,并设置为已访问 //下面在剩下的进程中循环找出运行时间最小的进程, //计算它的完成时间、周转时间等,并设置为已访问。 先找出没有访问过的运行时间最小的进程的下标 index=-1; min_time=100; for(j=0;j if(min_time>pcb[j].run_time&&pcb[j].finished==false) { min_time=pcb[j].run_time; index=j; } } 运行找到的最短进程 得到它的完成时间、周转时间等,并设置为已访问 pcb[index].zhouzhuan_time=pcb[index].finish_time-pcb[index].arrive_time; pcb[index].finished =true; } 要求: 1. 认真阅读并理解上述程序,在实验报告中说明短作业优先调度算法中计算各进程的完成时间、周转时间思路。 2. 上面程序没有求每个进程的带权周转时间、平均周转时间,平均带权周转时间,能否加上,结果输出的格式按类似P90表4-2 输出。 3. 上面程序没有考虑某进程的运行时间最短,但它还没有到达的情况,请改写程序,将这种情况考虑进去,使程序正确。如进程信息如下: struct PCB pcb[N]= 实验报告书写 1.写出你对给出的程序的理解,可以包括学到了那些程序设计的语法或方法,以及算法的设计思想。 2.写出实验指导中要求部分是如何实现的, 3.上述部分不能只是抄写代码,要有说明。 附录: 先来先服务进程调度模拟程序 #include #include #include #include #define N 5 struct PCB { char name[8]; int arrive_time; int run_time; int finish_time; int zhouzhuan_time; }; int total=0; struct PCB pcb[N],temp; void output() { printf("----------------------------------------------------------------------------------------------\\n"); printf("进程名 到达时间 运行时间 完成时间 周转时间 \\n"); printf("----------------------------------------------------------------------------------------------\\n"); for(int i=0;i printf(" %s %d %d %d %d \\n",pcb[i].name,pcb[i].arrive_time,pcb[i].run_time,pcb[i].finish_time,pcb[i].zhouzhuan_time); } printf("----------------------------------------------------------------------------------------------\\n"); } void main() { int i,j; for ( i=0;i printf("请输入进程名\\n" ); scanf("%s",pcb[i].name); printf("请输入到达时间:"); scanf("%d",&pcb[i].arrive_time); printf("请输入要运行时间"); scanf("%d",&pcb[i].run_time); } for( i=0;i printf("%d ",pcb[i].arrive_time); printf("%d \\n",pcb[i].run_time); } pcb[0].finish_time=pcb[0].arrive_time+pcb[0].run_time; pcb[0].zhouzhuan_time=pcb[0].finish_time-pcb[0].arrive_time; for(i=1;i pcb[i].finish_time=pcb[i-1].finish_time+pcb[i].run_time; pcb[i].zhouzhuan_time=pcb[i].finish_time-pcb[i].arrive_time; } output(); }
4. 附加: 将该程序和先来先服务程序合成一个程序,并提供菜单选择执行短作业优先或先来先服务?(提示: 进程的初始化、进程的输出、进程的排序等只要定义一个,将FCFS 、SJF 的计算完成时间、周转时间、带权周转时间等的功能做成两个函数,函数名建议为FCFS、SJF。在主函数中建立菜单进行调用。进程名 到达时间 运行时间 完成时间 周转时间 A 0 4 4 4 B 1 3 7 6 C 2 5 16 14 D 20 2 22 3 E 4 4 11 7