经典调度算法实践课题:姓名:学号:指导老师:学院:课程设计实践时间2014.3.11~2014.3.22目录1.设计目的----------------------------------------32.设计内容----------------------------------------33.设计要求----------------------------------------34.程序流程图--------------------------------------45.设计摘要----------------------------------------76.源程序------------------------------------------87.运行结果---------------------------------------16一课程设计的目的:操作系统课程设计是计算机专业重要的教学环节,它为学生提供了一个既动手又动脑,将课本上的理论知识和实际有机的结合起来,独立分析和解决实际问题的机会。
1.进一步巩固和复习操作系统的基础知识2.培养学生结构化程序、模块化程序设计的方法和能力。
3.提高学生调试程序的技巧和软件设计的能力。
4.提高学生分析问题、解决问题以及综合利用C语言进行程序设计的能力。
二设计内容:实现以下几种调度算法1.FCFS2.SJF3.高响应比优先调度算法。
三.设计要求:1.不同的功能使用不同的函数实现(模块化),对每个函数的功能和调用接口要注释清楚。
对程序其它部分也进行必要的注释。
2.对系统进行功能模块分析、画出总流程图和各模块流程图。
3.用户界面要求使用方便、简洁明了、美观大方、格式统一。
所有功能可以反复使用,最好使用菜单。
4.通过命令行相应选项能直接进入某个相应菜单选项的功能模块。
5. 所有程序需调试通过。
四、设计结束需提交下列资料:1、课程设计报告。
报告中至少应包括:相关操作系统的知识介绍,程序总的功能说明、程序各模块的功能说明、程序设计的流程图源程序清单。
2、源程序和编译连接后的可执行程序文件。
五、进程调度模拟程序流程图主函数流程图1-1先来先服务算法调度1-2短作业优先调度1-3高响应比优先调度1-4六、设计摘要及背景利用高级语言,实现经典进程调度算法,有先来先服务、短作业优先、响应比高优先,进一步理解了进程调度各种算法的概念及含义。
在OS中,调度的实质是一种资源分配,调度算法即指:根据系统的资源分配策略所规定的资源分配算法。
对于不同的系统和系统目标,通常采用不同的调度算法,如在批处理系统中,为照顾为数众多的短作业,采用短作业有限调度算法;采用算法时,则要考虑多方面因素,以便达到最佳效果。
七、源程序代码#include<iostream>#include<string>using namespace std;#define MAX 8struct task_struct{char name[10]; /*进程名称*/float come_time; /*到达时间*/float run_begin_time; /*开始运行时间*/float run_time; /*运行时间*/float run_end_time; /*运行结束时间*/int order; /*运行次序*/int run_flag; /*调度标志*/}tasks[MAX],a[MAX];int counter; /*实际进程个数*/ int fcfs(); /*先来先服务*/ int sjf(); /*短作业优先*/int hrrn(); /*高响应比优先*/int pinput(); /*进程参数输入*/int poutput();void main(){system("color 6a");int option;pinput();while(1){printf("请选择调度算法(0~3):\n");printf("1.先来先服务\n");printf("2.短作业优先\n");printf("3. 高响应比优先\n");printf("0.退出\n");scanf("%d",&option);switch (option){case 0://save();printf("运行结束。
\n");exit(0);break;case 1:printf("对进程按先来先服务调度。
\n\n");fcfs();poutput();break;case 2:printf("对进程按短作业优先调度。
\n\n");sjf();poutput();break;case 3:printf("对进程按高响应比优先调度。
\n\n");hrrn();poutput();break;}}}void turn(){for(int i=0;i<counter;i++){strcpy(tasks[i].name,a[i].name);tasks[i].come_time=a[i].come_time;tasks[i].run_time =a[i].run_time ;tasks[i].run_begin_time=0;tasks[i].run_end_time=0;tasks[i].order=0;tasks[i].run_flag=0;}}int fcfs() /*先来先服务*/{turn();float time_temp=0;int i;time_temp=tasks[0].come_time;for(i=0;i<counter;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;tasks[i].order=i+1;}return 0;}int sjf() /*短作业优先*/{turn();float temp_time=0;int i=0,j;int temp_counter;float run_time;run_time=tasks[i].run_time;j=1;while ((j<counter)&&(tasks[i].come_time==tasks[j].come_time))/**/ {if (tasks[j].run_time<tasks[i].run_time){run_time=tasks[j].run_time;i=j;}j++;} /*查找第一个被调度的进程*//*对第一个被调度的进程求相应的参数*/tasks[i].run_begin_time=tasks[i].come_time;tasks[i].run_end_time=tasks[i].run_begin_time+tasks[i].run_time;tasks[i].run_flag=1;temp_time=tasks[i].run_end_time;tasks[i].order=1;temp_counter=1;while (temp_counter<counter){for(j=0;j<counter;j++){if((tasks[j].come_time<=temp_time)&&(!tasks[j].run_flag)){run_time=tasks[j].run_time;i=j;break;}}for(j=0;j<counter;j++){if((tasks[j].come_time<=temp_time)&&(!tasks[j].run_flag))//两个条件必须同时成立if(tasks[j].run_time<run_time){run_time=tasks[j].run_time;i=j;}}/*查找下一个被调度的进程*//*对找到的下一个被调度的进程求相应的参数*/tasks[i].run_begin_time=temp_time;tasks[i].run_end_time=tasks[i].run_begin_time+tasks[i].run_time;tasks[i].run_flag=1;temp_time=tasks[i].run_end_time;temp_counter++;tasks[i].order=temp_counter;}return 0;}int hrrn() /*高响应比优先*/{ turn();int j,i,temp_counter;float temp_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<counter){max_respond_rate=0;for(j=1;j<counter;j++){if((tasks[j].come_time<=temp_time)&&(!tasks[j].run_flag))//注意temp_time和tasks[i]都在变化{respond_rate=(temp_time-tasks[j].come_time)/tasks[j].run_time;//等待时间/运行时间if (respond_rate>max_respond_rate){max_respond_rate=respond_rate;i=j;}}}/*找响应比高的进程*/tasks[i].run_begin_time=temp_time;//把第一个进程的结束时间赋值于下一个进程的开始时间,前提是必须满足上面条件tasks[i].run_end_time=tasks[i].run_begin_time+tasks[i].run_time;temp_time=tasks[i].run_end_time;//改换到进程的结束时间,比较下一轮的(等待时间/运行时间)tasks[i].run_flag=1;temp_counter+=1;tasks[i].order=temp_counter;}return 0;}int pinput() /*进程参数输入*/{int i;printf("请输入实际进程的个数:\n");scanf("%d",&counter);for(i=0;i<counter;i++){ printf("******************************************\n");printf("请输入第%d个进程:\n",i+1);printf("请输入该进程名字:\n");scanf("%s",tasks[i].name);printf("请输入该进程到达时间come_time:\n");scanf("%f",&tasks[i].come_time);printf("请输入该进程运行时间run_time:\n");scanf("%f",&tasks[i].run_time);tasks[i].run_begin_time=0;tasks[i].run_end_time=0;tasks[i].order=0;tasks[i].run_flag=0;}for(i=0;i<counter;i++){strcpy(a[i].name,tasks[i].name);a[i].come_time=tasks[i].come_time;a[i].run_time =tasks[i].run_time ;a[i].run_begin_time=0;a[i].run_end_time=0;a[i].order=0;a[i].run_flag=0;}return 0;}int poutput() /*调度结果输出*/{int i;float turn_round_time=0,f1,w=0;printf("name come_time run_time run_begin_time run_end_time order turn_round_time\n");for(i=0;i<counter;i++){f1=tasks[i].run_end_time-tasks[i].come_time;turn_round_time+=f1;w+=(f1/tasks[i].run_time);printf(" %s, %5.3f, %5.3f, %5.3f, %5.3f, %d, %5.3f\n",tasks[i].name,tasks[i].come_ti me,tasks[i].run_time,tasks[i].run_begin_time,tasks[i].run_end_time,tasks[i].order,f1);}printf("average_turn_round_timer=%5.2f\n",turn_round_time/counter);printf("weight_average_turn_round_timer=%5.2f\n",w/counter);return 0;}八、程序运行结果输入进程界面1-1算法选择界面1-2FCFS结果输出结果1-3SJF和高响应比优先界面1-4退出界面1-5九、课程设计总结心得体会通过此次课程设计,更深入的理解了先来先服务调度算法、短作业优先调度算法、高响应比优先调度算法,及实现过程。