1、操作系统课程设计操作系统课程设计报告 项目名称: 临界区资源模拟 小组成员: AAA BBB CCC DDD 年级专业: 11级计算机科学与技术 日 期: 2014年3月12日一 需求分析建立三个进程,模拟进入临界区,然后用一个进程进行管理。设计技术参数:1实现wait、signal原语 2产生3个进程,两个进程模拟需要进入临界区的用户进程。当需要进入临界区时,显示:“进程x请求进入临界区”,同时向管理进程提出申请;申请返回,表示进入了临界区。在临界区中等待一段随机时间,并显示:“进程x正在临界区”;当时间结束,显示:“进程x退出临界区”,同时向管理进程提出退出申请;当申请返回,显示:“进程x
2、已退出临界区。”3一个进程作为原语的管理进程,接受其他进程的临界区进入请求:如果允许进入,则根据wait 原语的操作步骤设置相应变量,然后返回; 如果不允许进入,则进入循环等待,直到允许为止; 退出时模拟signal 操作。 4进程间通信可以采用信号、消息传递、管道或网络通信方式。二 分析过程 本实验主要分为以下几个部分:进程的创建:编写两个用户进程模拟需要进入临界区,同时还需编写一个进程作为原语的管理进程,其负责管理两个用户进程的进入。设计临界区及进程管理模块,让用户进程在其中访问时遵循空闲让进、忙则等待、有限等待、让权等待的准则。通信块及临界资源的设计,两个进程模拟用户进程进行通信。界面的
3、设计三 开发过程1.进程执行的间断性决定了进程可能具有多种状态,进程的状态反映进程执行的变化。这些状态随着进程的执行和外界条件发生变化和转换。对于处于就绪状态的进程,在调度程序为之分配处理机之后,该进程便可执行,相应地,他就由就绪状态转换执行状态。正在执行的进程也称为当前进程,如果因为分配给它的时间片已经用完而被暂停执行,该进程便由执行状态回到了就绪状态;如果因为发生了某件事情而使进程执行受阻,使之无法继续执行,该进程便由执行状态变为阻塞状态。下图给出了进程的三种基本状态以及各状态之间的转换关系。2.Java实现 Java支持多线程编程,因此用Java编写的应用程序可以同时执行多个任务。Jav
4、a的多线程机制使用起来非常方便,用户只需关注程序细节的实现,而不用担心后台的多任务系统。 Java语言里,线程表现为线程类。Thread()线程类封装了所有需要的线程操作控制。在设计程序时,必须很清晰地区分开线程对象和运行线程,可以将线程对象看作是运行线程的控制面板。在线程对象里有很多方法来控制一个线程是否运行,睡眠,挂起或停止。线程类是控制线程行为的唯一的手段。一旦一个Java程序启动后,就已经有一个线程在运行。可通过调用Thread().currentThread()方法来查看当前运行的是哪一个线程。 3. 唤醒原语当等待队列中的进程所等待的事件发生时,等待该事件的所有进程都将被唤醒。显然
5、,一个处于阻塞状态的进程不可能自己唤醒自己,唤醒一个进程有两种方法:一种是由系统进程唤醒。另一种是由事件发生进程唤醒。当由系统进程唤醒等待进程时,系统进程统一控制事件的发生并将“事件发生”这一消息通知等待进程。从而使得该进程因等待事件已发生而进入就绪队列。等待进程也可由事件发生进唤醒。由事件发生进程唤醒时,事件发生进程和被唤醒进程之间是合作关系。因此,唤醒原语既可被系统进程调用,也可被事件发生进程调用。我们称调用唤醒原语的进程为唤醒进程。唤醒原语首先将被唤醒进程从相应的等待队列中摘下,将被唤醒进程置为就绪状态之后,送入就绪队列。在把被唤醒进程送入就绪队列之后,唤醒原语既可以返回原调用程序,也可
6、以转向进程调度,以便让调度程序有机会选择一个合适的进程执行。4.程序流程图 四 测试过程1. 程序开始界面2. 输入两个进程分别命名为11和22,然后开始测试3. 查看作者4. 保存文件,并命名为:“临界资源模拟”,系统将生成名为“临界资源模拟”的word文件。 5. 打开“临界资源模拟.doc”。 五 小组人员分工AAA:临界资源设计、核查并完善课程设计报告BBB:图形界面设计、对所有程序进行整合、书写课程设计报告CCC:管理进程的设计、核查并完善课程设计报告DDD:临界区及进程管理模块设计、核查并完善课程设计报告六 总结通过本次的操作系统课程设计,我最大的体会就是我们不仅要熟练地掌握书本上
7、的知识,更重要的是能够把学到的知识应用到上机编程中,这样才能算是真正学会了书本上所讲的知识。在编写代码的过程中,我遇到了很多困难,比如图形界面的设计、鼠标触发和管理进程的设计等就花费了很多时间翻看资料,不过看着凭借自己的努力做出来的成果,一切努力都是值得的。通过做这次课程设计,我对Java也有了进一步地了解,特别对部件的布局更熟练了。我想,学习是个持之以恒的过程,如果真正想学好Java以及操作系统的话,光靠课程设计的时间是远远不够的,所以以后我一定要加强学习,坚持不懈,一切努力都是值得的。七 参考文献1.雍俊海 编著. Java程序设计教程(第二版)-北京: 清华大学出版社,2007.07 2
8、.汤小丹、梁红兵等编著. 计算机操作系统(第三版)-西安电子科技大学出版社,2007.023.张芬丽、刘昕等编著. 操作系统实验教程及Linux和Windows系统调用编程北京:清华大学出版社,2010,084.网上搜索相关代码八、程序源代码第一个java文件:MainFrame.java/界面设计import java.awt.Color;import java.awt.FlowLayout;import java.awt.Font;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import ja
9、va.io.BufferedWriter;import java.io.FileWriter;import java.io.IOException;import javax.swing.ImageIcon;import javax.swing.JButton;import javax.swing.JFileChooser;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing.JTextArea;
10、import javax.swing.JTextField; public class MainFrame private static final long serialVersionUID = 1L; private JFrame frame=new JFrame(临界区资源模拟); private JPanel imagePanel; ImageIcon background; static JButton b=new JButton(开始测试); ImageIcon imagea=new ImageIcon(a.gif); ImageIcon imageb=new ImageIcon(
11、2.gif); static JTextField jf=new JTextField2; /单行文本框 ThreadShow ts=new ThreadShow(); /临界资源模拟 JTextArea ja=new JTextArea(null,20,40); /多行文本框,用于显示实验结果 JTextArea je=new JTextArea(null,1,17); /为了界面美观添加的隐形文本框 JTextArea jg=new JTextArea(null,2,70); JTextArea ji=new JTextArea(null,1,20); public MainFrame()
12、 background=new ImageIcon(4.jpg); JLabel label=new JLabel(background); /把背景图片显示在一个标签里面 label.setBounds(0,0,background.getIconWidth(),background.getIconHeight(); /把标签的大小位置设置为图片刚好填充整个面板 imagePanel=(JPanel)frame.getContentPane(); / 把内容窗格转化为JPanel,否则不能用方法setOpaque()来使内容窗格透明 imagePanel.setOpaque(false);
13、/设置内容窗格透明 imagePanel.setLayout(new FlowLayout(); /设置流式布局 JLabel cLabel=new JLabel(imagea,JLabel.LEFT); imagePanel.add(cLabel); String S=进程1的名称:,null,进程2的名称:; JLabel aLabel=new JLabel(S0,null,JLabel.CENTER); aLabel.setFont(new Font(宋体,Font.BOLD,15); /设置字体,宋体,15号 aLabel.setForeground(Color.GREEN); /字体
14、颜色为红色 imagePanel.add(aLabel); /将标签加到面板中 jf0=new JTextField(null,10); jf0.setText(); imagePanel.add(jf0); /添加单行文本框,用于用户进程的输入 JButton plays=new JButton( 刷 新 ); imagePanel.add(plays); plays.setFont(new Font(宋体,Font.BOLD,15); plays.setForeground(Color.RED); JButton b2=new JButton(查看作者); imagePanel.add(b
15、2); b2.setFont(new Font(宋体,Font.BOLD,15); b2.setForeground(Color.RED); imagePanel.add(je); /*为了界面美观添加的隐形文本框 ,以下带有*注释的一样 je.setEditable(false); je.setOpaque(false); JLabel bLabel=new JLabel(S2,null,JLabel.CENTER); bLabel.setFont(new Font(宋体,Font.BOLD,15); bLabel.setForeground(Color.GREEN); imagePanel
16、.add(bLabel); jf1=new JTextField(null,10); jf1.setText(); imagePanel.add(jf1); imagePanel.add(b); /添加按钮 b.setFont(new Font(宋体,Font.BOLD,15); b.setForeground(Color.RED); b.addActionListener(new ActionListener() /为开始测试按钮添加触发事件 public void actionPerformed(ActionEvent e) ja.setText(null); b.setEnabled(f
17、alse); jf0.setEditable(false); jf1.setEditable(false); ts.run(jf0.getText().trim(),jf1.getText().trim(),ja); /调用 ThreadShow.run(,);成员方法实现模拟 /trim()的作用是:去掉字符串左右的空格 ); JButton c=new JButton(保存结果); imagePanel.add(c); c.setFont(new Font(宋体,Font.BOLD,15); c.setForeground(Color.RED); c.addActionListener(n
18、ew ActionListener() public void actionPerformed(ActionEvent e) /为保存结果按钮添加触发事件 try JFileChooser f=new JFileChooser(); f.showSaveDialog(frame); String filename=f.getSelectedFile().getAbsolutePath().trim(); FileWriter x=new FileWriter(filename+.doc); new BufferedWriter(x); String saveString=ja.getText(
19、).replaceAll(n,rn); x.write(saveString); /写 x.flush(); /强制显示 x.close(); /关闭输出流 JOptionPane.showMessageDialog(null,保存成功!,null,JOptionPane.PLAIN_MESSAGE); catch(IOException ioe) JOptionPane.showMessageDialog(null,保存失败!,null,JOptionPane.PLAIN_MESSAGE); ); b2.addActionListener(new ActionListener() /为查看作
20、者按钮添加触发事件 public void actionPerformed(ActionEvent e) JOptionPane.showMessageDialog(null,AAA、BBB、CCC、DDD,作者,JOptionPane.INFORMATION_MESSAGE); ); plays.addActionListener(new ActionListener() /为查看作者按钮添加触发事件 public void actionPerformed(ActionEvent e) ja.setText(null); jf0.setText(); jf0.setEditable(true
21、); jf1.setText(); jf1.setEditable(true); ); ji.setBackground(Color.blue); imagePanel.add(jg); /* jg.setEditable(false); jg.setOpaque(false); JLabel dLabel=new JLabel(imageb,JLabel.LEFT); /添加图片 imagePanel.add(dLabel); ja.setFont(new Font(宋体,Font.BOLD,15); ja.setDisabledTextColor(Color.YELLOW); ja.set
22、Opaque(false); ja.setEditable(false); /JScrollPane js=new JScrollPane(ja, / ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, / ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED ); /添加滚动条 imagePanel.add(ja); /添加多行文本框并设置相关属性 frame.getLayeredPane().setLayout(null); frame.getLayeredPane().add(label,new I
23、nteger(Integer.MIN_VALUE); /把背景图片添加到窗格的最底层 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); /设置关闭框架的行为属性 frame.setLocation(100,5); /窗口位置 frame.setSize(830,710); /窗口大小 frame.setResizable(false); /窗口大小固定 frame.setVisible(true); /设置可见 public static void main(String args) new MainFrame(); 第二个java文件
24、:ThreadManager.java /临界区及进程管理模块import java.util.Vector;import javax.swing.JOptionPane;class ThreadManager implements Runnable /指向要管理的临界资源 ThingSome obj; /临界资源 static boolean jud=false; /记录临界资源的使用情况 Vector vec=new Vector(); /向量,数据元素为线程 public ThreadManager(ThingSome ts) obj=ts; public void run() whil
25、e (vec.size()!=0) for (int i=0;ivec.size();i+) if (!(vec.get(i).isAlive() /如果用户进程运行结束 (vec.get(i).interrupt(); /使被阻塞的用户进程抛出一个中断异常,从而使进程提前结束阻塞状态 vec.remove(i); /删除用户进程i try Thread.sleep(100); /模拟进程运行一段时间 catch (InterruptedException e) e.printStackTrace(); JOptionPane.showMessageDialog(null, 模拟成功!,nul
26、l,JOptionPane.INFORMATION_MESSAGE); /进程运行结束窗口 MainFrame.b.setEnabled(true); /控件可用 public void addThreadUser(ThreadUser user) vec.add(user); /将用户进程添加到向量中 SuppressWarnings(static-access) public void take(Thread user) /进程控制块 System.out.println(进程 +user.getName()+ 请求资源.); obj.jta.append(进程 +user.getName
27、()+ 请求资源.n); while (jud) / 如果jud为true,表示有进程正在使用资源,否则相反 try System.out.println(进程 +user.getName()+ 等待资源.); obj.jta.append(进程 +user.getName()+ 等待资源.n); synchronized (obj) obj.wait(); / 进入资源的等待池中,等待被唤醒 catch (InterruptedException e) e.printStackTrace(); jud=true; /关锁 System.out.println(进程 +user.getName
28、()+ 进入临界区); obj.jta.append(进程 +user.getName()+ 进入临界区n); obj.useing(user); / 使用资源 System.out.println(进程 +user.getName()+ 已退出临界区); obj.jta.append(进程 +user.getName()+ 已退出临界区n); jud=false; /开锁 synchronized(obj) obj.notifyAll(); /把资源等待池中的进程唤醒 第三个java文件:ThingSome.java/临界资源import javax.swing.JTextArea; class ThingSome static JTextArea jta=new JTextArea(); public ThingSome(JTextArea ja) jta=ja; /构造方法 public void useing(Thread user) System.out.println(进程 +user.getName()+ 正在临界区); /控制台输出 jta.append(进程 +user.getName()+ 正在临界区n); /添加到多文本框jta try Thread.sleep(6
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1