当前位置:文档之家› 作业调度算法

作业调度算法

XI`AN TECHNOLOGICAL UNIVERSITY 实验报告西安工业大学实验报告一、实验目的进程调度是处理机管理的核心内容。

本实验要求用高级语言编写模拟进程调度程序,以便加深理解有关进程控制快、进程队列等概念,并体会和了解优先级算法的具体实施办法。

二、实验原理由于在单道批处理系统中,作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所占用的 CPU时限等因素。

1.先来先服务算法:按照作业提交给系统的先后顺序来挑选作业,先提交的先被挑选。

2.最短作业优先算法:是以进入系统的作业所提出的“执行时间”为标准,总是优先选取执行时间最短的作业。

3.优先级作业优先算法:是以进入系统的作业所提出的“优先级”为标准,总是优先选取优先级小的作业。

三、实验步骤、数据记录及处理实验步骤:1. 先定义一个结构体,在主函中先调用input()输入函数,在input()输入函数中,依次按着提示输入数据。

三种作业调度算法分别在三个子函数中执行:分别使用了fcfs(pc,i);short_in(pc,i);psa(pc,i);三个函数分别实现先来先服务算法、短作业优先算法和优先级算法。

这里先把段作业优先的思路理一理。

在短作业优先调度算法函数short_in()中,按照短作业优先调度的算法规则,每个作业完成后,在其完成时间前提交的作业中,运行时间最短的作业程序优先计算,在所有的作业都执行执行完后,程序再算出这种算法的平均周转时间和平均带权周转时间,并将所有的作业按其执行的顺序进行排序;代码实现(c语言):#include<stdio.h>#include<stdlib.h>#define MAX_SIZE 100typedefstruct_PCB{int pid; //进程号int serve_time;//服务时间int com_tim; //到达时间int pri;//优先级int finish_time;//完成时间float zh_tim; //周转时间float dzhi_time;//带权周转时间}PCB;void swap(PCB *p,PCB *s){PCBtmp = *p;*p= *s ;*s = tmp;}void sort_cm(PCB *p,int len){for(int i = 0;i<len-1;i ++){for(int j = 0;j<len-1-i;j ++){if(p[j].com_tim>p[j+1].com_tim){swap(&p[j],&p[j+1]);}}}}void sort_serv(PCB *p,int start,int end){for(int i = start;i<end ;i ++){for(int j = start ;j<end;j ++){if(p[j].serve_time>p[j+1].serve_time){swap(&p[j],&p[j+1]);}}}}void sort_pri(PCB *p,int start,int end){for(int i = start;i<end ;i ++){for(int j = start ;j<end;j ++){if(p[j].pri>p[j+1].pri){swap(&p[j],&p[j+1]);}}}}void fcfs(PCB *p ,int len)//先来先服务{int i = 0;sort_cm(p,len);p[0].finish_time = p[0].serve_time ;p[0].zh_tim = p[0].finish_time - p[0].com_tim;p[0].dzhi_time = p[0].zh_tim / p[0].serve_time;p[0].pri = 1;while(i<len-1){i ++;p[i].finish_time = p[i].serve_time + p[i-1].finish_time;p[i].zh_tim = p[i].finish_time - p[i].com_tim;p[i].dzhi_time = p[i].zh_tim / p[i].serve_time;p[i].pri = 1;}}void short_in(PCB *p ,int len)//短作业优先{int i = 1;int k =0;int count = 0;sort_cm(p,len);p[0].finish_time = p[0].serve_time ;p[0].zh_tim = p[0].finish_time - p[0].com_tim;p[0].dzhi_time = p[0].zh_tim / p[0].serve_time;p[0].pri = 1;k = 0;while(i<len){for(int j = i;j<len;j ++){if(p[k].finish_time>= p[j].com_tim){count ++;}}sort_serv(p,i,i+count-1);while(count>0){p[i].finish_time = p[i].serve_time + p[k].finish_time;p[i].zh_tim = p[i].finish_time - p[i].com_tim;p[i].dzhi_time = p[i].zh_tim / p[i].serve_time;p[i].pri = 1;k = i;i ++;count --;}count = 0;}}void psa(PCB *p ,int len)//优先级是算法{int i = 1;int k =0;int count = 0;sort_cm(p,len);p[0].finish_time = p[0].serve_time ;p[0].zh_tim = p[0].finish_time - p[0].com_tim;p[0].dzhi_time = p[0].zh_tim / p[0].serve_time;k = 0;while(i<len){for(int j = i;j<len;j ++){if(p[k].finish_time>= p[j].com_tim){count ++;}}sort_pri(p,i,i+count-1);while(count>0){p[i].finish_time = p[i].serve_time + p[k].finish_time;p[i].zh_tim = p[i].finish_time - p[i].com_tim;p[i].dzhi_time = p[i].zh_tim / p[i].serve_time;k = i;i ++;count --;}count = 0;}}void show(PCB *p ,int len){printf("\n");printf("进程号到达时间服务时间优先级完成时间周转时间带权周转时间\n ");for(int i = 0; i<len ; i ++){printf(" %2d %9d %9d %7d %10d %9.2f %9.2f\n",p[i].pid,p[i].com_tim,p[i].serve_ time,p[i].pri,p[i].finish_time,p[i].zh_tim,p[i].dzhi_time);}printf("\n");}void input(PCB *pc){int i = 0;int h = 0;int m = 0;printf("请输入要输入的进程数量\n");scanf("%d",&h);printf("如果逆选择的是短作业和先来先服务,那么你的优先级默认\n");printf("请输入进程号、到达时间、完成时间:格式如下(进程号-到达时间-服务时间-优先级)\n");while(h> 0){scanf("%d-%d-%d-%d",&pc[i].pid,&pc[i].com_tim,&pc[i].serve_time,&pc[i].pri);fflush(stdin);i ++;h --;}printf("请输入你要选择的算法::先来先服务算法2:短作业优先算法3:优先级算法\n");scanf("%d",&m);switch(m){case 1:fcfs(pc,i);printf("先来先服务的进程列表:\n");break;case 2:short_in(pc,i);printf("短作业优先的进程列表:\n");break;case 3:psa(pc,i);printf("优先级的进程列表:\n");break;default:printf("你输入的有误\n");break;}show(pc,i);}int main(){PCBpc[MAX_SIZE] ;input(pc);return 0;}测试结果:1、先来先服务:2、短作业优先3、优先级算法。

相关主题