2022年操作系统学习课程设计方案之进程调度 .docx
精选学习资料 - - - - - - - - - 目录 一 成果评定表 二 任务书 三计目的意义、设计内容 四计方案(软硬件环境,开发工具或语言挑选及思路)五程序功能模块设计(程序功能模块划分及层次等)六程序总控流程图 七数据结构设计 八程序代码结构(函数调用关系或类层次关系)九程序主要代码解读 十测试数据及测试结果 十一设计过程中遇到的问题及解决方法 十二结论(系统实现情形、系统特点、设计体会及收成 等)十三 . 目前资料收集情形(含指定参考资料)名师归纳总结 - - - - - - -第 1 页,共 17 页精选学习资料 - - - - - - - - - 二任务书:课程设计题目模拟进程调度功能的设计与实现年2006 级学院运算机学院专运算机科学与技术专业业级已知参数和设计要求:运用课堂学习的操作系统理论学问,参考操作系统课程里叙述的文件系统有关算 法,用 C、 C+或 JAVA 语言编程,模拟实现一般操作系统的进程调度功能;本课程设计 目的如下: 1 编程实现模拟操作系统进程调度子系统的基本功能;懂得进程调度的概 念,通过课程设计深化明白进程掌握块的功能、进程的创建、删除以及进程各个状态间的转换过程;实现先来先服务、时间片轮转、多级反馈轮转法对 进程进行的调度过程;通过观看有关的队列结构的内容的动态变化过程深化 体会各个调度算法的特点;从而能够更好的巩固从书本上学到的学问;2 编程过程中需要建立队列等结构进行各种操作,通过该次试验,可以督促 同学从有用的角度对数据结构课程内容进行更深化懂得和更娴熟的应用;3 试验编程语言要求使用java 语言或 C+语言;通过对调度功能的编程实现,不但能有效训练同学对编程语言的娴熟使用,仍能促进同学独立摸索解决问题、以及独立查新猎取学问的才能;操作系统课程设计报告要求:按要求格式和纸张写出设计报告,报告正文 内容如下:1、 设计目的意义、设计内容 2、 设计方案(软硬件环境,开发工具或语言挑选及思路等)3、程序功能模块设计(程序功能模块划分及层次等)4、程序总控流程图 4、数据结构设计 6、程序代码结构(函数调用关系或类层次关系)7、程序主要代码解读 8、测试数据及测试结果 9、设计过程中遇到的问题及解决方法 10、结论(系统实现情形、系统特点、设计体会及收成等;)报告字数要求:3000评分标准名师归纳总结 (1)设计报告情形;(2)、运行演示情形;(5)、协作协作情形第 2 页,共 17 页(3)老师质疑回答情形;( 4)、算法难易程度;- - - - - - -精选学习资料 - - - - - - - - - 同学应完成的工作:实现进程调度子系统如下功能模块:1)实现进程相关数据结构(如进程掌握块task_struct )的创建和查看功能;2)实现多种进程调度算法:先来先服务算法、优先级调度算法、时间片轮转法、多 级反馈轮转法等;3)实现对执行进程的堵塞,对等待进程的唤醒等功能;4)实现相关队列在进程调度中的动态变化过程;分组要求: 可按班级自由组合小组成员,一组 2-3 人组成;留意:期望同组同学分工明确,团结协作;责部分) ;小组成员及分工情形:由同学填写每位同学需交课程设计报告(主要写自己负目前资料收集情形(含指定参考资料):著作: 1 张尧学 , 史美林 . 运算机操作系统教程第2 版. 清华高校出版社2000 年著作: 2 张尧学 . 运算机操作系统教程第2 版 习题与试验指导.2000 年课程设计的工作方案:课程设计的时间为一周,上机时间共20 学时;工作方案如下:星期一:预备工作,懂得、分析设计要求;总体方案设计,确定组内分工;星期二:程序模块结构设计,模块层次调用关系、模块之间接口商定;星期三:程序设计、模块测试;星期四:程序设计、模块集成;总体测试;写课程设计报告;星期五:完善程序和报告;向老师提交课程设计报告和程序;任务下达日期 2022 年 6 月 20 日完成日期 2022 年 6 月 26 日指导老师(签名)同学(签名)三设计目的意义、设计内容名师归纳总结 - - - - - - -第 3 页,共 17 页精选学习资料 - - - - - - - - - 1编程实现模拟操作系统进程调度子系统的基本功能;懂得进程调度的概念,通过课程设计深化明白进程掌握块的功能、进程的创建、删除以及进程各个状态间的转换过程;实现先来先服务、时间片轮转、多级反馈轮转法对进程进行的调度过程;通过观看有关的队列结构的内容的动态变化过程深化体会各个调度算法的特点;从而能够更好的巩固从书本上学到的学问;2编程过程中需要建立队列等结构进行各种操作,通过该次试验,可以督促同学从有用的角度对数据结构课程内容进行更深化懂得和更娴熟的应用;3试验编程语言要求使用java 语言或 C+语言;通过对调度功能的编程实现,不但能有效训练同学对编程语言的娴熟使用,仍能促进同学独立摸索解决问题、以及独立查新猎取学问的才能;四设计方案(软硬件环境,开发工具或语言挑选及思路等)<1>设计环境平台 : 该软件在 Windows XP,JDK1.6 <2>开发工具 :eclipse+designer <3>设计思路:1、 进程概念:进程是被独立安排资源的最小单位;进程是动态概念,必需程序运行 才有进程的产生;2、 进程的状态模型:(1)运行:进程已获得处理机,当前处于运行状态;(2)就绪:进程已经预备好,一旦有处理器就可运行;(3)堵塞:进程由于发生某大事而暂停执行,亦即进程的执行受到堵塞;3、处理机调度:在多道程序设计系统中,内存中有多道程序运行,他们相互争夺处理 机这一重要的资源;处理机调度就是从就绪队列中,依据肯定的算法挑选一个进 程并将处理机安排给它运行,以实现进程并发地执行;4、 进程调度算法的功能 记录系统中全部进程的执行情形 挑选占有处理机的进程 进行进程的上下文切换 5、进程调度的算法:(1)先来先服务算法:最先进入等待队列的进程先执行,进程终止后执行下一个 进程;这是最简洁的处理机调度算法,其基本思想是依据进程进入就绪队列 的先后次序调度并安排处理机执行;先来先服务调度算法是一种不行抢占的 算法,先进入就绪队列的进程,先费培处理机运行;一旦一个进程占有了处 理机,它就始终运行下去,知道该进程完成工作或者由于等待某大事而不能 连续运行时才释放处理机(2)优先数算法:即进程的执行次序由高优先级到低优先级;系统或用户按某种 原就为进程指定一个优先级来表示该进程所享有的确调度优先权;该算法核 心是确定进程的优先级;名师归纳总结 - - - - - - -第 4 页,共 17 页精选学习资料 - - - - - - - - - (3)时间片轮转算法:固定时间片,每个进程在执行一个时间片后,轮到下一进 程执行,知道全部的进程执行完毕;处理器同一个时间只能处理一个任务;处理器在处理多任务的时候,就要看恳求的时间次序,假如时间一样,就要 进行猜测;挑到一个任务后,需要如干步骤才能做完,这些步骤中有些需要 处理器参加,有些不需要(如磁盘掌握器的储备过程);不需要处理器处理 的时候,这部分时间就要安排给其他的进程;原先的进程就要处于等待的时 间段上;经过周密安排时间,宏观上就象是多个任务一起运行一样,但微观 上是有先后的,就是时间片轮换; 4 多级反馈轮转法: 把系统中的全部进程分成如干个具有不同优先级别的组,同一组的进程都具有与所在组同样的优先级别,并且把每组进程组织成一个先 进先出的队列;在设计时,按优先级别越高的组中的进程应得时间片越短的 原就安排时间片;在调度时,调度器每次都从优先级别高的就绪队列中队首 挑选就绪进程;当在高优先级别的队列中找不到就绪进程时,才到低优先级 别的就绪进程队列中选取;注:优先数算法时间片轮转法名师归纳总结 - - - - - - -第 5 页,共 17 页精选学习资料 - - - - - - - - - 多级反馈队列调度法五程序功能模块设计1模拟进程调度算法模块界面模块先来进程调度模块多级大事模块优先时间反馈先服数算片轮队列务算法模转算调度法模块法模法模块块块六程序总控流程图名师归纳总结 - - - - - - -第 6 页,共 17 页精选学习资料 - - - - - - - - - 开头创 建 进 程 及 属 性挑选算法先 来 先 服优先数算时 闾 片 轮 转多 级 反 馈 队务算法法法列调度法显 示 进 程 执行状态终止七数据结构设计名师归纳总结 - - - - - - -第 7 页,共 17 页精选学习资料 - - - - - - - - - 本组在实现进程调度算法时采纳了一个有特色的模拟方式线程模拟进程;数据结构设计如下:创建 JAVA中的 thread 对象,并将创建好的各个对象放入数据容器 Vector () 中,各个调度算法对个进程的排序,其实就是对 vector 中的 thread 对象排序,打算其执行次序;八程序代码结构(函数调用关系或类层次关系)开头执行 :public class MainThread >弹出程序运行窗口 >挑选进程调度算法 comboBox.getSelectedItem="Pri;comboBox.getSelectedItem = "T_Slice";comboBox.getSelectedItem = "M_FB_Slice" >创建进程:从窗体控件猎取相应参数创建进程 list_1, list_2, textField_3.run >对进程进行掌握:堵塞(第一判定有无进程在执行:new RefreshListlist_3, JOptionPane.showMessageDialognull, " 已经无进程处于运行状态,请创建进程! " ,如有,就终止执,行将执行进程从就绪队列名师归纳总结 - - - - - - -第 8 页,共 17 页精选学习资料 - - - - - - - - - 调入等待队列 : v1 .addElementv2 .get0;v11 .addElement v0 .get0;v2 .remove0;v0 .remove0;list_2 .setListData v11 ;list_1 .setListData v0 ;);唤醒:将等待队列中的进程重新调入就绪队列的对尾九程序主要代码解读publicvoid run "M_FB_Slice" if MainForm.algorithm.equals"T_Slice"/ System.out.println"T_Slice";.equalsexecute_T_Slice;refresh; elseif MainForm.algorithm/System.out.println"M_FB_Slice";executeM_T_Slice;refresh; else execute;refresh; publicvoid refresh / 刷新列表,并且执行下一个进程 名师归纳总结 MainForm.list_1.setListDataMainForm.v0 ;第 9 页,共 17 页if MainForm.v0 .size > 0 MainForm.textField_3.setTextString MainForm.v0 .get0; elseMainForm.textField_3.setText" 无进程 " ;if k < MainForm.n - - - - - - -精选学习资料 - - - - - - - - - ShowInfo show = new ShowInfo; / show.setVisibletrue ;Thread t = new Threadshowt.start;进程执行过程 publicvoid execute /FCFS和优先级调度算法;int maximum = progressBar.getMaximum;progress = CrtProcess MainForm.v2 .get0.getProgress;/ System.out.printlnprogress+"sfsdf"+MainForm.v2.sizelabel_3.setTextCrtProcessMainForm.v2 .get0.getProcessNamelabel_4.setTextCrtProcessMainForm.v2 .get0.getUserNameint i = progress;while i < maximum try / int value = progressBar.getValue;int value = progress;source = MainForm.resource;if MainForm.resource = true progress = value + 1;progressBar.setValueprogress ;CrtProcess process = CrtProcessMainForm.v2 .get0;process.setProgressprogress ;MainForm.v2 .remove0;MainForm.v2 .add0, process;Thread.sleep DELAY ;i+ ;prog + ; else false ;this.setVisibleMainForm.resource = truebreak; catch InterruptedException ignoredException 名师归纳总结 if source = true ;第 10 页,共 17 页/ MainForm.v1.addElementMainForm.v2.get0MainForm.v2 .remove0;MainForm.v0 .remove0;k + ; / 记录已经执行终止的进程this.setVisiblefalse ;/ CrtProcess process=CrtProcess MainForm.v2.get0- - - - - - -精选学习资料 - - - - - - - - - / process.setFinishedtrue;/ MainForm.v2.remove0;/ MainForm.v2.add0,process else k + ; source = true; publicvoid execute_T_Slice /时间片轮转算法;int maximum = progressBar.getMaximum;/ int init=CrtProcessMainForm.v2.getk.getProgress;/ System.out.printlnk;int i = 0;progress = CrtProcess MainForm.v2 .get0.getProgresslabel_3.setTextCrtProcessMainForm.v2 .get0.getProcessNamelabel_4.setTextCrtProcess MainForm.v2 .get0.getUserNameint time = CrtProcess MainForm.v2 .get0.getTime_Slicedouble percent = 1.0;if time > MainForm.cpuTime_Slice percent = MainForm.cpuTime_Slice / time;/ 进度条的比例 while progress < maximum && i <percent*maximum progress ;try int value = progressBar.getValue;source = MainForm.resource;if MainForm.resource = true progress = value + 1;progressBar.setValueprogress ;CrtProcessMainForm.v2 .get0.setProgressThread.sleep DELAY * time;i+ ; else false ;MainForm.resource = true;this.setVisiblebreak; catch InterruptedException ignoredException 名师归纳总结 if source = true && percent = 1.0 ;第 11 页,共 17 页/ MainForm.v1.addElementMainForm.v2.get0MainForm.v2 .remove0;- - - - - - -精选学习资料 - - - - - - - - - MainForm.v0 .remove0;k + ; / 记录已经执行终止的进程this .setVisible false ; if source = true && percent .= 1.0 v2 .get0; ;CrtProcess process = CrtProcess MainForm.process.setTime_Slicetime - int MainForm.cpuTime_SliceMainForm.v2 .remove0;MainForm.v0 .remove0;MainForm.v2 .addElementprocess;MainForm.v0 .addElementprocess.getProcessNamek + ;MainForm.n + ;false ;this.setVisible if source = false k + ;source = true; publicvoid executeM_T_Slice ;for int i = 0; i < MainForm.vector_Num; i+ sizei = MainForm.vQueue i.size;int maximum = progressBar.getMaximum;/ int init=CrtProcessMainForm.v2.getk.getProgress;/ System.out.printlnk;int i = 0;progress = CrtProcess MainForm.v2 .get0.getProgresslabel_3.setTextCrtProcessMainForm.v2 .get0.getProcessNamelabel_4.setTextCrtProcess MainForm.v2 .get0.getUserNameint time = CrtProcess MainForm.v2 .get0.getTime_Slicedouble percent = 1.0;if time > MainForm.cpuTime_Slice percent = MainForm.cpuTime_Slice/time; / 进度条的比例 名师归纳总结 while progress < maximum && i <percent*maximum progress ;第 12 页,共 17 页try int value = progressBar.getValue;source = MainForm.resource;if MainForm.resource = true progress = value + 1;progressBar.setValueprogress ;CrtProcessMainForm.v2 .get0.setProgress- - - - - - -精选学习资料 - - - - - - - - - Thread.sleep DELAY * time;i+ ; else false ;this.setVisibleMainForm.resource = truebreak; catch InterruptedException ignoredException if source = true && percent = 1.0 MainForm. v2 .remove0;MainForm. v0 .remove0;k + ; / 记录已经执行终止的进程this .setVisible false ; if source = true && percent .= 1.0 if k < n - 1 CrtProcess process = CrtProcess MainForm. v2 .get0;process.setTime_Slicetime - int MainForm. cpuTime_Slice ;MainForm. v2 .remove0;MainForm. v0 .remove0;for i = 0; i < MainForm. vector_Num; i+ sum1 += size i;/ System.out.println"sum1:"+sum1;if k <= sum1 sum2 = sum1 + size i + 1;MainForm. v2 .add sum2 - k , process;MainForm. v0 .add sum2 - k , process.getProcessName;break; k + ;MainForm.n + ;false ;this.setVisible / if k = n - MainForm.vQueueMainForm.vector_Num - 1.size - 1&&MainForm.vQueueMainForm.vector_Num-1.size.=1 名师归纳总结 / ;CrtProcess process1 = CrtProcess 第 13 页,共 17 页MainForm.v2.get0process1.setTime_Slicetime - int / MainForm.cpuTime_Slice;MainForm.v2.remove0;/ / MainForm.v0.remove0;- - - - - - -精选学习资料 - - - - - - - - - / MainForm.v2.addElementprocess1;/ /System.out.printlnCrtProcess MainForm.v2.get0.getProcessName;/ / MainForm.v0.addElementprocess1.getProcessName;k = 0;/ MainForm.n = MainForm.v2.size;/ this.setVisiblefalse/ if source = false k + ;source = true; 十测试数据及测试结果时间片算法名师归纳总结 创建进程进程名 5 4 3 2 1 第 14 页,共 17 页时间 6 4 3 7 1 - - - - - - -精选学习资料 - - - - - - - - - 执行时间片算法调度名师归纳总结 - - - - - - -第 15 页,共 17 页精选学习资料 - - - - - - - - - 执行时,先执行进程5,而进程 5 的执行时间为6,比时间片5(程序设定)大,先执行时间 5,再执行下一个进程 5 4 3 2 1 5 2 4,而进程 5 放入就绪队列末尾,依次执行;执行过程为名师归纳总结 - - - - - - -第 16 页,共 17 页精选学习资料 - - - - - - - - - 十二 . 结论从一开头的设计思想到后面的不断精简,无疑面对的是一个重要的问题 :”用线程模拟进程 的掌握难度 ” ;说到这里,不得不承认本课程设计的最重要的特色之处就是通过每创建 一个进程,就对应一个线程来掌握其执行状态;鉴于执行态采纳的是通过另外一个窗 体中的进度条实现程序的执行状态,通过设置优先级只能保证执行的先后次序,却不 能保证前一线程在是否终止时才能连续执行下一个线程,这样表达出的是”并发执 行”,而模拟进程呈现在我们面前的的确进程的” 并行执行 ” 中的同时性;所以采纳了另 外一种实现机制,即依据进程的调度算法,来实现进程的执行次序;采纳串行执行,即呈现出在同一时刻只能有一个进程占用处理机资源,对于FCFS算法,仅仅是简洁的次序执行;对于优先级算法,就是依据优先级的高低进行排序,然后次序执行,留意 不论是何种算法,应当先执行第一个被创建的进程,先到达进程,处理机资源处于空 现状态,所以先执行,后面的就依据相应的算法,进行排序后调度,至于轮转法就比较简洁处理,就是依据进程所需的时间片与CPU 安排给每一个进程的时间片的大小进行比较,如时间片大于 CPU 的时间片,就执行完 CPU 时间片后进入就绪队列尾部,等待下一个 CPU 时间片的到来,反之,就执行完毕,从就绪队列中删除;多级轮转法,就是采纳的多个队列来掌握他的执行次序;本课程设计动态创建 n 个队列后,默认为下标小的优先级高,就依据输入的进程的优先级加入到相应的队列,然后每个队列分配一个 CPU 时间片,假如高优先级队列即下标小的队列中的进程未执行完毕,就加入到下标增一得队列尾部,连续执行,始终执行到尾部时,假如正在执行的进程安排的时间片不足以让其执行完毕,就直接进入该队列的尾部,即轮转法的规章相同;不管怎样,第一个第一创建一个显示进程执行状态的线程,进行执行;等执行完毕后,接着依据以通过调度算法排好序的队列次序创建线程,即次序执行,这样就可实现通过线程掌握进程的串行执行;十三 . 目前资料收集情形(含指定参考资料)名师归纳总结 著作: 1 张尧学 , 史美林 . 运算机操作系统教程第2 版. 清华高校出版社2000 年第 17 页,共 17 页著作: 2 张尧学 . 运算机操作系统教程第2 版 习题与试验指导.2000 年- - - - - - -