1、课 程 设 计课程设计名称:编程模拟多进程共享临界资源专 业 班 级 : xxx 学 生 姓 名 : xxx 学 号 : xxx 指 导 教 师 : xxx 课程设计时间: xxx 软件工程 专业课程设计任务书学生姓名 专业班级 学号题 目 编程模拟多进程共享临界资源课题性质 其它 课题来源 自拟课题指导教师 刘於勋 同组姓名主要内容要求产生3 个进程:1、两个进程模拟需要进入临界区的用户进程,当需要进入临界区时,显示:“进程x请求进入临界区” ,同时向管理进程提出申请;申请返回,表示进入了临界区。在临界区中等待一段随机时间,并显示:“进程x 正在临界区”;当时间结束,显示:“进程x 退出临界
2、区”,同时向管理进程提出退出申请;当申请返回,显示:“进程x 已退出临界区。”2、一个进程作为原语的管理进程,接受其他进程的临界区进入请求:如果允许进入,则设置相应变量,然后返回;如果不允许进入,则进入循环等待,直到允许为止;3、对临界区的访问应遵循空闲让进、忙则等待、有限等待、让权等待的准则。4、进程间通信可以采用信号、消息传递、管道或网络通信方式。任务要求理解多进程共享临界资源的原理,并编程实现参考文献任满杰等操作系统原理实用教程 电子工业出版社 2006汤子瀛 计算机操作系统 (修订版)西安电子科技大学出版社 2001张尧学 史美林计算机操作系统教程实验指导 清华大学出版社 2000 罗
3、宇等 操作系统课程设计机械工业出版社 2005审查意见指导教师签字:教研室主任签字: 2015 年 7 月 6 日 信息科学与工程 学院课程设计成绩评价表课程名称:操作系统原理设计题目:编程模拟多进程共享临界资源专业:软件工程 班级: 姓名: 学号:序号 评审项目 分 数 满分标准说明1 内 容 思路清晰,语言表达准确,概念清楚,论点正确;设计方法科学,分析归纳合理;结论严谨,设计有应用价值。任务饱满,工作量适中2 创 新 内容新颖,设计能反映新技术,对前人工作有改进或突破,或有独特见解3 完整性、实用性 整体构思后合理,理论依据充分,设计完整,实用性强4 数据准确、可靠 数据准确,算法设计合
4、理5 规 范 性 设计格式、绘图、实验数据、标准的运用等符合有关标准和规定6 纪 律 性 遵守课程设计纪律,听从指导教师安排,设计过程态度认真7 答 辩 准备充分,思路清晰、论点正确、对设计方案理解深入,问题回答有理有据,简明正确总 分综合意见指导教师 2015 年 7 月 12 日11 需求分析要求产生3 个进程:1、两个进程模拟需要进入临界区的用户进程,当需要进入临界区时,显示:“进程x请求进入临界区”,同时向管理进程提出申请;申请返回,表示进入了临界区。在临界区中等待一段随机时间,并显示:“进程x 正在临界区”;当时间结束,显示:“进程x 退出临界区”,同时向管理进程提出退出申请;当申请
5、返回,显示:“进程x 已退出临界区。”2、一个进程作为原语的管理进程,接受其他进程的临界区进入请求:如果允许进入,则设置相应变量,然后返回;如果不允许进入,则进入循环等待,直到允许为止;3、对临界区的访问应遵循空闲让进、忙则等待、有限等待、让权等待的准则。4、进程间通信可以采用信号、消息传递、管道或网络通信方式。22 概要设计流程图:图33 运行环境运行环境:Windows 84 开发工具和编程语言开发工具:JDK1.7,EditPlus3.8编程语言:java5 详细设计5.1程序界面import java.awt.*;import java.awt.event.*;import java.
6、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 MainFr
7、ame() 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
8、= new JMenuBar();Container cont = this.getContentPane();/初始化一个容器cont.setLayout(new BorderLayout();/设置布局管理器JPanel jp1 = new JPanel();JPanel jp2 = new JPanel();jp1.setLayout(new GridLayout(0, 1);4for (int i = 0; i jtf.length; i+) /添加文本区JPanel temp = new JPanel();temp.add(jli);temp.add(jtfi);jp1.add(te
9、mp);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
10、(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.setDefaultClo
11、seOperation(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
12、actionPerformed(ActionEvent arg0) if (ts.tu1 != null if (ts.tu2 != null 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);5jta.setText(“);ts.run
13、(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 ThreadMan
14、ager 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) ve
15、c.get(i).interrupt();/*使被阻塞的进程抛出一个中断异常,从而使进程提前结束阻塞状态,退出堵塞代码。*/vec.remove(i);try Thread.currentThread().sleep(100); catch (InterruptedException e) 6e.printStackTrace();JOptionPane.showMessageDialog(null, “模拟结束“, “ 信息“,/ 结束窗口JOptionPane.INFORMATION_MESSAGE);for (int i = 0; i MainFrame.jtf.length; i+)
16、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
17、为 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.
18、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();75.3临界资源设计代码class ThingSome static JTextArea jt
19、a=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.
20、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+) /进程
21、请求使用资源 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 Thre
22、adUser(tm); 8tu1.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 程序运行界面:图 296.2 输入进程名称:图 36.3 点击模拟开始,显示程序运行过程:图 4106.4 输出程序
23、结果:图 511参考文献任满杰, 操作系统原理实用教程 ,电子工业出版社 2006,4663汤子瀛, 计算机操作系统 (第三版) ,西安电子科技大学出版社 2001,3480张尧学, 计算机操作系统教程实验指导,清华大学出版社 2000 ,3567罗宇等, 操作系统课程设计 ,机械工业出版社 2005,7894刘继承, Java 程序设计及实验 ,清华大学出版社 2012,16919812心得体会通过这次课程设计,我们更进一步的熟悉计算机操作系统的内涵,同时也对 java 语法和 java 语言的面向对象特性有了一定的理解。我也更加深刻地理解面向对象的基本概念和面向对象程序设计的基本原理。这次
24、课程设计也提高了我们的编程能力,培养了我们利用面向对象的开发方法进行系统开发的技巧和良好的程序设计风格;使我们进一步学习和利用软件工程思想进行软件开发和软件文档的编制。操作系统是用户和计算机硬件之间的桥梁,用户通过软件向操作系统提交作业,每个作业有一个或多个进程组成。所以本设计的主要功能是实现计算机的模拟进程调度与共享临界资源。本模拟操作系统由三个系统进程组成,由原语管理所有的子进程和总的内存和资源分配,两个进程对临界区进行申请资源和占有。而管理进程(原语)和子进程都是一个类的对象,不同的是系统进程由程序自动初始化和运行,而子进程须由模拟用户提交。在这次编制中,我学会了很多东西,也找出了自己的
25、一些不足。通过这次课程设计我又加深了对这些知识的记忆;其次是各个功能的算法,以前还是很模糊,现在总算有领悟啦;再次是整个工程的全局把握还不够,有时遗漏忘点,不过最后在不断地修改中完成了这次课程设计。13源程序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
26、= 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
27、);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
28、 = 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);14jp1.setBorder(new LineBorder(new Color(0, 0, 0), 10);jp1.setBorder(new Lin
29、eBorder(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 Colo
30、r(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().get
31、ScreenSize().height / 2 - 200);this.setResizable(false);/窗口大小不可变this.setVisible(true);/显示当前窗口jb1.addActionListener(new ActionListener() / jb1 添加监听器public void actionPerformed(ActionEvent arg0) if (ts.tu1 != null if (ts.tu2 != null System.exit(0););jb0.addActionListener(new ActionListener() / jb0 添加监
32、听器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();15public void focusGained(FocusEven
33、t 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(
34、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)
35、e.printStackTrace();JOptionPane.showMessageDialog(null, “模拟结束“, “ 信息“,/ 结束窗口JOptionPane.INFORMATION_MESSAGE);for (int i = 0; i MainFrame.jtf.length; i+) MainFrame.jtfi.setText(“);MainFrame.jtfi.setEditable(true);16MainFrame.jb0.setEnabled(true);public void addThreadUser(ThreadUser user) vec.add(user
36、);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
37、() + “ 等待资源.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() + “ 已退出临
38、界区 “);obj.jta.append(“进程 “ + user.getName() + “ 已退出临界区 n“);synchronized (obj) / 把资源等待池中的进程唤醒obj.notifyAll();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
39、Thread(tm); tu1=new ThreadUser(tm); tu1.setName(name1); 17tu2=new ThreadUser(tm); tu2.setName(name2); tu1.start(); tu2.start(); tm.addThreadUser(tu1); tm.addThreadUser(tu2); Thread managerThread=new Thread(tm); managerThread.start(); class ThreadUser extends Thread /管理进程,接受其他进程的临界区进入请求并处理 ThreadMana
40、ger 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“); class ThingSome static JTextArea jta=new JTextArea(); public ThingSome() public ThingSome(JTextArea jta) this.jta=jt
41、a; 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“); 18