1、操作系统课程设计报告院(系): 专业: 学生姓名: 班级: 学号: 题目: 独占设备分派与回收 起迄日期: 设计地点: 实验中心 指 导 教 师: 第 2 学期完毕日期: 年 7 月 10 日一、 课程设计目在多到程序环境下,系统中设备供所有进程共享。为防止进程对系统资源无序竞争,特规定系统设备不容许顾客自行使用,必要由系统统一分派。每当进程项系统提出I/O祈求时,只要是也许和安全带,设备分派程序编按照一定方略,吧设备分派给祈求顾客。在有系统中,为了保证在CPU与设备之间能进行通信,还应分派相应控制器和通道。为了实现设备分派,必要在系统中设立相应数据构造。掌握独占设备分派流程,会使用安全性算法
2、检查设备分派与否安全二、 课程设计内容与规定1) 合理设计SDT、DCT、COCT、CHCT数据构造2) 独占设备、控制器与通道数目可在界面进行设立3) 进程申请使用独占设备时至少规定涉及申请时间与使用时间4) 可读取样例数据(规定存储在外部文献中)进行独占设备、控制器与通道数目初始化,进行进程申请设备初始化5) 点击开始运营后,系统自动依照初始设定数据进行设备分派与回收,所有状态信息需动态地显示出来:设备、控制器、通道数目,阻塞队列状况等6) 运营中可动态增长申请设备进程,可随时暂停,查看当前状态7) 使用可视化界面进行演示三、 系统分析与设计1、系统分析(1)信息:此系统中涉及了SDT、D
3、CT、COCT、CHCT表,其中SDT涉及了设备类型,设备标记符;DCT涉及设备类型、设备标记符、设备状态、该设备指向控制器;COCT涉及控制器标记符、控制器状态、与控制器相连通道;CHCT涉及通道标记符、通道状态、与通道相连控制器。(2)行为:某进程在某时间申请某设备,系统通过查看申请设备状态和控制器、通道来判断该进程能否申请成功、与否阻塞等并动态显示出进程申请时间和使用时间等信息。(3)表达:系统涉及3个界面:主界面、申请进程界面和添加设备界面。主界面包括了初始化按钮、开始按钮、添加设备、申请新进程、暂停按钮。其中添加设备和申请新进程按钮分别于添加设备界面和申请进程界面接口。申请进程界面需
4、要输入新进程名,申请设备类型、标记符和进程开始时间和执行时间;添加设备界面需要输入设备类型、标记符、控制器和通道。2、系统设计:2.1、模块设计:次程序涉及3个包,分别为table包、map包、jframe包。table包中有SDT、DCT、COCT、CHCT表构造;map包涉及了分别相应SDT、DCT、COCT、CHCT表映射写入和读办法;jframe包涉及界面和重要函数(MainF类、Mythread类、increase类、increaseP类、Fileread类)。MainF类能调用Mythread类、Fileread类,申请进程界面调用increaseP类,添加设备界面调用increa
5、se类MainF模块Mythread模块Fileread模块申请新进程界面添加设备界面进程类及进程运营办法初始化incraseP模块incrase模块申请新进程添加设备2.2、数据构造阐明:设计中用到了Map(映射)数据构造,Map构造涉及了key和value两某些,通过key匹配来查询value值,符合次涉及到规定,解决了四张表之间关系public static Map mapD = new HashMap(); /相应DCT表映射,key值为设备类型public static Map mapS = new HashMap(); /对用SDT映射,key值为设备类型public static
6、 Map mapCO = new HashMap(); /相应COCT映射,key值为控制器标记符public static Map mapCH = new HashMap();/相应CHCT映射,key值为通道标记符public static Mythread mt = new Mythread3;/容许申请3个进程,可依照需要做相应更改以上4个映射用于存储相应表信息,设计为全局静态是为了能存储文献和添加设备、控制器、通道信息。2.3、算法流程图:实现设计中主程序和其她子模块算法,以流程图形式表达,需画出函数和过程调用关系图。开始输入初始化文献地址按行读文献,读一行文献与否结束将相应信息保存
7、到相应Map中结束否是 文献读取Fileread(初始化)类开始将界面信息读入并赋给字符串变量新建4张表分别将相应信息添加到4张表中将4张表分别保存到各自映射中(Map)结束 添加设备increase类开始将界面信息读入并赋给字符串变量变量新建顾客定义进程类Mythread类分别将相应信息赋给进程类中属性,产生新进程将新进程类保存到顾客定义进程类数组中并记录当迈进程数目结束 申请新进程increaseP类开始遍历设备表Map该进程申请设备与否存在进程调用sleep()办法睡眠并在jTextArea显示不存在该设备否进程调用sleep办法睡眠一种进程开始时间判断暂停标记与否为1(暂停30S)进程
8、调用sleep办法睡眠30s是在主界面jTextArea显示:进程阻塞调用sleep办法睡眠一种阻塞时间判断暂停标记与否为1进程调用sleep办法睡眠30s是向主界面jTextArea中显示进程开始分派信息否进程调用sleep办法睡眠一种执行时间判断暂停标记与否为1进程调用sleep办法睡眠30s是向主界面jTextArea中显示进程释放资源信息结束否Mythread类:进程执行办法开始定义4个全局静态类型Map定义全局静态进程类型数组定义全局静态变量ii,signal分别记录进程个数和暂停标记与否点击按钮“初始化”调用Fileread类构造办法并将文献信息显示是与否点击“申请新进程”否调用i
9、ncreaseP类中办法申请是与否点击“添加设备”否调用increase类办法添加是与否点击“开始”否通过冒泡法将进程数组中进程按开始时间升序排好否是当进程数在2个或2个以上时 判断进程申请设备与否为同一类同一类进程与否阻塞决定阻塞进程阻塞时间调用Mythread类start办法是是否否结束与否点击“暂停”重新判断选取按钮否是将暂停信号signal置1 MainF类四、系统测试与调试分析1、系统测试l 测试办法:黑盒l 测试技术:功能测试l 测试数据:涉及对的输入及其输出成果和具有错误输入及其输出成果。l 测试报告:必要包括最后测试成果:列出你测试成果,涉及输入和输出。这里测试数据应当完整和严
10、格。功能测试应用背景:它是从使用者角度来编写,它关注系统提供功能特性及其不同解决条件;测试功能不同解决流程(涉及正常解决和异常解决);一种功能测试用例仅用于测试一种功能,一种功能也许需要各种功能测试用例来覆盖。测试阐明测试名称独占设备分派与回收测试目验证系统初始化成功与否测试技术功能测试测试办法黑盒测试法测试用例测试内容从指定文献读入所需信息并显示测试环节从对的文献读入对的格式信息从对的文献读入错误信息从错误文献读入错误信息测试数据f:/aa.txt读格式对的信息f:/aa.txt读格式错误信息从f:/b.txt读格式错误信息预期成果正常显示系统提示错误系统提示错误测试成果与预期相符与预期相符
11、与预期相符测试阐明测试名称独占设备分派与回收测试目验证进程申请资源成功与否测试技术功能测试测试办法黑盒测试法测试用例测试内容进程申请设备并显示信息测试环节不同进程申请不同资源不同进程申请相似资源进程申请不存在设备测试数据process1申请print资源process2申请keyword资源process3申请io资源process1、process2、process3申请print资源Process1申请xxx资源预期成果各进程单独执行显示依照先来先服务申请释放资源并显示显示没有该设备测试成果与预期相符与预期相符与预期相符测试阐明测试名称独占设备分派与回收测试目验证暂停功能能否实现测试技术功
12、能测试测试办法黑盒测试法测试用例测试内容点击暂停按钮看MainF信息与否暂停更新测试环节点击暂停按钮观测信息不点击暂停按钮观测信息测试数据Process1申请print资源信息动态显示为“阻塞中”Process1申请print资源信息动态显示为“阻塞中”预期成果信息不变化信息更新为其她信息测试成果与预期相符与预期相符2、调试分析: 文献读入是系统报错是由于读入格式错误或文献某一行没有数据导致,因而在这严格限制了初始化文献格式;在将设备信息和进程信息存储到相应数据构造中时,发生了信息覆盖问题,这是由于没有在每读一行时候都新建了新进程Mythread和4张表;在进程执行时候当发现没有要申请设备时会
13、报错,因而用try catch语句将错误信息遮蔽。编程中难点在于如何动态显示信息内容,特别是发生阻塞时不好控制,“暂停”按钮实现也比较难,当前只能让系统暂停一定期间无法依照顾客意志进行暂停和继续,对进程知识储备还不够。五、顾客手册1、使用平台:Myeclipse8.6;下载网址:2、不需要安装3、程序使用手册(1)主窗口(2)有两种选项:初始化或添加设备和申请进程初始化点击开始,程序运营点击暂停可使系统暂停之心30s添加新设备申请新进程(申请设备存在)申请进程(申请设备不存在)六、程序清单列出重要/核心算法程序清单,规定加上详细程序注释(函数体/过程注释,与语句行注释)package jfra
14、me;import java.io.BufferedReader;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.IOException;import java.io.InputStreamReader;import map.CHCTmap;import map.COCTmap;import map.DCTmap;import map.SDTmap;import table.CHCT;import table.COCT;imp
15、ort table.DCT;import table.SDT;/*文献读取代码* */public class Fileread String file=f:/aa.txt;/文献地址 String next=null;/用来存储文献每行信息 String s=new String7;/将next值按空格分开后存到S数组中 SDTmap sm=new SDTmap(); DCTmap dm=new DCTmap(); COCTmap com=new COCTmap(); CHCTmap chm=new CHCTmap();MainF mf=new MainF();public Fileread
16、()public Fileread(int i) throws NumberFormatException,IOExceptiontry BufferedReader input =new BufferedReader(new InputStreamReader(new FileInputStream(file);/读文献while(next=input.readLine()!=null)Mythread myt=new Mythread(); SDT sdt=new SDT(); DCT dct=new DCT(); COCT coct=new COCT(); CHCT chct=new C
17、HCT();s=next.split( );sdt.settypeS(s0);sdt.setdeS(s1);dct.set(s0,s1,s2);coct.set(s2,s3);chct.set(s3,s2);myt.set(s4,s0,s1,Double.valueOf(s5),Double.valueOf(s6);mf.mtmf.ii+=myt;sm.setmapS(s0,sdt);dm.setmapD(s0,dct);com.setmapCO(s2,coct);chm.setmapCH(s3,chct);/将读到信息写入4张表相应映射和进程数组中 catch (FileNotFoundEx
18、ception e) / TODO Auto-generated catch blocke.printStackTrace();/添加设备代码String str1=jTextField1.getText();/获得jTextField1中信息String str2=jTextField2.getText();String str3=jTextField3.getText();String str4=jTextField4.getText();SDT sdt=new SDT();DCT dct=new DCT();COCT coct=new COCT();CHCT chct=new CHCT(
19、);sdt.settypeS(str1);sdt.setdeS(str2);dct.set(str1,str2,str3);coct.set(str3,str4);chct.set(str4,str3);MainF.mapS.put(str1,sdt);MainF.mapD.put(str1,dct);MainF.mapCO.put(str3,coct);MainF.mapCH.put(str4,chct);this.dispose();/当前窗口关闭/申请新进程代码String str1=jTextField1.getText();String str2=jTextField2.getTex
20、t();String str3=jTextField3.getText();String str4=jTextField4.getText();String str5=jTextField5.getText();double d1=Double.valueOf(str4);double d2=Double.valueOf(str5);Mythread mtt=new Mythread();mtt.set(str1,str2,str3,d1,d2);MainF.mtMainF.ii+=mtt;this.dispose();/进程代码package jframe;import java.io.IO
21、Exception;import java.util.Iterator;import java.util.Map;import javax.swing.JTextArea;import table.CHCT;import table.COCT;import table.DCT;import map.CHCTmap;import map.COCTmap;import map.DCTmap;import map.SDTmap;public class Mythread extends Thread SDTmap sm=new SDTmap();String con=null;/用来记录当迈进程申请
22、设备控制器String ch=null;/ 用来记录当迈进程申请设备通道DCT dct=new DCT();COCT coct=new COCT();CHCT chct=new CHCT();Fileread filr=new Fileread();String name;/记录进程名double starttime,runtime;/记录进程开始时间(会变)和执行时间double time,use;/time用来记录进程起始时间,use记录使用时间String apptype;/记录进程要申请设备类型String appde;/设备标记符String ss=;/记录jtextArea要显示信
23、息JTextArea text;public void set(String name,String apptype,String appde,double starttime,double runtime)this.name=name;this.apptype=apptype;this.appde=appde;this.starttime=starttime;this.runtime=runtime;public void JT(JTextArea text)this.text=text;public void settime(double time)this.time=time;publi
24、c void setut(double d)this.use=d;public void run()/判断要申请设备与否存在,不存在进程沉睡999.999strydct=(DCT)filr.dm.getmapD().get(apptype); con=dct.get();coct=(COCT).getmapCO().get(con);ch=coct.get();catch(Exception e)text.setText(无该类设备);try Thread.sleep(999999); catch (InterruptedException e1) / TODO Auto-generated
25、catch blocke1.printStackTrace();try Thread.sleep(long)time*1000);/进程在开始前睡眠if(MainF.signal=1)/signal为暂停标记符,为1是暂停30sThread.sleep(30000);MainF.signal=0;text.setText(阻塞中.);Thread.sleep(long)(starttime-time)*1000);/阻塞时间if(MainF.signal=1)Thread.sleep(30000);MainF.signal=0;ss=进程+name+向+设备+apptype+ +appde+提
26、出申请+n+通过控制器 :+con+通道:+ch+n+开始执行时间:+starttime+t+执行中.;text.setText(ss);/jtextArea显示ss信息Thread.sleep(long)runtime*1000);/睡眠执行时间if(MainF.signal=1)Thread.sleep(30000);MainF.signal=0;ss=执行结束,使用时间+use+ +释放资源;text.setText(ss); catch (InterruptedException e) / TODO Auto-generated catch blocke.printStackTrace
27、();public String getname()return name;/主界面开始函数int i = 0;int j = 0;int k = ii;/ii为全局静态变量,存储申请进程数目Mythread myt = null;/冒泡排序,按开始时间升序排序进程if (k = 2) for (i = 0;i k;i+) for (j = i + 1;j mtj.starttime) myt = mti;mti = mtj;mtj = myt;/依照不同进程数使用不同办法switch (ii) case 1:jTextArea2.setText(该进程未使用);mt0.settime(mt0
28、.starttime);mt0.setut(mt0.runtime);mt0.JT(jTextArea2);mt0.start();jTextArea3.setText(该进程未使用);jTextArea4.setText(该进程未使用);break;case 2:jTextArea2.setText(该进程未使用);jTextArea3.setText(该进程未使用);jTextArea4.setText(该进程未使用);mt0.settime(mt0.starttime);mt1.settime(mt1.starttime);mt0.setut(mt0.runtime);mt0.JT(jT
29、extArea2);mt0.start();/判断与否阻塞,阻塞之后办法if (mt0.apptype.equals(mt1.apptype) if (mt0.starttime + mt0.runtime) mt1.starttime) mt1.starttime = mt0.starttime + mt0.runtime;mt1.setut(mt1.starttime + mt1.runtime - mt1.time);mt1.JT(jTextArea3);mt1.start(); else mt1.setut(mt1.runtime);mt1.JT(jTextArea3);mt1.sta
30、rt();break;case 3:jTextArea2.setText(该进程未使用);jTextArea3.setText(该进程未使用);jTextArea4.setText(该进程未使用);mt0.settime(mt0.starttime);mt1.settime(mt1.starttime);mt2.settime(mt2.starttime);mt0.setut(mt0.runtime);mt0.JT(jTextArea2);mt0.start();if (mt0.apptype.equals(mt1.apptype) if (mt0.starttime + mt0.runtim
31、e) mt1.starttime) mt1.starttime = mt0.starttime + mt0.runtime;mt1.setut(mt1.starttime + mt1.runtime - mt1.time);mt1.JT(jTextArea3);mt1.start(); else mt1.setut(mt1.runtime);mt1.JT(jTextArea3);mt1.start();tryif (mt0.apptype.equals(mt2.apptype) if (mt0.starttime + mt0.runtime) mt2.starttime) mt2.startt
32、ime = mt0.starttime + mt0.runtime;mt2.setut(mt2.starttime + mt2.runtime - mt2.time);mt2.JT(jTextArea4);mt2.start(); else mt2.setut(mt2.runtime);mt2.JT(jTextArea4);mt2.start();if (mt1.apptype.equals(mt2.apptype) if (mt1.starttime + mt1.runtime) mt2.starttime) mt2.starttime = mt1.starttime + mt1.runti
33、me;mt2.setut(mt2.starttime + mt2.runtime - mt2.time);mt2.JT(jTextArea4);mt2.start(); else mt2.setut(mt2.runtime);mt2.JT(jTextArea4);mt2.start();catch(Exception e)break;七、体会与自我评价 在这次编程中,选取使用java是由于MyEclipse8.6拥有窗口框架,容易操作,但同步,由于java中没有指针概念,使得SDT、DCT、COCT、CHCT之间练习让我很头疼,起初是打算用list来存储4张表信息,但到日后发现,用list不能
34、较好表象表与表之间关系,最后我选取了使用映射map,映射中包括key和value,而key就好像C+中指针next,能将4张表练习到一起。随后,在对进程void办法中设计令我结识到自己对java进程知识掌握还很匮乏,当前还不能较好运用sleep(),wait(),yield()等办法,也不清晰其之间区别,因而设计规定中暂停无法较好实现。刚开始时思维很混乱,匆忙下就开始编程使程序很繁杂,没有进一步优化程序代码,这是我编程方面不成熟体现,并且对于独占设备分派也理解并不是很到位。通过这次编程,是我对设备分派有了更进一步理解,也是我编译能力得到了锻炼。通过本次课程设计,加深了对所学操作系统知识理解,并且提高了自已编程水平,也让自已结识到了自已编程中存在问题,例如:没有对系统做全面分析习惯,以致于自已程序没有把所有也许浮现状况考虑进内,以致于对于某某些特别值,不能给出对的运营成果,本次课程序设计认自已体会到了全面系统分析问题重要性和必要性。多实践,多进行某些编程锻炼,这将成为我此后一项课程,自己编程水平还是太水,此后必要更加努力才行。八、参照文献1、汤子瀛 编著,计算机操作系统(修订版),西安电子科技大学出版社, 3、java核心技术卷1-基本知识4、java核心技术卷2-高档特性5百度九、课程设计评价(由任课教师填写)课程设计评价 成绩: 教师: 年 月 日
©2010-2024 宁波自信网络信息技术有限公司 版权所有
客服电话:4008-655-100 投诉/维权电话:4009-655-100