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

下载本文档

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

文档简介

1、课程设计名称:编程模拟多进程共享临界资源专业班级:_学生姓名:_学号:_指导教师:_课程设计时间:软件工程专业课程设计任务书学生姓名专业班级学号题目编程模拟多进程共享临界资源课题性质其它课题来源自拟课题指导教师刘於勋同组姓名主要内容要求产生3个进程:1两个进程模拟需要进入临界区的用户进程,当需要进入临界区时,显示:进程X请求进入临界区,同时向管理进程提出申请;申请返回,表示进入了临界区。在临界区中等待一段随机时间,并显示:进程x正在临界区;当时间结束,显示:进程X退出临界区同时向管理进程提出退出申请;当申请返回,显示:进程X已退出临界区。2、一个进程作为原语的管理进程,接受其他进程的临界区进入

2、请求:如果允许进入,则设置相应变量,然后返回;如果不允许进入,则进入循环等待,直到允许为止;3、对临界区的访问应遵循空闲让进、忙则等待、有限等待、让权等待的准则。4、进程间通信可以采用信号、消息传递、管道或网络通信方式。任务要求理解多进程共享临界资源的原理,并编程实现参考文献任满杰等操作系统原理实用教程电子工业出版社汤子瀛计算机操作系统(修订版)西安电子科技大学出版社张尧学史美林计算机操作系统教程实验指导清华大学出版社罗宇等操作系统课程设计机械工业出版社2005审查意见指导教师签字:教研室主任签字:年7月6日信息科学与工程课程名称:操作系统原理设计题目:编程模拟多进程共享临界资源专业:软件工程

3、班级:姓名:学号:序号评审项目分数满分标准说明1内容思路清晰,语言表达准确,概念清楚,论点正确;设计方法科学,分析归纳合理;结论严谨,设计有应用价值。任务饱满,工作量适中2创新内容新颖,设计能反映新技术,对前人工作有改进或突破,或有独特见解3完整性、实用性整体构思后合理,理论依据充分,设计完整,实用性强4数据准确、可靠数据准确,算法设计合理5规范性设计格式、绘图、实验数据、标准的运用等符合有关标准和规定6纪律性遵守课程设计纪律,听从指导教师安排,设计过程态度认真7答辩准备充分,思路清晰、论点正确、对设计方案理解深入,问题回答有理有据,简明正确总分综合意见指导教师2015年7月12日 # 1要求

4、产生3个进程:1、两个进程模拟需要进入临界区的用户进程,当需要进入临界区时,显示:“进程请求进入临界区”,同时向管理进程提出申请;申请返回,表示进入了临界区。在临界区中等待一段随机时间,并显示:“进程正在临界区”;当时间结束,显示:“进程退出临界区”,同时向管理进程提出退出申请;当申请返回,显示:“进程已退出临界区。”2、一个进程作为原语的管理进程,接受其他进程的临界区进入请求:如果允许进入,则设置相应变量,然后返回;如果不允许进入,则进入循环等待,直到允许为止;退3、对临界区的访问应遵循空闲让进、忙则等待、有限等待、让权等待的准则。退4、进程间通信可以采用信号、消息传递、管道或网络通信方式。

5、退 2流程图:资源是否为空1足是足结束进程进入临界区,等待一段随机时间,显示“正在等待进入临界区和等待时间结束释放资源,向管理进程由请返回,显示“正在退出临界区逍程获得资源,向管理逍程申请逍入临界区,显示正在等待进入临界区作输入两个用户进程和一个管理进程4进程申请资源,并显示正在请求资源-3幻显示“等待临界区资源显示已退出临界区4幵始*继续等待图1 3运行环境运行环境:4开发工具和编程语言开发工具:,编程语言:5详细设计5.1程序界面importjava.awt.*;importjava.awt.event.*;importjava.util.*;importjavax.swing.*;imp

6、ortjavax.swing.border.LineBorder;publicclassMainFrameextendsJFrameimplementsFocusListenerJTextAreajta=newJTextArea();多行文本框staticJTextFieldjtf=newJTextField2;/单行文本框staticJButtonjb=newJButton2;按钮ThreadShowts=newThreadShow();/界面设计publicMainFrame()super(“模拟多进程共享临界资源”);题目命名JLabeljl=newJLabel2;for(inti=0;

7、ijtf.length;i+)jtfi=newJTextField(12);jtfi.addFocusListener(this);jl0=newJLabel(第一进程的名称:”);设置标签名称,显示进程jll=newJLabel(第二进程的名称:);jb0=newJButton(”模拟开始”);/设置按钮名称,控制程序的开始和结束jb1=newJButton(”模拟结束);JMenuBarmb=newJMenuBar();Containercont=this.getContentPane();初始化一个容器cont.setLayout(newBorderLayout();设置布局管理器JPa

8、neljp1=newJPanel();JPaneljp2=newJPanel();jp1.setLayout(newGridLayout(0,1);for(inti=0;ijtf.length;i+)/添加文本区JPaneltemp=newJPanel();temp.add(jli);temp.add(jtfi);jp1.add(temp);for(inti=0;ijb.length;i+)添加按钮jp2.add(jbi);jp1.add(jp2);jp1.setBorder(newLineBorder(newColor(0,0,0),10);jp1.setBorder(newLineBord

9、er(newColor(238,238,238),10);cont.setLayout(newBorderLayout();cont.add(jp1,BorderLayout.NORTH);jta.setEnabled(true);JScrollPanejs=newJScrollPane(jta,ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);jta.setBorder(newLineBorder(newColor(34,57,12),1);js.

10、setBorder(newLineBorder(newColor(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.se

11、tResizable(false);/窗口大小不可变this.setVisible(true);/显示当前窗口jb1.addActionListener(newActionListener()/jb1添加监听器publicvoidactionPerformed(ActionEventarg0)if(ts.tu1!=null&ts.tu1.isAlive()errupt();if(ts.tu2!=null&ts.tu2.isAlive()errupt();System.exit(0););jb0.addActionListener(newActionLis

12、tener()/jb0添加监听器publicvoidactionPerformed(ActionEventarg0)for(inti=0;ijtf.length;i+)jtfi.setEditable(false);MainFrame.jb0.setEnabled(false);jta.setText();ts.run(jtf0.getText().trim(),jtf1.getText().trim(),jta););publicstaticvoidmain(Stringares)newMainFrame();publicvoidfocusGained(FocusEventarg0)/当用户

13、点击文本框时,文本框就把当前内容清空JTextFieldjtf=(JTextField)arg0.getSource();jtf.setText();publicvoidfocusLost(FocusEventarg0)5.2classThreadManagerimplementsRunnable/指向要管理得临界资源ThingSomeobj;/记录obj是否已有使用者booleanjud=false;Vectorvec=newVector();Stringname;publicThreadManager(ThingSomets)obj=ts;publicvoidrun()while(vec.

14、size()!=0)for(inti=0;ivec.size();i+)if(!(Thread)vec.get(i).isAlive()/如果进程执行结束(Thread)vec.get(i).interrupt();/*使被阻塞的进程抛出一个中断异常,从而使进程提前结束阻塞状态,退出堵塞代码。*/vec.remove(i);tryThread.currentThread().sleep(100);catch(InterruptedExceptione)e.printStackTrace();JOptionPane.showMessageDialog(null,模拟结束,信息,/结束窗口JOpt

15、ionPane.INFORMATION_MESSAGE);for(inti=0;iMainFrame.jtf.length;i+)MainFrame.jtfi.setText();MainFrame.jtfi.setEditable(true);MainFrame.jb0.setEnabled(true);publicvoidaddThreadUser(ThreadUseruser)vec.add(user);publicvoidtake(Threaduser)/进程控制块System.out.println(”进程+user.getName()+请求资源);obj.jta.append(”进

16、程+user.getName()+请求资源n);如果jud为true,表示有进程正在使用资源,jud为false,表示资源没有被使用while(jud)trySystem.out.println(进程+user.getName()+等待资源);obj.jta.append(进程+user.getName()+等待资源n);synchronized(obj)/进入资源的等待池中,等待被唤醒obj.wait();catch(InterruptedExceptione)System.out.println(进程+user.getName()+进入临界区);obj.jta.append(进程+user

17、.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临界资源设计代码classThingSomestaticJTextAreajta=newJTextArea();publicThingSome()publicThingSome(JTextAreajta)th

18、is.jta=jta;publicvoiduseing(Threaduser)System.out.println(”进程+user.getName()+正在临界区”);jta.append(”进程+user.getName()+正在临界区n);try/模拟使用者使用了该资源一段时间Thread.currentThread().sleep(500);catch(InterruptedExceptione)e.printStackTrace();System.out.println(进程+user.getName()+退出临界区);jta.append(进程+user.getName()+退出临

19、界区n);5.4管理进程代码设计classThreadUserextendsThread/管理进程,接受其他进程的临界区进入请求并处理ThreadManagertm=null;/供构造函数publicThreadUser(ThreadManagertm)this.tm=tm;publicvoidrun()for(inti=0;i30;i+)/进程请求使用资源tm.take(this);ThingSome.jta.append(进程+this.getName()+完成工作n);5.5通信模块设计classThreadShowThreadUsertu1;ThreadUsertu2;publicvo

20、idrun(Stringname1,Stringname2,JTextAreajta)ThingSomets=newThingSome(jta);ThreadManagertm=newThreadManager(ts);Threadth=newThread(tm);tu1=newThreadUser(tm);tu1.setName(name1); 图 tu2=newThreadUser(tm);tu2.setName(name2);tu1.start();tu2.start();tm.addThreadUser(tu1);tm.addThreadUser(tu2);ThreadmanagerT

21、hread=newThread(tm);managerThread.start();6测试数据:第一个进程:第二个进程:6.程1序运行界面:图输2入进程名称:图3点击模拟开始,显示程序运行过程:输4出程序结果:图 # ,3148067任满杰,操作系统原理实用教程电子工业出版社,63汤子瀛,计算机操作系统(第三版),西安电子科技大学出版社TOC o 1-5 h z张尧学,计算机操作系统教程实验指导,清华大学出版社,罗宇等,操作系统课程设计,机械工业出版社,94刘继承,程序设计及实验,清华大学出版社,198 #通过这次课程设计,我们更进一步的熟悉计算机操作系统的内涵,同时也对语法和语言的面向对象特

22、性有了一定的理解。我也更加深刻地理解面向对象的基本概念和面向对象程序设计的基本原理。这次课程设计也提高了我们的编程能力,培养了我们利用面向对象的开发方法进行系统开发的技巧和良好的程序设计风格;使我们进一步学习和利用软件工程思想进行软件开发和软件文档的编制。操作系统是用户和计算机硬件之间的桥梁,用户通过软件向操作系统提交作业,每个作业有一个或多个进程组成。所以本设计的主要功能是实现计算机的模拟进程调度与共享临界资源。本模拟操作系统由三个系统进程组成,由原语管理所有的子进程和总的内存和资源分配,两个进程对临界区进行申请资源和占有。而管理进程(原语)和子进程都是一个类的对象,不同的是系统进程由程序自

23、动初始化和运行,而子进程须由模拟用户提交。在这次编制中,我学会了很多东西,也找出了自己的一些不足。通过这次课程设计我又加深了对这些知识的记忆;其次是各个功能的算法,以前还是很模糊,现在总算有领悟啦;再次是整个工程的全局把握还不够,有时遗漏忘点,不过最后在不断地修改中完成了这次课程设计。 # 源程序importjava.awt.*;importjava.awt.event.*;importjava.util.*;importjavax.swing.*;importjavax.swing.border.LineBorder;publicclassMainFrameextendsJFrameimpl

24、ementsFocusListenerJTextAreajta=newJTextArea();多行文本框staticJTextFieldjtf=newJTextField2;/单行文本框staticJButtonjb=newJButton2;按钮ThreadShowts=newThreadShow();/界面设计publicMainFrame()super(“模拟多进程共享临界资源”);题目命名JLabeljl=newJLabel2;for(inti=0;ijtf.length;i+)jtfi=newJTextField(12);jtfi.addFocusListener(this);jl0=

25、newJLabel(第一进程的名称:”);设置标签名称,显示线程jll=newJLabel(第二进程的名称:);jb0=newJButton(”模拟开始”);/设置按钮名称,控制程序的开始和结束jb1=newJButton(”模拟结束);JMenuBarmb=newJMenuBar();Containercont=this.getContentPane();初始化一个容器cont.setLayout(newBorderLayout();设置布局管理器JPaneljp1=newJPanel();JPaneljp2=newJPanel();jp1.setLayout(newGridLayout(0

26、,1);for(inti=0;ijtf.length;i+)/添加文本区JPaneltemp=newJPanel();temp.add(jli);temp.add(jtfi);jp1.add(temp);for(inti=0;ijb.length;i+)添加按钮jp2.add(jbi);jp1.add(jp2);l4l4jp1.setBorder(newLineBorder(newColor(0,0,0),10);jp1.setBorder(newLineBorder(newColor(238,238,238),10);cont.setLayout(newBorderLayout();cont

27、.add(jp1,BorderLayout.NORTH);jta.setEnabled(true);JScrollPanejs=newJScrollPane(jta,ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);jta.setBorder(newLineBorder(newColor(34,57,12),1);js.setBorder(newLineBorder(newColor(238,238,238),10);cont.add(js,Bord

28、erLayout.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);/显示当前窗口jbl.addActi

29、onListener(newActionListener()/jb1添加监听器publicvoidactionPerformed(ActionEventarg0)if(ts.tul!=null&ts.tul.isAlive()errupt();if(ts.tu2!=null&ts.tu2.isAlive()errupt();System.exit(0););jb0.addActionListener(newActionListener()/jb0添加监听器publicvoidactionPerformed(ActionEventarg0)for(inti

30、=0;ijtf.length;i+)jtfi.setEditable(false);MainFrame.jb0.setEnabled(false);jta.setText();ts.run(jtf0.getText().trim(),jtfl.getText().trim(),jta););publicstaticvoidmain(Stringares)newMainFrame(); publicvoidfocusGained(FocusEventarg0)/*当用户点击文本框时,文本框就把当前内容清空*/JTextFieldjtf=(JTextField)arg0.getSource();j

31、tf.setText();publicvoidfocusLost(FocusEventarg0)/临界区classThreadManagerimplementsRunnable/指向要管理得临界资源ThingSomeobj;/记录obj是否已有使用者booleanjud=false;Vectorvec=newVector();Stringname;publicThreadManager(ThingSomets)obj=ts;publicvoidrun()while(vec.size()!=0)for(inti=0;ivec.size();i+)if(!(Thread)vec.get(i).is

32、Alive()/如果进程执行结束(Thread)vec.get(i).interrupt();/*使被阻塞的进程抛出一个中断异常,从而使进程提前结束阻塞状态,退出堵塞代码。*/vec.remove(i);tryThread.currentThread().sleep(100);catch(InterruptedExceptione)e.printStackTrace();JOptionPane.showMessageDialog(null,模拟结束,信息,/结束窗口JOptionPane.INFORMATION_MESSAGE);for(inti=0;iMainFrame.jtf.length

33、;i+)MainFrame.jtfi.setText();MainFrame.jtfi.setEditable(true);MainFrame.jb0.setEnabled(true);publicvoidaddThreadUser(ThreadUseruser)vec.add(user);publicvoidtake(Threaduser)/进程控制块System.out.println(”进程+user.getName()+请求资源);obj.jta.append(”进程+user.getName()+请求资源n);如果jud为true,表示有进程正在使用资源,jud为false,表示资源

34、没有被使用while(jud)trySystem.out.println(进程+user.getName()+等待资源);obj.jta.append(进程+user.getName()+等待资源n);synchronized(obj)/进入资源的等待池中,等待被唤醒obj.wait();catch(InterruptedExceptione)System.out.println(进程+user.getName()+进入临界区);obj.jta.append(进程+user.getName()+进入临界区n);jud=true;/使用资源obj.useing(user);jud=false;System.out.print

温馨提示

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

评论

0/150

提交评论