中南大学操作系统实验报告.doc_第1页
中南大学操作系统实验报告.doc_第2页
中南大学操作系统实验报告.doc_第3页
中南大学操作系统实验报告.doc_第4页
中南大学操作系统实验报告.doc_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

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

文档简介

操作系统实验报告学 院:信息科学与工程学院 专 业:计算机科学与技术 目录1. 实验要求.032. 总体框架、设计及思路.043. 流程图 .064. 关键技术.105. 总结 .106. 参考文献.117. 源代码.121、 实验要求实验一 处理机调度一、实验内容选择一个调度算法,实现处理机调度。二、实验目的多道系统中,当就绪进程数大于处理机数时,须按照某种策略决定哪些进程优先占用处理机。本实验模拟实现处理机调度,以加深了解处理机调度的工作。三、实验题目1、设计一个按优先权调度算法实现处理机调度的程序;2、设计按时间片轮转实现处理机调度的程序。优先权调度提示及要求PCB内容:进程名/PID;要求运行时间(单位时间);状态;PCB指针;1、可随机输入若干进程,并按优先权排序;2、从就绪队首选进程运行:优先权-1,要求运行时间-1; 要求运行时间=0时,撤销该进程3、重新排序,进行下轮调度;要求1、最好采用图形界面;2、可随时增加进程;3、规定道数,设置后备队列和挂起状态。若内存中进程少于规定道数,可 自动从后备队列调度一作业进入。被挂起进程入挂起队列,设置解挂功 能用于将指定挂起进程解挂入就绪队列。 4、每次调度后,显示各进程状态。实验二 主存空间的分配和回收一、实验内容主存储器空间的分配和回收二、实验目的帮助了解在不同的存储管理方式下,应怎样实现主存空间的分配和回收。三、实验题目在可变分区管理方式下,采用最先适应算法实现主存空间的分配和回收。提示及要求1、自行假设主存空间大小,预设操作系统所占大小并构造未分分区表; 表目内容:起址、长度、状态(未分/空表目);2、结合实验一,PCB增加为:PID,要求运行时间,优先权,状态,所 需主存大小,主存起始位置,PCB指针3、采用最先适应算法分配主存空间;4、进程完成后,回收主存,并与相邻空闲分区合并。 2、 总体框架、设计及思路本次作业的代码是用Java写的。a) 图形界面运用Java GUI程序设计页面,主要是通过Swing技术来实现的。i. 首先将主页面分成两部分:上面一小部分p1依次放置要用到的按钮(创建,运行,挂起,激活,退出),剩下一大部分p2用来放置表格,显示进程的详细信息。ii. 将p2又分成了四个部分,其中三个部分用来放置表格,分别为后备队列表,就绪队列表,挂起进程表;最后一部分放置一个文本框(显示正在运行的进程的一部分信息),进度条(显示正在运行的进程的时间),内存图(显示系统中的内存分配情况)。iii. 三个表的表头都是一样的:进程名称,占用内存,优先权,剩余时间,状态。内存图中会有一部分已经分配给系统内存。iv. 新建进程的页面是继承JDialog类实现的,并用坐标将页面中的各组件定位。b) 进程、内存等事件i. 先要为页面中的各组件添加监听程序,利用组件的addActionListener()或者对应其他事件的方法将监听器对象注册到组件对象上,这样,当组件上发生相应的事件时,将会触发监听器,监听器将会调用相应的方法来处理事件。ii. 具体实现思路:1. 选择“创建”时,弹出新建进程的窗口。如果用户自己设置进程名称、运行时间用优先级,则按用户的需要创建;否则,系统将随机为该进程生成名字、运行时间及优先级。如果就绪队列表中的进程数目少于4个,那么就将新建的进程放入就绪队列表中,分配内存,并按优先级的高低排列;否则该进程就进入到后备队列表中,同样也会按优先级进行排列。2. 选择“运行”时,就绪队列表中的第一个进程的状态改为“运行”,并且开始运行。文本框中显示“*进程正在运行.”;随着时间的推移,该进程的剩余时间慢慢变小,直到0;进度条按比例增长,到最大值后返回0。当第一个进程运行完后,移出就绪队列,如果后备队列表中有进程,那么将后备队列中的第一行移到就绪表中并排序。修改排序后的第一个进程的状态然后运行。重复这些,直到后备队列表和就绪队列表为空。3. 选择“挂起”时,当就绪队列表不为空时,如果选择了表中的一项,那么将选中的那一行移出就绪队列表,如果没有选择就绪表中的任意一行,那么将就绪队列表中的第一行移出;在挂起队列表中添加移出了的这一行,并将状态改为“挂起”;如果就后备队列表不为空,那么将此表中的第一行移到就绪队列表中并排序。4. 选择“激活”时,当挂起队列表不为空时,如果没有在挂起队列表中选择一行,那么不能挂起;如果选择了,那么将选择了的这一行移出;如果就绪队列表中的行数小于4,在就绪队列表中添加移出了的这一行,并将状态改为“就绪”;如果就绪队列表中的行数大于或等于4,那就在后备队列表中添加这一行,并将状态改为“后备”。5. 选择“退出”时,退出整个图形界面。3、 流程图创建是否随机创建输入是否合法就绪表中进程是否少于4添加新进程到就绪表,排序,分配内存添加新进程到后备表,排序结束创建进程就绪表为空移出运行完的进程结束将后备表中第一行移到就绪表中运行就绪表第一行,进度条按比例变化是否有进程正在运行运行后备表为空运行进程挂起就绪表中是否为空是否选中一行将选中的行移出就绪表在挂起表中添加移出的这一行,并将状态改为“挂起”结束将第一行移出就绪表后备表是否为空将后备表中的第一行移到就绪表中挂起进程激活挂起表中是否为空是否选中一行将选中的行移出挂起表在后备表中添加移出的这一行,将状态改为“后备”结束就绪表中进程是否少于4在就绪表中添加移出的这一行,将状态改为“就绪”激活进程4、 关键技术a) 页面布局作业主要分了两部分,但各人认为页面布局占的比例更重,这部分比较耗时间。i. 主页面用了BorderLayout,将页面分成两部分p1,p2;然后在两个页面上分别添加各自需要的组件之类。ii. P1上按顺序放置五个按钮,用来进行操作;p2上分成四个小模块,看起来似乎是用的GridLayout,其实不然。是用坐标定位的,因为上面两个表的占用面积比较小。最后一块上放的组件稍微多一些,必须用坐标控制,将其panel设置大一点。iii. 表格的设置比较好。不是直接创建了一个table,而是用的JScrollPanel类和DefaultTableModel类,这两个类一起可以运用Vector来存储单元格的值对象,方便后来移除一行或者添加一行,并且当表格中的值比较多的时候能自动添加滚动条。iv. 进度条的控制。最初进度条上只显示5秒,每5秒循环一次。但后来发现这样5秒并不能明显地显示进程的运行进度,所以修改一下,按比例来显示进度条的跳动。b) 排序方法,Vector类的使用。Vector 类可以实现可增长的对象数组。与数组一样,它包含可以使用整数索引进行访问的组件。但是,Vector 的大小可以根据需要增大或缩小,以适应创建 Vector 后进行添加或移除项的操作。在排序的时候运用elementAt()方法能够方便地找到向量的指引,比get()方法更好用。c) 事件处理,这些过程并不复杂,只要其中的一个操作写好了,其他的操作也差不了多少。但要注意的是,有些,比如时间控制,内存分配这些地方需要时刻刷新,所以很多地方都要有this.repaint()方法。5、 总结a) 由于平时不怎么使用Swing,在刚写图形界面时有点生疏,一开始用的是布局管理,但随着页面大小的变化,组件也跟着变化,使原有的页面失去协调。解决方法:用坐标定位组件,将页面大小及组件位置固定。b) 运行进程的时候,要与时间相关联,所以用了runnable()方法,用线程Thread类来控制,但要停止的时候总是出问题,在很多地方用了Thread类的stop()方法不管用。最后只能用条件来控制,当它不符合条件时就会自动停止。c) 由于逻辑以及代码的放置位置错误,挂起进程时,总是有空指针异常,内存图中也无变化,并且挂起后进度条继续跳动,而不是变成0。解决办法:增加约束条件,比如当正在运行的进程时间变为0时,时间还在继续减少,此处应该再重新获取进程的时间。在好几处都没有注意到这些,所以浪费了很多时间查错。d) 进程运行完成被移出内存后,或者当内存中的队列变化时,内存图不变化。原因是由于粗心没将内存图跟就绪队列表关联起来,并且没有时刻刷新,以致于不能在队列发生变化的一瞬间内存图也变化。解决办法:在各个操作完成的代码外添加this.repaint();语句,让整个页面时时刷新。e) 本次的作业本来不难,只是粗心太重,开始的时候没有仔细看要求,也没有先在纸上画个页面的草稿,只是单凭脑中的思路在写页面,第一次写出来的页面很丑,只能又写了一次,做了很多无用功;再加上以前学的Java太久没看,生疏了,所以花了很长的时间来弄完。6、 参考文献a) JavaSE平台程序程序设计和实践软件工程师(Java系列教材)b) Java编程思想(Thinking in Java)c) 计算机操作系统d) JAVA5.0API_CN.CHM帮助文档e) 谷歌()f) 百度()7、 源代码主页面OSFrame.javapackage os;import java.awt.BorderLayout;import java.awt.Color;import java.awt.Dimension;import java.awt.Graphics;import java.awt.GridLayout;import java.awt.Rectangle;import java.awt.Toolkit;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.util.Vector;import javax.swing.BorderFactory;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing.JProgressBar;import javax.swing.JScrollPane;import javax.swing.JTable;import javax.swing.JTextArea;import javax.swing.border.TitledBorder;import javax.swing.table.DefaultTableModel;public class OSFrame extends JFrame implements Runnable,ActionListener String info = null;String temp = null;private static OSFrame frame;Thread thread1 = null;private JPanel mainPanel = new JPanel();private JButton createP = new JButton(创建);private JButton stopP = new JButton(运行);private JButton suspendP = new JButton(挂起);private JButton activeP = new JButton(激活);private JButton exit = new JButton(退出);private JLabel barLabel = null;private JProgressBar proBar = null;private JTextArea runTextArea = null;private JLabel memoryLabel = null;private DefaultTableModel defaultTableModel1 = null;private DefaultTableModel defaultTableModel2 = null;private DefaultTableModel defaultTableModel3 = null;private JScrollPane reserveScrollPane = null;private JScrollPane prepareScrollPane = null;private JScrollPane susScrollpane = null;private JTable reserveTable = null;private JTable preparedTable = null;private JTable susTable = null;public JPanel createP1()/buttonJPanel p1 = new JPanel();p1.add(createP);p1.add(stopP);p1.add(suspendP);p1.add(activeP);p1.add(exit);p1.add(new JLabel( );p1.add(new JLabel( );p1.add(new JLabel( );createP.addActionListener(this);stopP.addActionListener(this);suspendP.addActionListener(this);activeP.addActionListener(this);exit.addActionListener(this);p1.setLayout(new GridLayout(1,6,5,12);return p1;public JPanel createP2()JPanel p2 = new JPanel();JPanel p2_1 = this.createP2_1();JPanel p2_2 = this.createP2_2();JPanel p2_3 = this.createP2_3();JPanel p2_4 = this.createP2_4();p2.add(p2_1);p2.add(p2_2);p2.add(p2_3);p2.add(p2_4);p2.setLayout(null);return p2;public JPanel createP2_1()JPanel p2_1 = new JPanel();p2_1.setBorder(BorderFactory.createTitledBorder(null, 后备进程, TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION,null,null);p2_1.add(getReserveScrollPane();p2_1.setBounds(new Rectangle(2,5,308,180);return p2_1;public DefaultTableModel getDefaultTableModel1() if(defaultTableModel1 = null)Object heads1 = 进程名称,占用内存,优先权,剩余时间,状态;defaultTableModel1 = new DefaultTableModel(heads1,0);return defaultTableModel1;public JScrollPane getReserveScrollPane() if(reserveScrollPane = null)reserveScrollPane = new JScrollPane(getReserveTable();return reserveScrollPane;public JTable getReserveTable() if(reserveTable = null)reserveTable = new JTable();Dimension dimension = new Dimension(300,130);reserveTable.setModel(getDefaultTableModel1();reserveTable.setPreferredScrollableViewportSize(dimension);reserveTable.setShowGrid(true);reserveTable.getColumnModel().getColumn(0).setPreferredWidth(140);reserveTable.getTableHeader().setReorderingAllowed(false);return reserveTable;public JPanel createP2_2()JPanel p2_2 = new JPanel();p2_2.setBorder(BorderFactory.createTitledBorder(null, 就绪进程, TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION,null,null);p2_2.add(getPrepareScrollPane();p2_2.setBounds(new Rectangle(308,5,308,180);p2_2.repaint();return p2_2;public DefaultTableModel getDefaultTableModel2() if(defaultTableModel2 = null)Object heads2 = 进程名称,占用内存,优先权,剩余时间,状态;defaultTableModel2 = new DefaultTableModel(heads2,0);/后面一列是行数return defaultTableModel2;public JScrollPane getPrepareScrollPane() if(prepareScrollPane = null)prepareScrollPane = new JScrollPane(getPreparedTable();return prepareScrollPane;public synchronized JTable getPreparedTable()if(preparedTable = null)preparedTable = new JTable();Dimension dimension = new Dimension(300,130);/设置该窗口的宽度和高度preparedTable.setModel(getDefaultTableModel2();preparedTable.setShowGrid(true);/设置绘制表单元格周围的网格线preparedTable.setPreferredScrollableViewportSize(dimension);/设置此表视口的首选大小preparedTable.getColumnModel().getColumn(0).setPreferredWidth(140);/设置表中第一列的首先宽度设为140preparedTable.getTableHeader().setReorderingAllowed(false);/不允许用户重新排列各列return preparedTable;public JPanel createP2_3()JPanel p2_3 = new JPanel();p2_3.setBorder(BorderFactory.createTitledBorder(null, 挂起进程, TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION,null,null);p2_3.setBounds(new Rectangle(2,185,308,280);p2_3.add(getSusScrollpane();return p2_3;public DefaultTableModel getDefaultTableModel3() if(defaultTableModel3 = null)Object heads3 = 进程名称,占用内存,优先权,剩余时间,状态;defaultTableModel3 = new DefaultTableModel(heads3,0);/后面一列是行数return defaultTableModel3;public JScrollPane getSusScrollpane() if(susScrollpane = null)susScrollpane = new JScrollPane(getSusTable();return susScrollpane;public JTable getSusTable() if(susTable = null)susTable = new JTable();Dimension dimension = new Dimension(300,230);susTable.setModel(getDefaultTableModel3();susTable.setPreferredScrollableViewportSize(dimension);susTable.setShowGrid(true);susTable.getColumnModel().getColumn(0).setPreferredWidth(140);susTable.getTableHeader().setReorderingAllowed(false);return susTable;public JPanel createP2_4()JPanel p2_4 = new JPanel();p2_4.setBorder(BorderFactory.createTitledBorder(null, 运行进程, TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION,null,null);p2_4.setBounds(new Rectangle(308,185,308,280);p2_4.setLayout(null);p2_4.add(getBarLabel();p2_4.add(getProBar();p2_4.add(getRunTextArea();p2_4.add(getMemoryLabel();return p2_4;public JLabel getBarLabel() if(barLabel = null)barLabel = new JLabel(进程:);barLabel.setBounds(8, 35, 50, 20);return barLabel;public JLabel getMemoryLabel() if(memoryLabel = null)memoryLabel = new JLabel(内存图 : );memoryLabel.setBounds(30, 130, 50, 20);return memoryLabel;public JProgressBar getProBar() if(proBar = null)proBar = new JProgressBar(0,1000);proBar.setBackground(Color.WHITE);proBar.setForeground(Color.gray);proBar.setBounds(45, 35, 250, 20);proBar.setIndeterminate(false);return proBar;public JTextArea getRunTextArea() if(runTextArea = null)runTextArea = new JTextArea(2,26);runTextArea.setBounds(45, 65, 250, 40);return runTextArea;public void paint(Graphics g)super.paint(g);g.setColor(Color.lightGray);g.fillOval(405, 360, 150, 150);g.setColor(Color.red);g.fillArc(405, 360, 150, 150, 0, 80);g.setColor(Color.black);g.drawString(系统内存, 490, 410);int start=80,memory;DefaultTableModel preparedTableModel = (DefaultTableModel)getFrame().getPreparedTable().getModel();int preparedRowCount = preparedTableModel.getRowCount();for (int i = 0; i 0)/如果 表中有值thread1 = new Thread(this);thread1.start();else if(e.getActionCommand().endsWith(挂起)/将运行的挂起System.out.println(挂起);DefaultTableModel susTableModel = (DefaultTableModel)getFrame().getSusTable().getModel();DefaultTableModel preparedTableModel = (DefaultTableModel)getFrame().getPreparedTable().getModel();DefaultTableModel reserveTableModel = (DefaultTableModel)getFrame().getReserveTable().getModel();int preparedRowCount = preparedTableModel.getRowCount();/就绪表中进程的行数int preparedIndex = getPreparedTable().getSelectedRow();/就绪表中被选择的行if(preparedRowCount 0)/如果就绪表中有进程if(preparedIndex != -1)/如果选择了进程,挂起选择了的进程Object temp = preparedTableModel.getValueAt(preparedIndex, 0),preparedTableModel.getValueAt(preparedIndex, 1),preparedTableModel.getValueAt(preparedIndex, 2),preparedTableModel.getValueAt(preparedIndex, 3),挂起;thread1.stop();preparedTableModel.removeRow(preparedIndex);susTableModel.addRow(temp);else/否则挂起第一个进程Object temp = preparedTableModel.getValueAt(0, 0),preparedTableModel.getValueAt(0, 1),preparedTableModel.getValueAt(0, 2),preparedTableModel.getValueAt(0, 3),挂起;preparedTableModel.removeRow(0);susTableModel.addRow(temp);thread1.stop();thread1 = new Thread(this);thread1.start();if(reserveTableModel.getRowCount() 0)/如果后备表中有进程,那么把后备表中的第一行移到就绪表Object reserveTemp = reserveTableModel.getValueAt(0, 0),reserveTableModel.getValueAt(0, 1),reserveTableModel.getValueAt(0, 2),reserveTableModel.getValueAt(0, 3),就绪;reserveTableModel.removeRow(0);preparedTableModel.addRow(reserveTemp);Vector preparedVector = preparedTableModel.getDataVector();/将就绪表和后备表排序Vector reserveVector = reserveTableModel.getDataVector();preparedVector = PrioritySort.sort(preparedVector);reserveVector = PrioritySort.sort(reserveVector);getProBar().setValue(0);/挂起的同时,将进度条的值设为0this.repaint();elseJOptionPane.showMessageDialog(null, 队列中没有进程, 消息, JOptionPane.YES_OPTION);else if(e.getActionCommand().endsWith(激活)/将挂起的激活,放入就绪队列中System.out.println(激活);int susIndex = getFrame().getSusTable().getSelectedRow();/挂起表中的选择项的序号int preparedRowCount = getFrame().getPreparedTable().getRowCount();/就绪表中的行数System.out.println(preparedRowCount);if(susIndex != -1)/如果在挂起的表中选择了进程DefaultTableModel susTableModel = (DefaultTableModel)getFrame().getSusTable().getM

温馨提示

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

最新文档

评论

0/150

提交评论