操作系统作业调度.docx
- 文档编号:4087220
- 上传时间:2022-11-27
- 格式:DOCX
- 页数:15
- 大小:83KB
操作系统作业调度.docx
《操作系统作业调度.docx》由会员分享,可在线阅读,更多相关《操作系统作业调度.docx(15页珍藏版)》请在冰豆网上搜索。
操作系统作业调度
操作系统
实
验
报
告
(1)
学院:
计算机科学与技术学院
班级:
计091
学号:
0913022032
姓名:
曹恒楼
时间:
2011/11/28
目录
1.实验名称……………………………………………………3
2.实验目的……………………………………………………3
3.实验内容……………………………………………………3
4.实验要求……………………………………………………3
5.实验环境……………………………………………………3
6.实验设计……………………………………………………3
6.1数据结构设计……………………………………………………………………3
6.2算法设计…………………………………………………………………………4
6.3功能模块设计……………………………………………………………………8
7.实验运行结果………………………………………………9
8.实验心得……………………………………………………11
附录:
源代码(部分)…………………………………………………………………11
一、实验名称:
用C++实现作业调度算法
二、实验目的:
通过自己编程来实现各个调度算法,进一步理解进程调度各种算法的概念及含义,提高对算法的认识,同时提高自己的动手实践能力。
三、实验内容:
利用C++,实现进程调度算法,有先来先服务、优先级调度、短作业优先、响应比高优先,这四个算法。
四、实验要求:
1.至少完成三个进程调度算法的设计
2.分别计算出算法实现的平均作业周转时间、平均带权作业周转时间。
五、实验环境:
Win-7系统
VisualC++6.0
六、实验设计:
1.数据结构设计
定义结构体:
(对不同算法,均按此结构定义)
structtask_struct//定义结构体
{
charname[10];//进程名称
floatcome_time;//到达时间
floatrun_begin_time;//开始运行时间
floatrun_time;//运行时间
floatrun_end_time;//运行结束时间
intpriority;//优先级
intorder;//运行次序
intrun_flag;//调度标志
};
2.算法设计
1)FCFS算法
先来先服务,利用冒泡排序,按照进程到达时间进行排序
voidbubble(floataa[],intcounter)//用来对fcfs采用冒泡排序
{
floatt;
for(inta=1;a for(intb=0;b { if(aa[b]>aa[b+1]) {t=aa[b];aa[b]=aa[b+1];aa[b+1]=t;} } } 计算周转时间 intfcfs()//先来先服务 { floattime_temp=0;//临时时间 float*aa=newfloat[counter];//为冒泡排序的实现,创建一个新的数组 inti; intnumber_schedul; time_temp=tasks[0].come_time; for(intc=0;c { aa[c]=tasks[c].come_time; } bubble(aa,counter);//调用冒泡函数进行排序 for(intd=0;d for(inte=0;e { if(aa[d]==tasks[e].come_time)//处理顺序即为排序后的顺序 tasks[e].order=d+1; } for(i=0;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; } return0; } 2)SJF算法 intsjf()//短作业优先 { floattemp_time=0; inti=0,j; intnumber_schedul,temp_counter; floatrun_time; run_time=tasks[i].run_time;//初始化运行时间 j=1; while((j { if(tasks[j].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; while(temp_counter { for(j=0;j { if((tasks[j].come_time<=temp_time)&&(! tasks[j].run_flag)) { run_time=tasks[j].run_time;number_schedul=j;break; } } for(j=0;j { if((tasks[j].come_time<=temp_time)&&(! tasks[j].run_flag)) if(tasks[j].run_time { run_time=tasks[j].run_time; 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; } 3)HRRN算法 inthrrn()//响应比高优先 { intj,number_schedul,temp_counter; floattemp_time,respond_rate,max_respond_rate; //第一个进程被调度 tasks[0].run_begin_time=tasks[0].come_time; tasks[0].run_end_time=tasks[0].run_begin_time+tasks[0].run_time; temp_time=tasks[0].run_end_time; tasks[0].run_flag=1; tasks[0].order=1; temp_counter=1; //调度其他进程 while(temp_counter { max_respond_rate=0; for(j=1;j { if((tasks[j].come_time<=temp_time)&&(! tasks[j].run_flag)) { respond_rate=(temp_time-tasks[j].come_time)/tasks[j].run_time; if(respond_rate>max_respond_rate) { max_respond_rate=respond_rate; 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; temp_time=tasks[number_schedul].run_end_time; tasks[number_schedul].run_flag=1; temp_counter+=1; tasks[number_schedul].order=temp_counter; } return0; } 4)PS算法 intps()//优先级调度 { floattemp_time=0; inti=0,j; intnumber_schedul,temp_counter; intmax_priority; max_priority=tasks[i].priority; j=1; while((j {//查找第一个被调度的进程 if(tasks[j].priority>tasks[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; while(temp_counter { max_priority=0; for(j=0;j {//查找下一个被调度的进程 if((tasks[j].come_time<=temp_time)&&(! tasks[j].run_flag)) if(tasks[j].priority>max_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; } 3.功能模块设计 intfcfs()//先来先服务 intsjf()//短作业优先 inthrrn()//响应比高优先 intps()//优先级调度 intpinput()//进程参数输入 intpoutput()//调度结果输出 voidmain()//主函数 七、实验运行结果: 输入测试数据: 如上面两幅组图 功能菜单: 如下 选择1,使用先来先服务调度算法,结果运行如下 选择2,使用短作业优先调度算法,结果运行如下 选择3,使用响应比高优先调度算法,运行结果如下 选择4,使用优先级调度算法,运行结果如下 八、实验心得: 通过此次实验,我能够更加深入的理解各个进程调度算法以及他们的具体实现过程。 在实验过程中,我也遇到了一些困难,但是我通过及时请教同学,查询相关资料,及时解决了问题,但仍有不足之处,我将会在今后学习中更加努力。 附录: 源代码(部分) #include usingnamespacestd; #defineMAX10 structtask_struct {…} voidbubble(floataa[],intcounter)//用来对fcfs采用冒泡排序 {…} intfcfs()//先来先服务 {…} intsjf()//短作业优先 {…} inthrrn()//响应比高优先 {…} intps()//优先级调度 {…} intpinput()//进程参数输入 { inti; printf("******************************************\n"); printf("请输入进程数: \n"); scanf("%d",&counter); for(i=0;i { printf("******************************************\n"); printf("请输入第%d个进程的相关信息: \n",i+1); printf("请输入第一个进程名称: \n"); scanf("%s",tasks[i].name); printf("请输入进程到达时间: \n"); scanf("%f",&tasks[i].come_time); printf("请输入进程所需运行时间: \n"); scanf("%f",&tasks[i].run_time); printf("请输入进程优先级: \n"); scanf("%d",&tasks[i].priority); tasks[i].run_begin_time=0; tasks[i].run_end_time=0; tasks[i].order=0; tasks[i].run_flag=0; } return0; } intpoutput()//调度结果输出 { inti; floatturn_round_time=0,f1,w=0; printf("名称到达时间所需运行时间运行开始时间运行结束时间优先级顺序周转时间\n"); for(i=0;i { f1=tasks[i].run_end_time-tasks[i].come_time; turn_round_time+=f1; w+=(f1/tasks[i].run_time); printf("%s\t%5.3f\t%5.3f\t\t%5.3f\t\t%5.3f\t%d\t%d\t%5.3f\n", tasks[i].name,tasks[i].come_time,tasks[i].run_time,tasks[i].run_begin_time,tasks[i].run_end_time, tasks[i].priority,tasks[i].order,f1); } printf("平均作业周转时间T=%5.2f\n",turn_round_time/counter); printf("平均带权作业周转时间W=%5.2f\n",w/counter); return0; } voidmain() { intoption; pinput(); printf("★★★★★★★★★★功能菜单选择★★★★★★★★★★\n"); printf("★请选择调度算法(0~4): ★\n"); printf("★1.先来先服务★\n"); printf("★2.短作业优先★\n"); printf("★3.响应比高优先★\n"); printf("★4.优先级调度★\n"); printf("★0.退出★\n"); printf("★★★★★★★★★★★★★★★★★★★★★★★★★★\n"); printf("请输入功能选项: "); scanf("%d",&option); switch(option) { case0: printf("\n运行结束。 \n"); break; case1: printf("\n对进程按★先来先服务★调度。 \n\n"); fcfs(); poutput(); break; case2: printf("\n对进程按★短作业优先★调度。 \n\n"); sjf(); poutput(); break; case3: printf("\n对进程按★响应比高优先★调度。 \n\n"); hrrn(); poutput(); break; case4: printf("\n对进程按★优先级★调度。 \n\n"); ps(); poutput(); break; } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 作业 调度