操作系统课程设计报告院系:计算机科学技术班级:计092班姓名:苏庆和学号:18号指导教师:鲁静轩__________2009年7月5日操作系统课程设计任务书一、设计题目:模拟进程管理二、设计目的《操作系统原理》课程设计是软件工程专业实践性环节之一,是学习完《操作系统原理》课程后进行的一次较全面的综合练习。其目的在于加深对操作系统的理论、方法和基础知识的理解,掌握操作系统结构、实现机理和各种典型算法,系统地了解操作系统的设计和实现思路,培养学生的系统设计能力,并了解操作系统的发展动向和趋势。三、设计要求(1)选择课程设计题目中的一个课题,独立完成。(2)良好的沟通和合作能力(3)充分运用前序课所学的软件工程、程序设计等相关知识(4)充分运用调试和排错技术(5)简单测试驱动模块和桩模块的编写(6)查阅相关资料,自学具体课题中涉及到的新知识。(7)课题完成后必须按要求提交课程设计报告,格式规范,内容详实。四、设计内容1.根据设计题目的要求,充分地分析和理解问题,明确问题要求做什么。2.根据实现的功能,划分出合理的模块,明确模块间的关系。3.编程实现所设计的模块。4.程序调试与测试。采用自底向上,分模块进行,即先调试低层函数。能够熟练掌握调试工具的各种功能,设计测试数据确定疑点,通过修改程序来证实它或绕过它。调试正确后,认真整理源程序及其注释,形成格式和风格良好的源程序清单和结果;5.结果分析。程序运行结果包括正确的输入及其输出结果和含有错误的输入及其输出结果。6.编写课程设计报告;设计报告要求:A4纸,详细设计部分主要叙述本人的工作内容设计报告的格式:(1)封面(题目、指导教师、专业、班级、姓名、学号)(2)设计任务书(3)目录(4)需求分析(5)概要设计(6)详细设计(含主要代码)(7)调试分析、测试结果(8)用户使用说明(9)附录或参考资料五、课程设计工作量由于是设计小组团结协作完成设计任务,一般每人的程序量在100行有效程序行左右,不得抄袭。六、课程设计工作计划设计在学期的第15、16周进行,时间安排如下:序号内容时间(天)1预习、讲课12设计33编码、测试54验收1合计10指导教师签章:教研室主任签章:操作系统课程设计指导教师评语与成绩指导教师评语:课程设计表现成绩:课程设计验收成绩:课程设计报告成绩:课程设计总成绩:指导教师签章2009年月日目录一需求分析...............................................................................................6二概要设计...............................................................................................6三详细设计(含主要代码)..................................................................6四调试分析、测试结果........................................................................12五用户使用说明.....................................................................................14六后记.....................................................................................................14七参考资料.............................................................................................14一需求分析在多道处理程序运行环境下,进程数目一般多于处理机数目,使得进程要通过竞争来使用处理机。这就要求系统能按照某种算法,动态地把处理机分配给就绪队列中的一个进程,使之运行,分配处理机的任务是由金城调度程序完成的。一个进程被创建后,系统为了便于对进程进行管理,将系统中的所有进程按照其状态,将其组成不同的进程队列。于是系统中有运行进程队列、就绪队列和各种事件的进程等待队列。进程调度的功能就是从就绪队列中挑选一个进程到处理机上运行。进程调度的算法有多种,常用的有优先级调度算法、先来先服务算法、时间片轮转算法。二概要设计一最高优先级优先调度算法动态优先数是指在进程创建时先确定一个初始优先数,以后在进程运行中随着进程特性的改变不断修改优先数,这样,由于开始优先数很低而得不到CPU的进程,就能因为等待时间的增长而优先数变为最高而得到CPU运行。例如:在进程获得一次CPU后就将其优先数减少3。或者,进程等待的时间超过某一时限时增加其优先数的值,等等。二简单轮转法调度算法所有就绪进程按FCFS排成一个队列,总是把处理机分配给队首的进程,各进程占用CPU的时间片相同。即将CPU的处理时间划分成一个个相同的时间片,就绪队列的诸进程轮流运行一个时间片。当一个时间片结束时,如果运行进程用完它的时间片后还未完成,就强迫运行机制进程让出CPU,就把它送回到就绪队列的末尾,等待下一次调度。同时,进程调度又去选择就绪队列中的队首进程,分配给它一时间片,以投入运行。直至所有的进程运行完毕。三短作业优先调度算法所有就绪进程按所需时间由少到多排成一个队列,依次运行队列中的进程,并列表显示出来,每个进程的开始运行时间减去进入内存时间就是该进程的等待时间,每个进程的结束运行时间减去进入内存时间就是该进程的周转时间,每个进程的周转时间除于服务时间就是带权周转时间。三详细设计一.优先权调度算法:1、用户可以自行输入进程的数量,每一个进程由进程控制块(PCB)表示,各种队列均采用链表数据结构。2、进程控制块包含如下信息:进程号、cpu时间、所需要时间、优先数、状态等等。3、在每次运行程序时都要输入“进程数量”、“进程名称及占用时间”。4、按照优先数的高低进行排列5、处理机调度队首元素运行。采用动态优先数办法,进程每运行一次优先数减“3”,同时将已运行时间加“1”。6、进程运行一次后,若要求运行时间不等于已运行时间,则再将它加入就绪队列;否则将其状态置为“F”,且退出就绪队列。7、“R”状态的进程队列不为空,则重复上面步骤,直到所有进程都成为“F”状态。流程图:图.最高优先级优先调度算法流程图主要代码:voidpriority(charalgo){PCBq;prt1(algo);for(inti=0;i=Num;i++){q=pq.top();pq.pop();if(q.state!=3)开始初始化PCB,输入各进程信息按优先级加入就绪队列就绪队列空结束就绪队列中首进程运行标为Cpu时间+1,进入下一个进程进程运行时间满足所需时间进程运行完成。进程优先数减3,插入就绪队列中。NYNq.state=1;prt2(algo,q);if(q.state!=3)q.state=2;q.cputime++;if(q.needtime0)q.needtime--;if(q.needtime==0)q.state=3;if(q.state!=3)q.prio-=3;pp.push(q);while(!pq.empty()){q=pq.top();pq.pop();if(q.needtime==0)q.state=3;prt2(algo,q);prt1(algo);pp.push(q);}pq=pp;pp=pqempty;}printf(**************************************************************************\n);printf(输出结束\n);getchar();}二.时间片轮转算法:1、用户可以自行输入进程的数量,每一个进程由进程控制块(PCB)表示,各种队列均采用链表数据结构。2、按照进程输入的先后顺序排成一个队列。再设一个队首指针指向第一个到达进程的首址。3、执行处理机调度时,开始选择队首的第一个进程运行。另外,再设一个当前运行进程的指针,指向当前正在运行的进程。4、考虑到代码的可重用性,轮转法调度程序和最高优先级优先调度是调用同一个模快进行输出5、在规定的时间片内进程是根据先来先服务的方式配列的,每个进程只运行时间片大小的时间然后转到下一个进程运行。直到所有进程运行完为止。流程图图.简单轮转法调度算法流程图主要代码:voidRoundrun(inttimeSlice){while(run!=NULL){run-cputime=run-cputime+timeSlice;run-needtime=run-needtime-timeSlice;run-round+=timeSlice;run-count++;if(run-needtime=0){run-needtime=0;run-next=finish;初始化PCB、输入进程信息和时间片大小开始进程按输入顺序插入到队列中就绪队列空结束就绪队列首进程运行运行进程占用cup时间到达所需时间进程完成把运行进程插入到队尾NYNfinish=run;if(run!=tail){tail-next=ready;}else{ready=NULL;}run-state='F';run=NULL;if(ready!=NULL){firstin();}}else{if(ready!=NULL){run-state='W';tail=run;run=ready;//就绪队列的头指针赋值给运行run-state='R';//进程状态变为等待状态ready=ready-next;//就绪队列头指针移到下一个进程}}prt('r');}}三.短作业优先调度算法1,用户可以自行输入进程的数量,每一个进程由进程控制块(PCB)表示,各种队列均采用链表数据结构。2,按照进程服务时间由少到多顺序排成一个队列。再按顺序依次执行。主要代码:voidshort_timefirst(charalgo){PCq;intt;prt3();for(intj=0;jN;j++){p[j].state='R';for(inti=0;iN;i++){if(p1[i].state=='W')p1[i].waittime=Tim;if(strcmp(p[j].name,p1[i].name)==0){p1[i].state='R';prit(i);p1[i].state='F';p1[i].cputime=p1[i].needtime;p1[i].needtime=0;}else{prit(i);}}p[j].state='F';p[j].cputime=p[j].needtime;p[j].needtime=0;p[j].waittime=Tim;Tim+=p[j].cputime;printf(**************************************************************************\n);}for(inti=0;iN;i++)prit(i);printf(**************************************************************************\n);printf(输出结束\n);getchar();}四调试分析、测试结果一.进入系统显示欢迎界面二.如果选择P进行优先数算法则提示输入进程数:三.输入进程号和运行时间:四.输出优先数算法信息:五.可以继续选择R进行时间片轮转算法,并输入时间片大小:六.输出时间片轮转算法信息:七.如果输入错误则结束程序:五用户使用说明本系统为模拟