李军伍 信息0802 06.docx
- 文档编号:28419544
- 上传时间:2023-07-13
- 格式:DOCX
- 页数:23
- 大小:108.42KB
李军伍 信息0802 06.docx
《李军伍 信息0802 06.docx》由会员分享,可在线阅读,更多相关《李军伍 信息0802 06.docx(23页珍藏版)》请在冰豆网上搜索。
李军伍信息080206
实验一进程调度
一、实习内容
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{
intid;
intwaiter1;
intpriority;
charstatus;
}pcb[5];
2.信号量
struct{
intvalue;//互斥信号量,临界区数,初值为1
intwaiter2;//同步信号量,初值为0
}sem[3];
3.现场保护栈
charstack[11][5];//每个进程都有一个大小为10个字的现场保护栈,用来保护中断时的断点地址等信息。
4.全局变量
inti;//用来模拟一个程序计数器
charaddr;//用来模拟通用寄存器
intm1,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.java
publicclassPCB{
privateintid;
privateintwaiter1;
privateintpriority;
privateStringstatus;
publicintgetId(){
returnid;
}
publicvoidsetId(intid){
this.id=id;
}
publicintgetWaiter1(){
returnwaiter1;
}
publicvoidsetWaiter1(intwaiter1){
this.waiter1=waiter1;
}
publicintgetPriority(){
returnpriority;
}
publicvoidsetPriority(intpriority){
this.priority=priority;
}
publicStringgetStatus(){
returnstatus;
}
publicvoidsetStatus(Stringstatus){
this.status=status;
}
}
SEM.java
publicclassSEM{
privateintvalue;//互斥信号量,临界区数,初值为1
privateintwaiter2;//同步信号量,初值为0
publicintgetValue(){
returnvalue;
}
publicvoidsetValue(intvalue){
this.value=value;
}
publicintgetWaiter2(){
returnwaiter2;
}
publicvoidsetWaiter2(intwaiter2){
this.waiter2=waiter2;
}
}
ProcessTestFrame.java
publicclassProcessTestFrameextendsJFrame{
MyPanelpanel=newMyPanel();
ButtonPanelbp=newButtonPanel();
ShowPanelsp=newShowPanel();
JLabellabel=newJLabel("操作系统实验之进程调度----模拟器");
JTextAreaarea=newJTextArea();
publicProcessTestFrame(){
//publicstaticfinalintFRAME_WIDTH=700;
//publicstaticfinalintFRAME_HEIGHT=600;
//publicProcessTestFrame(){
setSize(700,600);
setTitle("进程实验");
area.setText("程序执行记录:
");
Fontfont=newFont("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);
}
publicStringtoString(){
return"fdfdsfdsfProcessTestFrame";
}
}
classMyButtonextendsJButton{
publicMyButton(Stringtext){
setText(text);
}
}
/**
*进度条
*@authorAdministrator
*
*/
classMyPanelextendsJPanel{
JProgressBar[]jpb=newJProgressBar[3];
JLabellabel1=newJLabel("进程一进度:
",SwingConstants.RIGHT);
JLabellabel2=newJLabel("进程二进度:
",SwingConstants.RIGHT);
JLabellabel3=newJLabel("进程三进度:
",SwingConstants.RIGHT);
publicMyPanel(){
setLayout(newGridLayout(3,2));
jpb[0]=newJProgressBar();
jpb[1]=newJProgressBar();
jpb[2]=newJProgressBar();
add(label1);
add(jpb[0]);
add(label2);
add(jpb[1]);
add(label3);
add(jpb[2]);
}
}
/**
*进度展示
*@authorAdministrator
*
*/
classButtonPanelextendsJPanel{
JButtonbutton1=newJButton("开始");
JButtonbutton2=newJButton("暂停");
JLabellabel1=newJLabel("进程一状态:
",SwingConstants.RIGHT);
JLabellabel2=newJLabel("进程二状态:
",SwingConstants.RIGHT);
JLabellabel3=newJLabel("进程三状态:
",SwingConstants.RIGHT);
JTextArea[]area=newJTextArea[3];
publicButtonPanel(){
area[0]=newJTextArea();
area[1]=newJTextArea();
area[2]=newJTextArea();
setLayout(newGridLayout(4,2));
area[0].setText("执行");
area[0].setBackground(Color.green);
area[1].setText("等待");
area[1].setBackground(Color.red);
area[2].setText("就绪");
area[2].setBackground(Color.yellow);
add(button1);
add(button2);
add(label1);
add(area[0]);
add(label2);
add(area[1]);
add(label3);
add(area[2]);
}
}
/**
*进度状态颜色
*@authorAdministrator
*
*/
classShowPanelextendsJPanel{
JLabellabel1=newJLabel("执行状态:
",SwingConstants.RIGHT);
JLabellabel2=newJLabel("等待状态:
",SwingConstants.RIGHT);
JLabellabel3=newJLabel("就绪状态:
",SwingConstants.RIGHT);
JTextAreaarea1=newJTextArea();
JTextAreaarea2=newJTextArea();
JTextAreaarea3=newJTextArea();
publicShowPanel(){
setLayout(newGridLayout(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.java
publicclassTest{
publicProcessTestFrameptf=null;
publicPCBpcb[]=newPCB[4];
publicSEMsem[]=newSEM[3];
publicintm1;//m1,m2为三个进程共享使用的公用数据
publicintm2;
publicinti,ep;//ep表示处于执行状态进程的id,i为通用寄存器
publiccharaddr;
publiccharstack[][]=newchar[20][5];
publicStringoldStr=null;
publicstaticvoidmain(String[]args){
Testtest=newTest();
test.ptf=newProcessTestFrame();
test.ptf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
test.ptf.setVisible(true);
test.init();
StringoldStr=test.ptf.area.getText();
test.ptf.area.setText(oldStr+"\n"+"系统程序开始执行");
for(inti=1;i<3;i++){
test.ptf.panel.jpb[0].setValue(i);
test.ptf.panel.jpb[1].setValue(i);
test.ptf.panel.jpb[2].setValue(i);
for(;;)
{
try{
Thread.sleep(1000);
}catch(InterruptedExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
if(test.find()!
=0){
test.w2();
}
else
break;
}
oldStr=test.ptf.area.getText();
test.ptf.area.setText(oldStr+"\n"+"系统程序结束");
}
}
publicvoidinit()
{
intj,k;
for(inti=0;i { pcb[i]=newPCB(); } pcb[0].setStatus("w"); pcb[0].setPriority(4);//数字越大优先级越低 for(j=1;j<=pcb.length-1;j++) { pcb[j].setId(j); pcb[j].setStatus("r"); pcb[j].setWaiter1(0); pcb[j].setPriority(j); } for(j=1;j<=sem.length-1;j++) { sem[j]=newSEM(); } for(j=1;j<=sem.length-1;j++){ sem[j].setValue (1); sem[j].setWaiter2(0); } i=0; ep=0; addr='0'; m1=0; m2=0; for(j=1;j<=10;j++) { for(k=1;k<=3;k++) stack[j][k]='0'; } } publicintfind() { intj; for(j=1;j<=this.pcb.length-1;j++) if(pcb[j].getStatus().equals("r")) return(j);//返回就绪状态的进程号 return(0);//找不到就绪进程 } publicintw2(){ intpd; pd=find();//获取就绪状态的进程号 if(pd==0) return(0); else if(ep==0) {//ep=0,表示没有进程在执行 pcb[pd].setStatus("e"); ep=pd;//把正在执行的进程号赋给ep oldStr=this.ptf.area.getText()+"\n"; this.ptf.area.setText(oldStr+"进程"+ep+"正在执行"); } else if(pcb[pd].getPriority() {//判断新来的进程优先数是否小于正在执行进程的优先数pcb[ep].status='r'; oldStr=this.ptf.area.getText()+"\n"; this.ptf.area.setText(oldStr+"读取进程"+pcb[pd].getId()); pcb[pd].setStatus("e"); ep=pd; } oldStr=this.ptf.area.getText()+"\n"; this.ptf.area.setText(oldStr+"运行进程"+ep); i=stack[1][ep]; addr=stack[2][ep]; switch(ep) { case1: process1(); break; case2: process2(); break; case3: process3(); break; default: this.ptf.area.setText("当前进程出现错误"+ep); break; } return0; } publicintprocess1(){ this.ptf.bp.area[0].setBackground(Color.green); if(addr=='m') {if(m1()==0)return0;} i=1; while(true){ if(a1()==0)return0; } } privateinta1(){ oldStr=this.ptf.area.getText()+"\n"; this.ptf.area.setText(oldStr+"进程1在信号量sem[1]上调用P操作"); if(p(1,1,'m')==0)return0; elsereturnm1(); } privateintm1(){ oldStr=this.ptf.area.getText()+"\n"; this.ptf.area.setText(oldStr+"打印进程1...m1="+m1); oldStr=this.ptf.area.getText()+"\n"; this.ptf.area.setText(oldStr+"打印进程1...i="+i); i+=5; if(a1()==0)return0; elsereturna1(); } publicintprocess2() { this.ptf.bp.area[1].setBackground(Color.green); if(addr=='m'){if(m2()==0)return0;} if(addr=='n'){if(n2()==0)return0;} i=1; if(a2()==0)return0; while(true){ if(m2()==0)return0; } } privateinta2(){ oldStr=this.ptf.area.getText()+"\n"; this.ptf.area.setText(oldStr+"进程2在信号量sem[2]上调用P操作"); if(p(2,2,'m')==0)return0; returnm2(); } privateintm2(){ m1=2*m2; oldStr=this.ptf.area.getText()+"\n"; this.ptf.area.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 李军伍 信息0802 06 军伍 信息 0802
![提示](https://static.bdocx.com/images/bang_tan.gif)