操作系统课程设计之进程调度_第1页
操作系统课程设计之进程调度_第2页
操作系统课程设计之进程调度_第3页
操作系统课程设计之进程调度_第4页
操作系统课程设计之进程调度_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

目录成绩评定表任务书三.计目的意义、设计内容四.计方案〔软硬件环境,开发工具或语言选择及思路〕五.程序功能模块设计〔程序功能模块划分及层次等〕六.程序总控流程图七.数据构造设计八.程序代码构造〔函数调用关系或类层次关系〕九.程序主要代码解析十.测试数据及测试结果十一.设计过程中遇到的问题及解决方法十二.结论〔系统实现情况、系统特点、设计体会及收获等〕十三.目前资料搜集情况〔含指定参考资料〕二.任务书:课程设计题目模拟进程调度功能的设计与实现学院计算机学院专业计算机科学与技术专业年级2022级参数和设计要求:运用课堂学习的操作系统理论知识,参考操作系统课程里讲述的文件系统有关算法,用C、C++或JAVA语言编程,模拟实现普通操作系统的进程调度功能。本课程设计目的如下:1)编程实现模拟操作系统进程调度子系统的根本功能;理解进程调度的概念,通过课程设计深化理解进程控制块的功能、进程的创立、删除以及进程各个状态间的转换过程;实现先来先效劳、时间片轮转、多级反响轮转法对进程进展的调度过程;通过观察有关的队列构造的内容的动态变化过程深化体会各个调度算法的特点;从而可以更好的稳固从书本上学到的知识。2)编程过程中需要建立队列等构造进展各种操作,通过该次试验,可以催促学生从实用的角度对?数据构造?课程内容进展更深化理解和更纯熟的应用。3)实验编程语言要求使用java语言或C++语言。通过对调度功能的编程实现,不但能有效训练学生对编程语言的纯熟使用,还能促进学生独立考虑解决问题、以及独立查新获取知识的才能。操作系统课程设计报告要求:按要求格式和纸张写出设计报告,报告正文内容如下:设计目的意义、设计内容设计方案〔软硬件环境,开发工具或语言选择及思路等〕3、程序功能模块设计〔程序功能模块划分及层次等〕4、程序总控流程图4、数据构造设计6、程序代码构造〔函数调用关系或类层次关系〕7、程序主要代码解析8、测试数据及测试结果9、设计过程中遇到的问题及解决方法10、结论〔系统实现情况、系统特点、设计体会及收获等。〕报告字数要求:3000评分标准〔1〕设计报告情况;〔2〕、运行演示情况;〔3〕教师质疑答复情况;〔4〕、算法难易程度;〔5〕、协作配合情况学生应完成的工作:实现进程调度子系统如下功能模块:1〕实现进程相关数据构造〔如进程控制块task_struct〕的创立和查看功能。2〕实现多种进程调度算法:先来先效劳算法、优先级调度算法、时间片轮转法、多级反响轮转法等。3〕实现对执行进程的阻塞,对等待进程的唤醒等功能。4〕实现相关队列在进程调度中的动态变化过程。分组要求:可按班级自由组合小组成员,一组2-3人组成。注意:希望同组同学分工明确,团结协作。每位同学需交课程设计报告〔主要写自己负责部分〕。小组成员及分工情况:由学生填写目前资料搜集情况〔含指定参考资料〕:著作:[1]张尧学,史美林.计算机操作系统教程第2版.清华大学出版社2000年著作:[2]张尧学.计算机操作系统教程第2版习题与实验指导.2000年课程设计的工作方案:课程设计的时间为一周,上机时间共20学时。工作方案如下:星期一:准备工作,理解、分析设计要求。总体方案设计,确定组内分工。星期二:程序模块构造设计,模块层次调用关系、模块之间接口约定。星期三:程序设计、模块测试。星期四:程序设计、模块集成;总体测试;写课程设计报告。星期五:完善程序和报告。向教师提交课程设计报告和程序。任务下达日期2022年6月20日完成日期2022年6月26日指导教师〔签名〕学生〔签名〕三.设计目的意义、设计内容1.编程实现模拟操作系统进程调度子系统的根本功能;理解进程调度的概念,通过课程设计深化理解进程控制块的功能、进程的创立、删除以及进程各个状态间的转换过程;实现先来先效劳、时间片轮转、多级反响轮转法对进程进展的调度过程;通过观察有关的队列构造的内容的动态变化过程深化体会各个调度算法的特点;从而可以更好的稳固从书本上学到的知识。2.编程过程中需要建立队列等构造进展各种操作,通过该次试验,可以催促学生从实用的角度对?数据构造?课程内容进展更深化理解和更纯熟的应用。3.实验编程语言要求使用java语言或C++语言。通过对调度功能的编程实现,不但能有效训练学生对编程语言的纯熟使用,还能促进学生独立考虑解决问题、以及独立查新获取知识的才能。四.设计方案〔软硬件环境,开发工具或语言选择及思路等〕<1>设计环境平台:该软件在WindowsXP,JDK1.6<2>开发工具:eclipse+designer<3>设计思路:1、进程概念:进程是被独立分配资源的最小单位。进程是动态概念,必须程序运行才有进程的产生。2、进程的状态模型:〔1〕运行:进程已获得处理机,当前处于运行状态。〔2〕就绪:进程已经准备好,一旦有处理器就可运行。〔3〕阻塞:进程因为发生某事件而暂停执行,亦即进程的执行受到阻塞。3、处理机调度:在多道程序设计系统中,内存中有多道程序运行,他们互相争夺处理机这一重要的资源。处理机调度就是从就绪队列中,按照一定的算法选择一个进程并将处理机分配给它运行,以实现进程并发地执行。4、进程调度算法的功能记录系统中所有进程的执行情况选择占有处理机的进程进展进程的上下文切换5、进程调度的算法:〔1〕先来先效劳算法:最先进入等待队列的进程先执行,进程完毕后执行下一个进程。这是最简单的处理机调度算法,其根本思想是按照进程进入就绪队列的先后顺序调度并分配处理机执行。先来先效劳调度算法是一种不可抢占的算法,先进入就绪队列的进程,先费培处理机运行。一旦一个进程占有了处理机,它就一直运行下去,知道该进程完成工作或者因为等待某事件而不能继续运行时才释放处理机〔2〕优先数算法:即进程的执行顺序由高优先级到低优先级。系统或用户按某种原那么为进程指定一个优先级来表示该进程所享有确实调度优先权。该算法核心是确定进程的优先级。〔3〕时间片轮转算法:固定时间片,每个进程在执行一个时间片后,轮到下一进程执行,知道所有的进程执行完毕。处理器同一个时间只能处理一个任务。处理器在处理多任务的时候,就要看恳求的时间顺序,假设时间一致,就要进展预测。挑到一个任务后,需要假设干步骤才能做完,这些步骤中有些需要处理器参与,有些不需要〔如磁盘控制器的存储过程〕。不需要处理器处理的时候,这部分时间就要分配给其他的进程。原来的进程就要处于等待的时间段上。经过周密分配时间,宏观上就象是多个任务一起运行一样,但微观上是有先后的,就是时间片轮换。(4)多级反响轮转法:把系统中的所有进程分成假设干个具有不同优先级别的组,同一组的进程都具有与所在组同样的优先级别,并且把每组进程组织成一个先进先出的队列。在设计时,按优先级别越高的组中的进程应得时间片越短的原那么分配时间片。在调度时,调度器每次都从优先级别高的就绪队列中队首选择就绪进程。当在高优先级别的队列中找不到就绪进程时,才到低优先级别的就绪进程队列中选取。注:优先数算法时间片轮转法多级反响队列调度法五.程序功能模块设计1.模拟进程调度算法模块界面模块进程调度模块事件模块先来先效劳算法模块优先数算法模块时间片轮转算法模块多级反响队列调度法模块六.程序总控流程图开始开始创立进程及属性创立进程及属性选择算法选择算法先来先效劳算法优先数算法时闾片轮转法先来先效劳算法优先数算法时闾片轮转法多级反响队列调度法显示进程执行状态显示进程执行状态完毕完毕七.数据构造设计本组在实现进程调度算法时采用了一个有特色的模拟方式———线程模拟进程。数据构造设计如下:创立JAVA中的thread对象,并将创立好的各个对象放入数据容器Vector〔〕中,各个调度算法对个进程的排序,其实就是对vector中的thread对象排序,决定其执行顺序。八.程序代码构造〔函数调用关系或类层次关系〕开始执行:publicclassMainThread——>弹出程序运行窗口——>选择进程调度算法{comboBox.getSelectedItem()=="Pri;comboBox.getSelectedItem()=="T_Slice";comboBox.getSelectedItem()=="M_FB_Slice"}——>创立进程:从窗体控件获取相应参数创立进程newRefreshList(list_3,list_1,list_2,textField_3).run()——>对进程进展控制:阻塞〔首先判断有无进程在执行:JOptionPane.showMessageDialog(null,"已经无进程处于运行状态,请创立进程!"),假设有,那么终止执,行将执行进程从就绪队列调入等待队列: v1.addElement(v2.get(0)); v11.addElement(v0.get(0)); v2.remove(0); v0.remove(0); list_2.setListData(v11); list_1.setListData(v0);〕;唤醒:将等待队列中的进程重新调入就绪队列的对尾九.程序主要代码解析publicvoidrun(){ if(MainForm.algorithm.equals("T_Slice")){ execute_T_Slice(); refresh(); }elseif(MainForm.algorithm.equals("M_FB_Slice")){ //S executeM_T_Slice(); refresh(); }else{ execute(); refresh(); } }publicvoidrefresh()//刷新列表,并且执行下一个进程{ MainForm.list_1.setListData(MainForm.v0); if(MainForm.v0.size()>0){ MainForm.textField_3.setText((String)MainForm.v0.get(0)); }else MainForm.textField_3.setText("无进程"); if(k<MainForm.n){ ShowInfoshow=newShowInfo(); show.setVisible(true); Threadt=newThread(show); t.start(); }//进程执行过程}publicvoidexecute(){//FCFS和优先级调度算法 intmaximum=progressBar.getMaximum(); progress=((CrtProcess)MainForm.v2.get(0)).getProgress(); label_3.setText(((CrtProcess)MainForm.v2.get(0)).getProcessName()); label_4.setText(((CrtProcess)MainForm.v2.get(0)).getUserName()); inti=progress; while(i<maximum){ try{ //intvalue=progressBar.getValue(); intvalue=progress; source=MainForm.resource; if(MainForm.resource==true){ progress=value+1; progressBar.setValue(progress); CrtProcessprocess=(CrtProcess)MainForm.v2.get(0); process.setProgress(progress); MainForm.v2.remove(0); MainForm.v2.add(0,process); Thread.sleep(DELAY); i++; prog++; }else{ this.setVisible(false); MainForm.resource=true; break; } }catch(InterruptedExceptionignoredException){ } } if(source==true){ MainForm.v2.remove(0); MainForm.v0.remove(0); k++;//记录已经执行完毕的进程 this.setVisible(false); //process.setFinished(true); }else{ k++; } source=true;}publicvoidexecute_T_Slice(){//时间片轮转算法 intmaximum=progressBar.getMaximum(); inti=0; progress=((CrtProcess)MainForm.v2.get(0)).getProgress();label_3.setText(((CrtProcess)MainForm.v2.get(0)).getProcessName()); label_4.setText(((CrtProcess)MainForm.v2.get(0)).getUserName()); inttime=((CrtProcess)MainForm.v2.get(0)).getTime_Slice(); doublepercent=1.0; if(time>MainForm.cpuTime_Slice){ percent=MainForm.cpuTime_Slice/time;//进度条的比例 } while(progress<maximum&&i<percent*maximum){ try{ intvalue=progressBar.getValue(); source=MainForm.resource; if(MainForm.resource==true){ progress=value+1; progressBar.setValue(progress); ((CrtProcess)MainForm.v2.get(0)).setProgress(progress); Thread.sleep(DELAY*time); i++; }else{ this.setVisible(false); MainForm.resource=true; break; } }catch(InterruptedExceptionignoredException){ } } if(source==true&&percent==1.0){ MainForm.v2.remove(0); MainForm.v0.remove(0); k++;//记录已经执行完毕的进程 this.setVisible(false); } if(source==true&&percent!=1.0){ CrtProcessprocess=(CrtProcess)MainForm.v2.get(0); process.setTime_Slice(time-(int)MainForm.cpuTime_Slice); MainForm.v2.remove(0); MainForm.v0.remove(0); MainForm.v2.addElement(process); MainForm.v0.addElement(process.getProcessName()); k++; MainForm.n++; this.setVisible(false); } if(source==false) k++; source=true;}publicvoidexecuteM_T_Slice(){ for(inti=0;i<MainForm.vector_Num;i++) size[i]=MainForm.vQueue[i].size(); intmaximum=progressBar.getMaximum(); inti=0; progress=((CrtProcess)MainForm.v2.get(0)).getProgress();label_3.setText(((CrtProcess)MainForm.v2.get(0)).getProcessName()); label_4.setText(((CrtProcess)MainForm.v2.get(0)).getUserName()); inttime=((CrtProcess)MainForm.v2.get(0)).getTime_Slice(); doublepercent=1.0; if(time>MainForm.cpuTime_Slice){ percent=MainForm.cpuTime_Slice/time;//进度条的比例 } while(progress<maximum&&i<percent*maximum){ try{ intvalue=progressBar.getValue(); source=MainForm.resource; if(MainForm.resource==true){ progress=value+1; progressBar.setValue(progress); ((CrtProcess)MainForm.v2.get(0)).setProgress(progress); Thread.sleep(DELAY*time); i++; }else{ this.setVisible(false); MainForm.resource=true; break; } }catch(InterruptedExceptionignoredException){ } } if(source==true&&percent==1.0){ MainForm.v2.remove(0); MainForm.v0.remove(0); k++;//记录已经执行完毕的进程 this.setVisible(false); } if(source==true&&percent!=1.0){ if(k<n-1){ CrtProcessprocess=(CrtProcess)MainForm.v2.get(0); process.setTime_Slice(time-(int)MainForm.cpuTime_Slice); MainForm.v2.remove(0); MainForm.v0.remove(0); for(i=0;i<MainForm.vector_Num;i++){ sum1+=size[i]; 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++; this.setVisible(false); }// if(k==n-MainForm.vQueue[MainForm.vector_Num-1].size()-1&&MainForm.vQueue[MainForm.vector_Num-1].size()!=1){// process1.setTime_Slice(time-(int)MainForm.cpuTime_Slice);// k=0;// this.setVisible(false);// } if(source==false) k++; source=true; } }十.测试数据及测试结果时间片算法创立进程进程名54321时

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论