1、设备的分配与回收 操作系统课程设计哈尔滨理工大学课程设计(操作系统)题目: 设备的分配与回收 班级: 计算机科学与技术学院 计算机系10-8班姓名:陈俊鸣 1004010820指导教师:高雪瑶系主任: 林克正 2013年03月01日目 录1生产者消费者问题课程设计 11.1 题目分析 11.2 数据结构 11.3 流程图 11.4 实现技术 21.5 设计结论和心得 22 Linux代码分析 42.1 功能说明 42.2 接口说明 42.3 局部数据结构 42.4 流程图 42.5 以实例说明运行过程 51设备的分配与回收课程设计1.1 题目分析在多到程序环境下,系统中的设备供所有进程共享。为
2、防止进程对系统资源的无序竞争,特规定系统设备不允许用户自行使用,必须由系统统一分配。每当进程项系统提出I/O请求时,只要是可能和安全带,设备分配程序编按照一定的策略,吧设备分配给请求用户。在有的系统中,为了确保在CPU与设备之间能进行通信,还应分配相应的控制器和通道。为了实现设备分配,必须在系统中设置相应的数据结构。1.2数据结构设计中用到了Map(映射)的数据结构,Map结构包括了key和value两部分,通过key的匹配来查询value的值,符合次涉及到的要求,解决了四张表之间的关系 public static Map mapD = new HashMap(); /对应DCT表的映射,ke
3、y值为设备类型public static Map mapS = new HashMap(); /对用SDT的映射,key值为设备类型 public static Map mapCO = new HashMap(); /对应COCT的映射,key值为控制器标识符 public static Map mapCH = new HashMap();/对应CHCT的映射,key值为通道标识符public static Mythread mt = new Mythread3;/允许申请3个进程,可根据需要做相应更改以上4个映射用于存放对应表的信息,设计为全局静态是为了能存储文件和添加的设备、控制器、通道信
4、息。1.3流程图实现设计中主程序和其他子模块的算法,以流程图的形式表示,需画出函数和过程的调用关系图。 文件读取Fileread(初始化)类 添加设备increase类 申请新进程increaseP类Mythread类:进程执行的方法 MainF类1.4实现技术在这次编程中,选择使用的是java是MyEclipse8.6拥有窗口的框架,但同时,由于java中没有指针的概念,使得SDT、DCT、COCT、CHCT之间的练习让我很头疼,所以我选择了使用映射map,映射中包含key和value,而key就好像C+中的指针的next,能将4张表练习到一起。随后,在对进程的void方法中的设计令我认识到
5、自己对java进程知识的掌握还很匮乏,现在还不能很好的运用sleep(),wait(),yield()等方法,也不清楚其之间的区别,因此设计要求中的暂停无法很好的实现。1.5设计结论和心得这次编程,是我对设备的分配有了更进一步的了解,也是我的编译能力得到了锻炼。通过本次课程设计,加深了对所学的操作系统的知识的理解,并且提高了自已的编程水平,也让自已认识到了自已编程中存在的问题,例如:没有对系统做全面分析的习惯,以致于自已的程序没有把全部可能出现的情况考虑进内,以致于对于某一些特别的值,不能给出正确的运行结果,本次课程序设计认自已体会到了全面系统的分析问题的重要性和必要性。多实践,多进行一些编程
6、锻炼,这将成为我今后的一项课程,自己的编程水平还是太水,今后必须更加努力才行。2 .1Linux代码分析为了进一步了解操作系统内核,学习了Linux操作系统的进程同步程序,主要程序源代码如下:package jframe;import java.io.BufferedReader;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.IOException;import java.io.InputStreamReader;impor
7、t map.CHCTmap;import map.COCTmap;import map.DCTmap;import map.SDTmap;import table.CHCT;import table.COCT;import 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(); DC
8、Tmap dm=new DCTmap(); COCTmap com=new COCTmap(); CHCTmap chm=new CHCTmap(); MainF mf=new MainF(); public Fileread() public Fileread(int i) throws NumberFormatException, IOException try BufferedReader input =new BufferedReader(new InputStreamReader(new FileInputStream(file);/读文件 while(next=input.read
9、Line()!=null) Mythread myt=new Mythread(); SDT sdt=new SDT(); DCT dct=new DCT(); COCT coct=new COCT(); CHCT chct=new CHCT(); 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
10、.ii+=myt; sm.setmapS(s0, sdt); dm.setmapD(s0, dct); com.setmapCO(s2, coct); chm.setmapCH(s3, chct); /将读到的信息写入4张表对应的映射和进程数组中 catch (FileNotFoundException e) / TODO Auto-generated catch block e.printStackTrace(); /添加设备的代码String str1=jTextField1.getText();/获得jTextField1中的信息 String str2=jTextField2.getT
11、ext(); String str3=jTextField3.getText(); String str4=jTextField4.getText(); SDT sdt=new SDT(); DCT dct=new DCT(); COCT coct=new COCT(); CHCT chct=new CHCT(); 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
12、.mapD.put(str1, dct); MainF.mapCO.put(str3, coct); MainF.mapCH.put(str4, chct); this.dispose();/当前的窗口关闭/申请新进程代码String str1=jTextField1.getText(); String str2=jTextField2.getText(); String str3=jTextField3.getText(); String str4=jTextField4.getText(); String str5=jTextField5.getText(); double d1=Doub
13、le.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.IOException;import java.util.Iterator;import java.util.Map;import javax.swing.JTextArea;import table.CHCT;import t
14、able.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;/用来记录当前进程申请设备的控制器 String ch=null;/ 用来记录当前进程申请设备的通道 DCT dct=new DCT(); COCT coct=new COCT(); CHCT chct=new CHCT(); Fileread
15、 filr=new Fileread(); String name;/记录进程名 double starttime,runtime;/记录进程的开始时间(会变)和执行时间 double time,use;/time用来记录进程的起始时间,use记录使用时间 String apptype;/记录进程要申请的设备类型 String appde;/设备标识符 String ss=;/记录jtextArea要显示的信息 JTextArea text; public void set(String name,String apptype,String appde,double starttime,dou
16、ble 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; public void setut(double d) this.use=d; public void run()/判断要申请的设备是否存在,不存在进程沉睡999.999s
17、try dct=(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 catch block e1.printStackTrace(); try Thread.sleep(long)time*1000);/进程在开
18、始前睡眠 if(MainF.signal=1)/signal为暂停标识符,为1是暂停30s Thread.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+提出申请+n+通过控制器 :+con+通道:+ch+n +开始执行时间:+starttime+t+执行中.; text.se
19、tText(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 block e.printStackTrace(); public String getname() return name; /主界面开始函数in
20、t 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.starttime); mt0.setut(mt0.runti
21、me); 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(jTextArea2); mt0.sta
22、rt();/判断是否阻塞,阻塞之后的方法 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.start(); brea
23、k; 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.runt
24、ime) 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(); try if (mt0.apptype.equals(mt2.apptype) if (mt0.starttime + mt0.runtime) mt2.starttime) m
25、t2.starttime = 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.startt
26、ime + mt1.runtime; 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; 2.2功能说明2.3局部数据结构public static Map mapD = new HashMap(); /对应DCT表的映射,key值为设备类型public static Map mapS = new HashMap(); /对用SDT的映射,key值为设备类型 public static Map mapCO = new HashMap(); /对应COCT的映射,key值为控制器标识符 public static Map mapCH = new HashMap();/对应CHCT的映射,key值为通道标识符public static Mythread mt = new Mythread3;/允许申请3个进程,可根据需要做相应更改2.4本程序的流程图如图所示2.5以实例说明运行过程点击暂停可使系统暂停之心30s添加新设备申请新进程(申请的设备存在)申请进程(申请的设备不存在)
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1