学号:课程设计课程名字系统软件开发实训A题目进程调度模拟设计——先来先服务、优先级法学院计算机科学与技术学院专业计算机科学与技术专业班级姓名指导教师李玉强2014年01月13日武汉理工大学《系统软件开发实训A》课程设计说明书1课程设计任务书学生姓名:专业班级:指导教师:李玉强工作单位:计算机科学与技术学院题目:进程调度模拟设计——先来先服务、优先级法初始条件:1.预备内容:阅读操作系统的处理机管理章节内容,对进程调度的功能以及进程调度算法有深入的理解。2.实践准备:掌握一种计算机高级语言的使用。要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1.模拟进程调度,能够处理以下的情形:⑴能够选择不同的调度算法(要求中给出的调度算法);⑵能够输入进程的基本信息,如进程名、优先级、到达时间和运行时间等;⑶根据选择的调度算法显示进程调度队列;⑷根据选择的调度算法计算平均周转时间和平均带权周转时间。2.设计报告内容应说明:⑴课程设计目的与功能;⑵需求分析,数据结构或模块说明(功能与框图);⑶源程序的主要部分;⑷测试用例,运行结果与运行情况分析;⑸自我评价与总结。时间安排:设计安排3周:查阅、分析资料1天系统软件的分析与建模4天系统软件的设计5天系统软件的实现3天撰写文档1天课程设计验收答辩1天设计验收安排:设计周的第三周的指定时间到实验室进行上机验收。设计报告书收取时间:课程设计验收答辩完结时。(注意事项:严禁抄袭,一旦发现,抄与被抄的一律按0分记)指导教师签名:2013年12月10日系主任(或责任教师)签名:2013年12月10日武汉理工大学《系统软件开发实训A》课程设计说明书2课程设计报告书1.需求分析1.1设计目的(1)阅读操作系统的处理机管理章节内容,对进程调度的功能以及进程调度算法有深入的理解。(2)掌握一种计算机高级语言的使用。要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1.2程序流程图1.3设计要求(1)能够选择不同的调度算法(要求中给出的调度算法);开始选择调度算法先来先服务法输入进程队列信息优先级法结束?Y/N结束YN切换算法武汉理工大学《系统软件开发实训A》课程设计说明书3(2)能够输入进程的基本信息,如进程名、优先级、到达时间和运行时间等;(3)根据选择的调度算法显示进程调度队列;(4)根据选择的调度算法计算平均周转时间和平均带权周转时间。2.功能设计2.1数据结构1.进程的结构定义:structprocess{charname[10];//进程名intno;//进程序号doublearrivetime;//进程达到时间doubleneedtime;//进程运行时间doublestarttime;//进程开始时间doubleendtime;//进程结束时间intstate;//进程状态,0表示未执行,1表示已执行intpriority;//进程优先级process*next;process*head=Null;intcount;};2.使用链表存储进程并按照到达时间排序武汉理工大学《系统软件开发实训A》课程设计说明书4、voidinsert(process*current){if(head!=Null){if(head-next==Null)//如果只有一个节点{if(current-arrivetimehead-arrivetime)//如果比链头到达时间早,则插入链头{current-next=head;head=current;开始链表空?只有一节点比较当前节点的到达时间与连续两个节点(p1,p1-next)的到达时间至少两个节点结束YN插到链头比较当前节点与已存在节点的到达时间在两节点之间?插入它们之间插入p1=p1-next武汉理工大学《系统软件开发实训A》课程设计说明书5}else{current-next=Null;head-next=current;}}else//如果至少两个节点{process*p1=head;if(head-arrivetimecurrent-arrivetime){current-next=head;head=current;}else{intflag=1;while(p1-next!=Null)//当head后面不为空时一直做{//如果在两个节点间if(p1-arrivetimecurrent-arrivetime&&p1-next-arrivetimecurrent-arrivetime){current-next=p1-next;p1-next=current;flag=0;break;}elsep1=p1-next;}//如果到达时间最大,则插到链尾if(flag=1){p1-next=current;current-next=Null;}}}}elsehead=current;}2.2先来先服务算法设计武汉理工大学《系统软件开发实训A》课程设计说明书61.FCFS算法说明将用户作业和就绪进程按提交顺序或变为就绪状态的先后排成队列,并按照先来先服务的方式进行调度处理,是一种最普遍和最简单的方法。在该算法中,每个作业或进程按照它们在队列中等待时间长短来决定它们是否优先享受服务。在没有特殊理由要优先调度某类作业或进程时,从处理的角度来看,FCFS方式是一种最合适的方法,因为无论是追加还是取出一个队列元素在操作上都是最简单的。2.创建进程voidcreateFCFS(){process*q1=newprocess;cout请输入进程总数目;cincount;coutendl;intnumber=1;while(number=count){q1=newprocess;q1-no=number;cout进程序号numberendl;cout进程名称;cinq1-name;cout进程到达时间;cinq1-arrivetime;cout进程运行时间;cinq1-needtime;q1-next=NULL;insert(q1);number++;coutendlendl;武汉理工大学《系统软件开发实训A》课程设计说明书7}}3.进程调度及输出结果voidprintFCFS(){开始链表空?Head节点:开始时间=到达时间结束时间=开始时间+执行时间系统时间=结束时间并计算周转时间和带权周转时间P=head-nextP=null结束YN前一个结束,后一个进程是否到达p节点:开始时间=到达时间结束时间=开始时间+执行时间系统时间=结束时间并计算周转时间和带权周转时间P=head-nextNp节点:开始时间=系统时间结束时间=开始时间+执行时间系统时间=结束时间并计算周转时间和带权周转时间P=head-nextY武汉理工大学《系统软件开发实训A》课程设计说明书8process*p=newprocess;doublesystime=0;//记录系统时间doubleturn=0;//平均周转时间doubleturnw=0;//平均带权周转时间if(head==NULL)cout没有进程调度endl;//处理第一个elseif(head!=NULL){head-starttime=head-arriveTime;head-endtime=head-arrivetime+head-needtime;systime=head-endtime;turn=turn+(head-endtime-head-arrivetime);turnw=turnw+(head-endtime-head-arrivetime)/head-needtime;p=head-next;while(p!=NULL){if(p-arrivetimesystime)//如果前一个结束后一个还没到达{p-starttime=p-arrivetime;p-endtime=p-starttime+p-needtime;systime=p-endTime;turn=turn+(p-endtime-p-arrivetime);turnw=turnw+(p-endtime-p-arrivetime)/p-needtime;p=p-next;}else//如果前一个未结束时后一个已经到达武汉理工大学《系统软件开发实训A》课程设计说明书9{p-starttime=systime;p-endtime=p-starttime+p-needtime;systime=p-endtime;turn=turn+(p-endtime-p-arrivetime);turnw=turnw+(p-endtime-p-arrivetime)/p-needtime;p=p-next;}}}cout.setf(ios::left);//设置对齐方式为leftcoutsetw(10)进程序号setw(10)进程名setw(10)到达时间setw(10)开始时间setw(10)执行时间setw(10)结束时间endl;process*temp=head;while(temp!=NULL){cout.setf(ios::left);coutsetw(10)temp-nosetw(10)temp-namesetw(10)temp-arriveTimesetw(10)temp-startTimesetw(10)temp-needTimesetw(10)temp-endTimeendl;temp=temp-next;}cout平均周转时间turn/countendl平均带权周转时间turnw/countendl;//清空链表while(head-next!=NULL)//回收空间{process*t=newprocess;t=head-next;武汉理工大学《系统软件开发实训A》课程设计说明书10head-next=t-next;deletet;}head=NULL;}2.3优先级算法的设计1.PIRO算法及说明优先级法可被用作作业或进程的调度策略。首先,系统或用户按某种原则为作业或进程指定一个优先级来表示该作业或进程所享有的调度优先权。该算法的核心是确定进程或作业的优先级。确定优先级的方法可分为两类。即动态法和静态法静态法根据作业或进程的静态特性,在作业或进程开始执行之前就确定它们的优先级,一旦开始执行之后就不能改变。动态法则不然,它把作业或进程的静态特性和动态特性结合起来确定作业或进程的优先级,随着作业或进程的执行过程,其优先级不断变化。静态优先级中,可以由用户自己根据作业的紧急程度输入一个适当的优先级,为防止各用户都将自己的作业冠以高优先级,系统应对高优先级用户收取较高的费用;也可以由系统或操作员根据作业类型指定优先级。动态优先级中,基于静态优先级的调度算法实现简单,系统开销小,但由于静态优先级一旦确定之后,直到执行结束为止始终保持不变,从而系统效率较低,调度性能不高。现在的操作系统中,如果使用优先级调度的话,则大多采用动态优先级的调度策略。2.创建进程voidcreatePRIO(){process*q1=newprocess;cout请输入进程总数目;cincount;coutendl;intnumber=1;while(number=count)武汉理工大学《系统软件开发实训A》课程设计说明书11{q1=newprocess;q1-no=number;cout进程序号numberendl;cout进程名称;cinq1-name;cout优先级;cinq1-priority;cout进程到