




已阅读5页,还剩9页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验一 进程调度小组成员:侯 飞 080806110024王卫党 080806110018陈 德 080806110021杨民岱 080806110026一、 实习内容1、 模拟多批道处理多操作系统的进程调度;2、 模拟实现同步机构避免并发进程执行时可能与时间相关的错误。二、 实习目的在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。当就绪进程个数大于处理器数时,就必须依照某种策略来决定哪些进程优先占用处理器。本实习模拟在单处理器情况下的处理器调度,帮助学生加深了解处理器调度的工作。模拟系统,对进程调度、进程运行状态及PV操作原理加深理解和掌握。三、 实习题目采用剥夺式优先算法,对3个进程进行模拟调度。模拟PV操作同步机构,用PV操作解决进程进入临界区的问题。【设计思想】(1)对三个进程进行模拟调度时,对各进程的静态数进行设置,设进程P1、P2、P3的优先级数分别为1,、2、3,优先级数越大,表示优先级越低。每个进程都处于执行态“e”、就绪态“r”和等待态“w”三种状态之一,并假定初始状态为“r”。(2)每一个进程都用一个PCB表来表示,PCB表的具体内容根据具体情况来定。本进程调度模拟中,为每个PCB表定义四项内容:进程块号id、进程所处状态status、优先级数priority以及等待原因waiter1。系统在运行时,能够显示和打印各进程和系统参数的变化情况,以便于观察各进程的调度。(3)完成必要的初始化操作后便进入进程调度程序,首先由进程P1进入执行,当进程因等待某个事件被阻塞或唤醒某个等待进程时,转进程调度模块。(4)进程进入临界区前后,调用PV操作。(5)如果唤醒的进程的优先级高于正在执行进程的优先级,则剥夺现行进程的执行权。(6)当三进程都处于等待状态时,则退出本模拟系统。四、进程模块示例1数据结构struct int id;int waiter1;int priority;char status;pcb5;2信号量struct int value; /互斥信号量,临界区数,初值为1int waiter2; /同步信号量,初值为0sem3;3现场保护栈char stack115;/每个进程都有一个大小为10个字的现场保护栈,用来保护中断时的断点地址等信息。4全局变量int i;/用来模拟一个程序计数器char addr;/用来模拟通用寄存器int m1,m2;/为系统设置公用数据,被四个进程共享使用。五、 程序运行框图及运行结果六、 程序说明本程序采用java语言编写,模拟3个进程的运行情况,进程在运行过程中要调用P操作申请信号量,如果该进程得到其申请的信号量,就继续运行,否则该进程被阻塞,并将进程置为所申请信号量的等待者,如果已有其它进程在等待同一信号量,则将该进程排在所有等待进程之后。进程在运行过程中,除了调用P操作申请信号量之外,还要调用V操作释放信号量。V操作释放信号量之后,将唤醒被阻塞的进程。程序运行过程中,进程1通过P操作申请信号量1,进程2通过P操作申请信号量2,进程1消耗的信号量由进程2通过V操作产生,进程2消耗的信号量由进程3产生,进程3既消耗信号量3,释放信号量2,i控制进程三的运行次数,当i的值大于设定的值时,进程是调用对它自己调用p操作,阻塞它本身,程序结束。三个进程的运行通过进程调度模块统一安排。调度模块通过find()函数找到第一个就绪进程,如果当前没有进程在执行,就直接运行此就绪进程。如果有进程在执行,则比较两者的优先数,然后运行优先权高者。程序一共有四个类,进程控制块类pcb.java,信号量类sem.java,测试框架类processtestframe.java,主程序测试类test.java。七、 心得: 通过小组内多次争论,探讨程序,终于将pv操作的机制弄明白,然后一起协同将三个进程程序调度弄好,在做程序界面的时候,我们借鉴了同学的经验和部分的代码,并向已经做出来的同学请教,同时改进自己的思维。在相互合作的过程中我们都认识到自己的经验不足。一开始以为涉及到操作系统的模拟编程的都是高不可攀的,然而在仔细阅读课本以及实验说明后,发现只要弄清楚了优先级数调度的实现原理后其实并不难,用优先队列就可以了。通过这个实验一来加深了对优先级数调度的理解,二来也加强了自己的编程实践能力!虽然我们做好了这次的任务,但是也凸显了很多的不足之处.需要锻炼.八、 源程序:PCB.javapublic class PCB private int id;private int waiter1;private int priority;private String status;public int getId() return id;public void setId(int id) this.id = id;public int getWaiter1() return waiter1;public void setWaiter1(int waiter1) this.waiter1 = waiter1;public int getPriority() return priority;public void setPriority(int priority) this.priority = priority;public String getStatus() return status;public void setStatus(String status) this.status = status;SEM.javapublic class SEM private int value; /互斥信号量,临界区数,初值为1private int waiter2; /同步信号量,初值为0public int getValue() return value;public void setValue(int value) this.value = value;public int getWaiter2() return waiter2;public void setWaiter2(int waiter2) this.waiter2 = waiter2;ProcessTestFrame.javapublic class ProcessTestFrame extends JFrame MyPanel panel = new MyPanel();ButtonPanel bp = new ButtonPanel();ShowPanel sp = new ShowPanel();JLabel label = new JLabel(操作系统实验之进程调度-模拟器);JTextArea area = new JTextArea();public ProcessTestFrame() /public static final int FRAME_WIDTH = 700;/public static final int FRAME_HEIGHT = 600;/public ProcessTestFrame() setSize(700, 600);setTitle(进程实验);area.setText(程序执行记录:);Font font = new Font(Serif, Font.ITALIC, 36);label.setFont(font);add(panel, BorderLayout.SOUTH);add(label, BorderLayout.NORTH);add(sp, BorderLayout.WEST);add(bp, BorderLayout.EAST);add(area, BorderLayout.CENTER);public String toString() return fdfdsfdsf ProcessTestFrame;class MyButton extends JButton public MyButton(String text) setText(text);/* * 进度条 * author Administrator * */class MyPanel extends JPanel JProgressBar jpb = new JProgressBar3;JLabel label1 = new JLabel(进程一进度:, SwingConstants.RIGHT);JLabel label2 = new JLabel(进程二进度:, SwingConstants.RIGHT);JLabel label3 = new JLabel(进程三进度:, SwingConstants.RIGHT);public MyPanel() setLayout(new GridLayout(3, 2);jpb0 = new JProgressBar();jpb1 = new JProgressBar();jpb2 = new JProgressBar();add(label1);add(jpb0);add(label2);add(jpb1);add(label3);add(jpb2);/* * 进度展示 * author Administrator * */class ButtonPanel extends JPanel JButton button1 = new JButton(开始);JButton button2 = new JButton(暂停);JLabel label1 = new JLabel(进程一状态:, SwingConstants.RIGHT);JLabel label2 = new JLabel(进程二状态:, SwingConstants.RIGHT);JLabel label3 = new JLabel(进程三状态:, SwingConstants.RIGHT);JTextArea area = new JTextArea3;public ButtonPanel() area0 = new JTextArea();area1 = new JTextArea();area2 = new JTextArea();setLayout(new GridLayout(4, 2);area0.setText(执行);area0.setBackground(Color.green);area1.setText(等待);area1.setBackground(Color.red);area2.setText(就绪);area2.setBackground(Color.yellow);add(button1);add(button2);add(label1);add(area0);add(label2);add(area1);add(label3);add(area2);/* * 进度状态颜色 * author Administrator * */class ShowPanel extends JPanel JLabel label1 = new JLabel(执行状态:, SwingConstants.RIGHT);JLabel label2 = new JLabel(等待状态:, SwingConstants.RIGHT);JLabel label3 = new JLabel(就绪状态:, SwingConstants.RIGHT);JTextArea area1 = new JTextArea();JTextArea area2 = new JTextArea();JTextArea area3 = new JTextArea();public ShowPanel() setLayout(new GridLayout(3, 2);area1.setBackground(Color.green);area2.setBackground(Color.red);area3.setBackground(Color.yellow);add(label1);add(area1);add(label2);add(area2);add(label3);add(area3);Test.javapublic class Test public ProcessTestFrame ptf =null;public PCB pcb = new PCB4;public SEM sem = new SEM3;public int m1; /m1,m2为三个进程共享使用的公用数据public int m2;public int i,ep; /ep表示处于执行状态进程的id,i为通用寄存器public char addr;public char stack = new char205;public String oldStr = null;public static void main(String args) Test test = new Test();test.ptf = new ProcessTestFrame();test.ptf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);test.ptf.setVisible(true);test.init();String oldStr = test.ptf.area.getText();test.ptf.area.setText(oldStr + n + 系统程序开始执行);for (int i = 1; i 3; i+) test.ptf.panel.jpb0.setValue(i);test.ptf.panel.jpb1.setValue(i);test.ptf.panel.jpb2.setValue(i);for(;)try Thread.sleep(1000); catch (InterruptedException e) / TODO Auto-generated catch blocke.printStackTrace();if( test.find()!=0 ) test.w2();else break; oldStr = test.ptf.area.getText();test.ptf.area.setText(oldStr + n + 系统程序结束); public void init() int j,k; for (int i = 0; i pcb.length; i+) pcbi = new PCB(); pcb0.setStatus(w); pcb0.setPriority(4); /数字越大优先级越低for(j=1;j=pcb.length-1;j+) pcbj.setId(j);pcbj.setStatus(r);pcbj.setWaiter1(0);pcbj.setPriority(j);for(j=1;j=sem.length-1;j+) semj = new SEM();for(j=1;j=sem.length-1;j+)semj.setValue(1); semj.setWaiter2(0); i=0; ep=0; addr=0; m1=0; m2=0;for(j=1;j=10;j+) for(k=1;k=3;k+)stackjk=0;public int find() int j;for(j=1;j=this.pcb.length-1;j+)if(pcbj.getStatus().equals(r)return(j); /返回就绪状态的进程号return(0); /找不到就绪进程public int w2() int pd;pd=find(); /获取就绪状态的进程号if(pd=0) return(0);else if(ep=0)/ep=0,表示没有进程在执行pcbpd.setStatus(e);ep=pd; /把正在执行的进程号赋给epoldStr = this.ptf.area.getText() + n;this.ptf.area.setText(oldStr + 进程 + ep + 正在执行);else if(pcbpd.getPriority()4)oldStr = this.ptf.area.getText() + n;this.ptf.area.setText(oldStr + 进程3在信号量sem2上调用P操作);if(p(2,3,n)=0) return 0;else return n3();return n3();private int n3() m2=i;oldStr = this.ptf.area.getText() + n;this.ptf.area.setText(oldStr + 进程3在sem2信号量上调用V操作m=+m2); if(v(2,3,m)=0) return 0; else return m3(); private int m3() i+=1;if(a3()=0) return 0;else return a3();public int p(int se,int p,char ad) /p操作int w; /等待指示字单元semse.setValue(semse.getValue()-1);i
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 物流公司的以租代购的合同4篇
- 装修拆除工地管理办法
- 2025年医保竞赛试题及答案大全
- 自助售卖点管理办法
- 本册综合说课稿-2023-2024学年初中历史与社会(人文地理)下册人教版(人文地理)
- 2025年医院感染暴发控制指南(考试题及答案)
- 2025年云计算领域校招笔试模拟题及答案
- 二类精神药品培训试题(附答案)
- 2025年养老护理员初级考试模拟题
- 冠心病病人的护理考试题及答案
- 流动式起重机械检验记录表
- 蛛网膜下腔出血的个案护理
- 大学信息与网络安全保密管理办法
- 李中莹 亲子关系全面技巧
- 音乐《上学歌》课件
- PMC部门运作流程对下达的生产计划任务合理性负责
- 防止电力电力建设施工安全事故三十项重点要求考试题
- 绿色校园创建资料
- 污水处理池 (有限空间)作业安全告知牌及警示标志
- 六三制新青岛版四年级科学上册第一单元《动物王国》全部课件(一共5课时)
- OpenVPX标准和架构精选课件
评论
0/150
提交评论