实验二进程管理2.5作业(进程)调度算法模拟1.实验目的与要求本实验的目的是通过作业或进程调度算法模拟设计,进一步加深对作业或进程调度算法的理解,通过计算平均周转时间和带权平均周转时间,进一步加深对算法的评价方法的理解。2.实验类型:验证型3.实验学时:44.实验原理和知识点(1)掌握作业或进程调度算法。(2)平均周转时间和带权平均周转时间计算。5.实验环境(硬件环境、软件环境):(1)硬件环境:IntelPentiumIII以上CPU,128MB以上内存,2GB以上硬盘。(2)软件环境:linux操作系统gcc编译器或windows操作系统vc++集成开发环境。6.实验内容设定一组作业或进程,给定相关参数,对这组进程或作业按调度算法实施调度,输出调度次序,并计算平均周转时间和带权平均周转时间。使用的调度算法有:①先来先服务调度算法。②优先级调度算法。③短作业(或进程)优先调度算法。④响应比高优先调度算法6.1使用的主要数据结构:(1)定义一个结构体,结构体的主要成员有:序号、作业(进程)号或名称、提交时间、运行时间、优先数、进入输入井时间、开始运行时间、尚需运行时间、运行结束时间、周转时间、带权周转时间、运行次序等。(2)利用定义的结构体,定义一个结构体数组,用来记录系统中的作业或进程。6.2算法描述:1.主控程序算法描述2.数据输入算法3.数据输出算法进程(作业)参数输入选择调度算法01234退出程序调用先来先服务调度程序调用优先级调度程序优先级调度程序级调度程序度程序序调用短作业(进程)调度程序调用响应比高者优先调度程序重复执行输出调度结果输入进程或作业个数对每一个进程或作业输入进程或作业名输入进程或作业号输入进程或作业到达时间输入进程或作业运行时间输入进程或作业优先级4.先来先服务调度算法描述对每个作业执行输出进程(或作业)号、进程(或作业)名、到达时间、开始运行时间、运行结束时间、优先级、运行次序、周转时间、带权周转时间计算并输出平均周转时间、带权周转时间平均系统中有未运行的作业在未运行的作业中选择一个提交时间最早的作业把运行次序填入数组相应位置;分别计算出该作业进入输入井时间、开始运行时间、运行结束时间、周转时间、带权周转时间,并填入数组相应位置。调用输出程序输出结果先来先服务调度算法5.优先级调度算法6.短作业(或进程)优先调度算法在数组中找第一个未运行的作业Rmin该作业的运行时间(当前最短的)k该作业的在数组中的下标作业的运行时间与Rnim比较有未运行的作业未找到找到Rmin该作业的运行时间k该作业的在数组中的下标长短选择运行时间最短作业的算法把运行次序填入数组相应位置;分别计算出该作业进入输入井时间、开始运行时间、运行结束时间、周转时间、带权周转时间,并填间、开始运行时间、运行结束时间、周转时间、带权周转时间,并填入数组相应位置。间、周转时间、带权周转时间,并填入数组相应位置。并填入数组相应位置。系统中有未运行的作业把运行次序填入数组相应位置;分别计算出该作业进入输入井时间、开始运行时间、运行结束时间、周转时间、带权周转时间,并填入数组相应位置。调用数据输出程序输出结果优先级调度算法在数组中找第一个未运行的作业Pmin该作业的优先数(当前最小的)k该作业的在数组中的下标作业的优先数与Pnim比较有未运行的作业未找到找到Pmin该作业的优先数k该作业的在数组中的下标大7.响应比高优先调度算法6.3C语言程序实现#includestdio.h//usingnamespacestd;#defineMAX10structtask_struct{charname[10];/*进程名称*/intnumber;/*进程编号*/floatcome_time;/*到达时间*/floatrun_begin_time;/*开始运行时间*/floatrun_time;/*运行时间*/floatrun_end_time;/*运行结束时间*/intpriority;/*优先级*/intorder;/*运行次序*/intrun_flag;/*调度标志*/}tasks[MAX];intcounter;/*实际进程个数*/intfcfs();/*先来先服务*/intps();/*优先级调度*/intsjf();/*短作业优先*/inthrrn();/*响应比高优先*/intpinput();/*进程参数输入*/intpoutput();/*调度结果输出*/系统中有未运行的作业在未运行的作业中选择一个响应比最高的作业运行(响应比相同按先来先服务进行选择)把运行次序填入数组相应位置;分别计算出该作业进入输入井时间、开始运行时间、运行结束时间、周转时间、带权周转时间,并填入数组相应位置。调用数据输出程序输出结果响应比高优先调度算法voidmain(){intoption;pinput();printf(请选择调度算法(0~4):\n);printf(1.先来先服务\n);printf(2.优先级调度\n);printf(3.短作业优先\n);printf(4.响应比高优先\n);printf(0.退出\n);scanf(%d,&option);switch(option){case0:printf(运行结束。\n);break;case1:printf(对进程按先来先服务调度。\n\n);fcfs();poutput();break;case2:printf(对进程按优先级调度。\n\n);ps();poutput();break;case3:printf(对进程按短作业优先调度。\n\n);sjf();poutput();break;case4:printf(对进程按响应比高优先调度。\n\n);hrrn();poutput();break;}}intfcfs()/*非抢占式先来先服务,该程序段默认进程已经按到达先后顺序排成了队列,如果考虑输入为乱序,还需要根据come_time对进程进行排队,形成一个先来后到的队列。*/{floattime_temp=0;inti;intnumber_schedul;time_temp=tasks[0].come_time;for(i=0;icounter;i++){tasks[i].run_begin_time=time_temp;tasks[i].run_end_time=tasks[i].run_begin_time+tasks[i].run_time;tasks[i].run_flag=1;time_temp=tasks[i].run_end_time;number_schedul=i;tasks[number_schedul].order=i+1;}return0;}/*非抢占式优先级调度,默认tasks[0]是最早到达的进程,进程已按到达先后顺序排成了队列。*/intps(){floattemp_time=0;inti=0,j;intnumber_schedul,temp_counter;/*正在被调度执行的进程编号和已经调度完成的进程个数*/intmax_priority;max_priority=tasks[i].priority;j=1;/*从从到达时间最早且相同的进程中遍历,查找第一个被调度的进程*/while((jcounter)&&(tasks[i].come_time==tasks[j].come_time))/*寻找到达时间相同优先级最高的进程。*/{if(tasks[j].prioritytasks[i].priority){max_priority=tasks[j].priority;i=j;}j++;}/*对第一个被调度的进程求相应的参数*/number_schedul=i;tasks[number_schedul].run_begin_time=tasks[number_schedul].come_time;tasks[number_schedul].run_end_time=tasks[number_schedul].run_begin_time+tasks[number_schedul].run_time;tasks[number_schedul].run_flag=1;temp_time=tasks[number_schedul].run_end_time;tasks[number_schedul].order=1;temp_counter=1;/*循环查找下一个被调度的进程,直到所有的tasks[j].run_flag==1*/while(temp_countercounter){max_priority=0;for(j=0;jcounter;j++){if((tasks[j].come_time=temp_time)&&(!tasks[j].run_flag))if(tasks[j].prioritymax_priority){max_priority=tasks[j].priority;number_schedul=j;}}/*对找到的下一个被调度的进程求相应的参数*/tasks[number_schedul].run_begin_time=temp_time;tasks[number_schedul].run_end_time=tasks[number_schedul].run_begin_time+tasks[number_schedul].run_time;tasks[number_schedul].run_flag=1;temp_time=tasks[number_schedul].run_end_time;temp_counter++;tasks[number_schedul].order=temp_counter;}return0;}intsjf()/*非抢占式短作业优先,默认tasks[0]是最早到达的进程,进程已按到达先后顺序排成了队列。*/{floattemp_time=0;inti=0,j;intnumber_schedul,temp_counter;/*正在被调度执行的进程编号和已经调度完成的进程个数*/floatrun_time;/*借助该局部变量可以帮助找到执行时间run_time最短进程*/run_time=tasks[i].run_time;j=1;/*从到达时间最早且相同的进程中查找第一个被调度的进程*/while((jcounter)&&(tasks[i].come_time==tasks[j].come_time)){if(tasks[j].run_timetasks[i].run_time){run_time=tasks[j].run_time;i=j;}j++;}/*对第一个被调度的进程求相应的参数*/number_schedul=i;tasks[number_schedul].run_begin_time=tasks[number_schedul].come_time;tasks[number_schedul].run_end_time=tasks[number_schedul].run_begin_time+tasks[number_schedul].run_time;tasks[number_schedul].run_flag=1;temp_time=tasks[number_schedul].run_end_time;tasks[number_schedul].order=1;temp_counter=1;/*循环查找下一个被调度的进程,直到所有的tasks[j].run_flag==1*/while(temp_countercounter){/*找到在上一个进程执行期间(到“目前”为止)到达时间最晚的一个进程*/for(j=0;jcounter;j++){if((tasks[j].come_time=temp_time)&&(!tasks[j].run