编程模拟多进程共享临界资源.docx_第1页
编程模拟多进程共享临界资源.docx_第2页
编程模拟多进程共享临界资源.docx_第3页
编程模拟多进程共享临界资源.docx_第4页
编程模拟多进程共享临界资源.docx_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

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

文档简介

课 程 设 计课程设计名称:编程模拟多进程共享临界资源专 业 班 级 : xxx 学 生 姓 名 : xxx 学 号 : xxx 指 导 教 师 : xxx 课程设计时间: xxx 软件工程 专业课程设计任务书学生姓名专业班级学号题 目编程模拟多进程共享临界资源课题性质其它课题来源自拟课题指导教师刘於勋同组姓名主要内容要求产生3 个进程:1、两个进程模拟需要进入临界区的用户进程,当需要进入临界区时,显示:“进程x请求进入临界区”,同时向管理进程提出申请;申请返回,表示进入了临界区。在临界区中等待一段随机时间,并显示:“进程x 正在临界区”;当时间结束,显示:“进程x 退出临界区”,同时向管理进程提出退出申请;当申请返回,显示:“进程x 已退出临界区。”2、一个进程作为原语的管理进程,接受其他进程的临界区进入请求:如果允许进入,则设置相应变量,然后返回;如果不允许进入,则进入循环等待,直到允许为止;3、对临界区的访问应遵循空闲让进、忙则等待、有限等待、让权等待的准则。4、进程间通信可以采用信号、消息传递、管道或网络通信方式。任务要求 理解多进程共享临界资源的原理,并编程实现参考文献任满杰等操作系统原理实用教程 电子工业出版社 2006汤子瀛 计算机操作系统(修订版)西安电子科技大学出版社 2001张尧学 史美林计算机操作系统教程实验指导 清华大学出版社 2000 罗宇等 操作系统课程设计机械工业出版社 2005审查意见指导教师签字:教研室主任签字: 2015 年 7 月 6 日 信息科学与工程 学院课程设计成绩评价表课程名称:操作系统原理设计题目:编程模拟多进程共享临界资源专业:软件工程 班级: 姓名: 学号:序号评审项目分 数满分标准说明1内 容思路清晰,语言表达准确,概念清楚,论点正确;设计方法科学,分析归纳合理;结论严谨,设计有应用价值。任务饱满,工作量适中2创 新内容新颖,设计能反映新技术,对前人工作有改进或突破,或有独特见解3完整性、实用性整体构思后合理,理论依据充分,设计完整,实用性强4数据准确、可靠数据准确,算法设计合理5规 范 性设计格式、绘图、实验数据、标准的运用等符合有关标准和规定6纪 律 性遵守课程设计纪律,听从指导教师安排,设计过程态度认真7答 辩准备充分,思路清晰、论点正确、对设计方案理解深入,问题回答有理有据,简明正确总 分综合意见 指导教师 2015 年 7 月 12 日1 需求分析要求产生3 个进程:1、两个进程模拟需要进入临界区的用户进程,当需要进入临界区时,显示:“进程x请求进入临界区”,同时向管理进程提出申请;申请返回,表示进入了临界区。在临界区中等待一段随机时间,并显示:“进程x 正在临界区”;当时间结束,显示:“进程x 退出临界区”,同时向管理进程提出退出申请;当申请返回,显示:“进程x 已退出临界区。”2、一个进程作为原语的管理进程,接受其他进程的临界区进入请求:如果允许进入,则设置相应变量,然后返回;如果不允许进入,则进入循环等待,直到允许为止;3、对临界区的访问应遵循空闲让进、忙则等待、有限等待、让权等待的准则。4、进程间通信可以采用信号、消息传递、管道或网络通信方式。2 概要设计流程图:图3 运行环境运行环境:Windows 84 开发工具和编程语言开发工具:JDK1.7,EditPlus3.8编程语言:java5 详细设计5.1程序界面import java.awt.*;import java.awt.event.*;import java.util.*;import javax.swing.*;import javax.swing.border.LineBorder;public class MainFrame extends JFrame implements FocusListener JTextArea jta = new JTextArea();/多行文本框static JTextField jtf = new JTextField2;/单行文本框static JButton jb = new JButton2;/按钮ThreadShow ts = new ThreadShow();/ 界面设计public MainFrame() super(模拟多进程共享临界资源);/题目命名JLabel jl = new JLabel2;for (int i = 0; i jtf.length; i+) jtfi = new JTextField(12);jtfi.addFocusListener(this);jl0 = new JLabel(第一进程的名称 : );/设置标签名称,显示进程jl1 = new JLabel(第二进程的名称 : );jb0 = new JButton(模拟开始);/设置按钮名称,控制程序的开始和结束jb1 = new JButton(模拟结束);JMenuBar mb = new JMenuBar();Container cont = this.getContentPane();/初始化一个容器cont.setLayout(new BorderLayout();/设置布局管理器JPanel jp1 = new JPanel();JPanel jp2 = new JPanel();jp1.setLayout(new GridLayout(0, 1);for (int i = 0; i jtf.length; i+) /添加文本区JPanel temp = new JPanel();temp.add(jli);temp.add(jtfi);jp1.add(temp);for (int i = 0; i jb.length; i+)/添加按钮jp2.add(jbi);jp1.add(jp2);jp1.setBorder(new LineBorder(new Color(0, 0, 0), 10);jp1.setBorder(new LineBorder(new Color(238, 238, 238), 10);cont.setLayout(new BorderLayout();cont.add(jp1, BorderLayout.NORTH);jta.setEnabled(true);JScrollPane js = new JScrollPane(jta,ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); jta.setBorder(new LineBorder(new Color(34, 57, 12), 1);js.setBorder(new LineBorder(new Color(238, 238, 238), 10);cont.add(js, BorderLayout.CENTER);this.setSize(335, 435);/ 定义界面大小this.setDefaultCloseOperation(3);/ 设置当前界面显示时相对屏幕的位置this.setLocation(Toolkit.getDefaultToolkit().getScreenSize().width / 2 - 175,Toolkit.getDefaultToolkit().getScreenSize().height / 2 - 200);this.setResizable(false);/窗口大小不可变this.setVisible(true);/显示当前窗口jb1.addActionListener(new ActionListener() / jb1添加监听器public void actionPerformed(ActionEvent arg0) if (ts.tu1 != null & ts.tu1.isAlive()errupt();if (ts.tu2 != null & ts.tu2.isAlive()errupt();System.exit(0););jb0.addActionListener(new ActionListener() / jb0添加监听器public void actionPerformed(ActionEvent arg0) for (int i = 0; i jtf.length; i+)jtfi.setEditable(false);MainFrame.jb0.setEnabled(false);jta.setText();ts.run(jtf0.getText().trim(), jtf1.getText().trim(), jta););public static void main(String ares) new MainFrame();public void focusGained(FocusEvent arg0) / 当用户点击文本框时,文本框就把当前内容清空JTextField jtf = (JTextField) arg0.getSource();jtf.setText();public void focusLost(FocusEvent arg0) 5.2临界区及进程管理模块class ThreadManager implements Runnable / 指向要管理得临界资源ThingSome obj;/ 记录obj是否已有使用者boolean jud = false;Vector vec = new Vector();String name;public ThreadManager(ThingSome ts) obj = ts;public void run() while (vec.size() != 0) for (int i = 0; i vec.size(); i+) if (!(Thread) vec.get(i).isAlive() /如果进程执行结束(Thread) vec.get(i).interrupt();/*使被阻塞的进程抛出一个中断异常,从而使进程提前结束阻塞状态,退出堵塞代码。*/vec.remove(i);try Thread.currentThread().sleep(100); catch (InterruptedException e) e.printStackTrace();JOptionPane.showMessageDialog(null, 模拟结束, 信息,/ 结束窗口JOptionPane.INFORMATION_MESSAGE);for (int i = 0; i MainFrame.jtf.length; i+) MainFrame.jtfi.setText();MainFrame.jtfi.setEditable(true);MainFrame.jb0.setEnabled(true);public void addThreadUser(ThreadUser user) vec.add(user);public void take(Thread user) / 进程控制块System.out.println(进程 + user.getName() + 请求资源.);obj.jta.append(进程 + user.getName() + 请求资源.n);/ 如果jud为true,表示有进程正在使用资源,jud为false,表示资源没有被使用while (jud) try System.out.println(进程 + user.getName() + 等待资源.);obj.jta.append(进程 + user.getName() + 等待资源.n);synchronized (obj) / 进入资源的等待池中,等待被唤醒obj.wait(); catch (InterruptedException e) System.out.println(进程 + user.getName() + 进入临界区.);obj.jta.append(进程 + user.getName() + 进入临界区.n);jud = true;/ 使用资源obj.useing(user);jud = false;System.out.println(进程 + user.getName() + 已退出临界区);obj.jta.append(进程 + user.getName() + 已退出临界区n);synchronized (obj) / 把资源等待池中的进程唤醒obj.notifyAll();5.3临界资源设计代码class ThingSome static JTextArea jta=new JTextArea(); public ThingSome() public ThingSome(JTextArea jta) this.jta=jta; public void useing(Thread user) System.out.println(进程 +user.getName()+ 正在临界区); jta.append(进程 +user.getName()+ 正在临界区n); try /模拟使用者使用了该资源一段时间 Thread.currentThread().sleep(500); catch (InterruptedException e) e.printStackTrace(); System.out.println(进程 +user.getName()+ 退出临界区); jta.append(进程 +user.getName()+ 退出临界区n); 5.4管理进程代码设计class ThreadUser extends Thread /管理进程,接受其他进程的临界区进入请求并处理 ThreadManager tm=null; /供构造函数 public ThreadUser(ThreadManager tm) this.tm=tm; public void run() for(int i=0;i30;i+) /进程请求使用资源 tm.take(this); ThingSome.jta.append(进程 +this.getName()+ 完成工作n); 5.5通信模块设计class ThreadShow ThreadUser tu1; ThreadUser tu2; public void run(String name1,String name2,JTextArea jta) ThingSome ts=new ThingSome(jta); ThreadManager tm=new ThreadManager(ts);Thread th=new Thread(tm); tu1=new ThreadUser(tm); tu1.setName(name1); tu2=new ThreadUser(tm); tu2.setName(name2); tu1.start(); tu2.start(); tm.addThreadUser(tu1); tm.addThreadUser(tu2); Thread managerThread=new Thread(tm); managerThread.start(); 6测试结果测试数据:第一个进程:zcs第二个进程:wmj6.1程序运行界面:图26.2输入进程名称:图36.3 点击模拟开始,显示程序运行过程:图46.4输出程序结果:图5参考文献任满杰,操作系统原理实用教程,电子工业出版社 2006,4663汤子瀛,计算机操作系统(第三版),西安电子科技大学出版社 2001,3480张尧学,计算机操作系统教程实验指导,清华大学出版社 2000 ,3567罗宇等,操作系统课程设计,机械工业出版社 2005,7894刘继承,Java程序设计及实验,清华大学出版社 2012,169198心得体会通过这次课程设计,我们更进一步的熟悉计算机操作系统的内涵,同时也对java语法和java语言的面向对象特性有了一定的理解。我也更加深刻地理解面向对象的基本概念和面向对象程序设计的基本原理。这次课程设计也提高了我们的编程能力,培养了我们利用面向对象的开发方法进行系统开发的技巧和良好的程序设计风格;使我们进一步学习和利用软件工程思想进行软件开发和软件文档的编制。操作系统是用户和计算机硬件之间的桥梁,用户通过软件向操作系统提交作业,每个作业有一个或多个进程组成。所以本设计的主要功能是实现计算机的模拟进程调度与共享临界资源。本模拟操作系统由三个系统进程组成,由原语管理所有的子进程和总的内存和资源分配,两个进程对临界区进行申请资源和占有。而管理进程(原语)和子进程都是一个类的对象,不同的是系统进程由程序自动初始化和运行,而子进程须由模拟用户提交。在这次编制中,我学会了很多东西,也找出了自己的一些不足。通过这次课程设计我又加深了对这些知识的记忆;其次是各个功能的算法,以前还是很模糊,现在总算有领悟啦;再次是整个工程的全局把握还不够,有时遗漏忘点,不过最后在不断地修改中完成了这次课程设计。源程序import java.awt.*;import java.awt.event.*;import java.util.*;import javax.swing.*;import javax.swing.border.LineBorder;public class MainFrame extends JFrame implements FocusListener JTextArea jta = new JTextArea();/多行文本框static JTextField jtf = new JTextField2;/单行文本框static JButton jb = new JButton2;/按钮ThreadShow ts = new ThreadShow();/ 界面设计public MainFrame() super(模拟多进程共享临界资源);/题目命名JLabel jl = new JLabel2;for (int i = 0; i jtf.length; i+) jtfi = new JTextField(12);jtfi.addFocusListener(this);jl0 = new JLabel(第一进程的名称 : );/设置标签名称,显示线程jl1 = new JLabel(第二进程的名称 : );jb0 = new JButton(模拟开始);/设置按钮名称,控制程序的开始和结束jb1 = new JButton(模拟结束);JMenuBar mb = new JMenuBar();Container cont = this.getContentPane();/初始化一个容器cont.setLayout(new BorderLayout();/设置布局管理器JPanel jp1 = new JPanel();JPanel jp2 = new JPanel();jp1.setLayout(new GridLayout(0, 1);for (int i = 0; i jtf.length; i+) /添加文本区JPanel temp = new JPanel();temp.add(jli);temp.add(jtfi);jp1.add(temp);for (int i = 0; i jb.length; i+)/添加按钮jp2.add(jbi);jp1.add(jp2);jp1.setBorder(new LineBorder(new Color(0, 0, 0), 10);jp1.setBorder(new LineBorder(new Color(238, 238, 238), 10);cont.setLayout(new BorderLayout();cont.add(jp1, BorderLayout.NORTH);jta.setEnabled(true);JScrollPane js = new JScrollPane(jta,ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); jta.setBorder(new LineBorder(new Color(34, 57, 12), 1);js.setBorder(new LineBorder(new Color(238, 238, 238), 10);cont.add(js, BorderLayout.CENTER);this.setSize(335, 435);/ 定义界面大小this.setDefaultCloseOperation(3);/ 设置当前界面显示时相对屏幕的位置this.setLocation(Toolkit.getDefaultToolkit().getScreenSize().width / 2 - 175,Toolkit.getDefaultToolkit().getScreenSize().height / 2 - 200);this.setResizable(false);/窗口大小不可变this.setVisible(true);/显示当前窗口jb1.addActionListener(new ActionListener() / jb1添加监听器public void actionPerformed(ActionEvent arg0) if (ts.tu1 != null & ts.tu1.isAlive()errupt();if (ts.tu2 != null & ts.tu2.isAlive()errupt();System.exit(0););jb0.addActionListener(new ActionListener() / jb0添加监听器public void actionPerformed(ActionEvent arg0) for (int i = 0; i jtf.length; i+)jtfi.setEditable(false);MainFrame.jb0.setEnabled(false);jta.setText();ts.run(jtf0.getText().trim(), jtf1.getText().trim(), jta););public static void main(String ares) new MainFrame();public void focusGained(FocusEvent arg0) /*当用户点击文本框时,文本框就把当前内容清空*/JTextField jtf = (JTextField) arg0.getSource();jtf.setText();public void focusLost(FocusEvent arg0) / 临界区class ThreadManager implements Runnable / 指向要管理得临界资源ThingSome obj;/ 记录obj是否已有使用者boolean jud = false;Vector vec = new Vector();String name;public ThreadManager(ThingSome ts) obj = ts;public void run() while (vec.size() != 0) for (int i = 0; i vec.size(); i+) if (!(Thread) vec.get(i).isAlive() /如果进程执行结束(Thread) vec.get(i).interrupt();/*使被阻塞的进程抛出一个中断异常,从而使进程提前结束阻塞状态,退出堵塞代码。*/vec.remove(i);try Thread.currentThread().sleep(100); catch (InterruptedException e) e.printStackTrace();JOptionPane.showMessageDialog(null, 模拟结束, 信息,/ 结束窗口JOptionPane.INFORMATION_MESSAGE);for (int i = 0; i MainFrame.jtf.length; i+) MainFrame.jtfi.setText();MainFrame.jtfi.setEditable(true);MainFrame.jb0.setEnabled(true);public void addThreadUser(ThreadUser user) vec.add(user);public void take(Thread user) / 进程控制块System.out.println(进程 + user.getName() + 请求资源.);obj.jta.append(进程 + user.getName() + 请求资源.n);/ 如果jud为true,表示有进程正在使用资源,jud为false,表示资源没有被使用while (jud) try System.out.println(进程 + user.getName() + 等待资源.);obj.jta.append(进程 + user.getName() + 等待资源.n);synchronized (obj) / 进入资源的等待池中,等待被唤醒obj.wait(); catch (InterruptedException e) System.out.println(进程 + user.getName() + 进入临界区.);obj.jta.append(进程 + user.getName() + 进入临界区.n);jud = true;/ 使用资源obj.useing(user);jud = false;System.out.println(进程 + user.

温馨提示

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

评论

0/150

提交评论