📄 pcb.java
字号:
/*
实习一 处理器调度
第二题:设计一个按时间片轮转法实现处理器调度的程序
[提示]:
(1)假定系统有5个进程,每个进程用一个PCB来代表。PCB的结构为:
进程名——如Q1~Q5。
指针——把5个进程连成队列,用指针指出下一个进程PCB的首地址。
要求运行时间——假设进程需要运行的单位时间数。
已运行时间——进程已运行的单位时间数,初始值为0。
状态——假设两种状态,就绪和结束,用R表示就绪,用E表示结束。初始状态都为就绪状态。
(2) 每次运行之前,为每个进程任意确定它的“要求运行时间”。
(3) 把5个进程按顺序排成循环队列,用指针指出队列连接情况。用一个标志单元记录轮到运行的进程。
处理器调度总是选择标志单元指示的进程运行,对所指的进程,将其“已运行时间”加1。
(4) 进程运行一次后,若“要求运行时间”等于“已运行时间”,则将状态改为“结束”,退出队列,否则将继续轮转。
(5) 若就绪队列为空,结束,否则转到(3)重复。
要求程序的用户界面友好,能显示每次进程调度的情况,如哪个进程在运行,哪些进程就绪,就绪进程的排列情况。
*/
//<applet code=PCB.class width=300 height=450>
//</applet>
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.lang.Number;
import java.io.*;
import java.util.Vector;
public class PCB extends Applet implements ActionListener
{
public TextField time1,time2,time3,time4,time5;
public Label lb1,lb2,lb3,lb4,lb5;
public Panel panel1,panel2;
public TextArea info;
public Button action;
public void init()
{
info=new TextArea("处理器时间片调度算法程序\n\nIniting...Over\n请在上列方格中输入各进程所需要的时间(单位:1)\n",20,40,TextArea.SCROLLBARS_VERTICAL_ONLY);
action=new Button("开始调度");
time1=new TextField("",5);
time2=new TextField("",5);
time3=new TextField("",5);
time4=new TextField("",5);
time5=new TextField("",5);
lb1=new Label("进程(Q1)");
lb2=new Label("进程(Q2)");
lb3=new Label("进程(Q3)");
lb4=new Label("进程(Q4)");
lb5=new Label("进程(Q5)");
panel1=new Panel(new GridLayout(1,5));
panel2=new Panel(new GridLayout(1,5));
//布局设置
panel1.add(lb1);panel1.add(lb2);panel1.add(lb3);panel1.add(lb4);panel1.add(lb5);
panel2.add(time1); panel2.add(time2); panel2.add(time3); panel2.add(time4); panel2.add(time5);
add(panel1);add(panel2);
add(info);
add(action);
//监听
action.addActionListener(this);
}
//数据结构
public class Q
{
public String pName;
public int leftTime;
public int haveTime;
public boolean stat;
//构造函数
public Q (String pName,int leftTime)
{
this.pName=pName;
this.leftTime=leftTime;
this.haveTime=0;
this.stat=false;
}
//覆盖构造函数
public Q (String pName,int leftTime,int haveTime)
{
this.pName=pName;
this.leftTime=leftTime;
this.haveTime=haveTime;
this.stat=false;
}
//返回成员
public String pname()
{
return this.pName;
}
public int havetime()
{
return this.haveTime;
}
public int lefttime()
{
return this.leftTime;
}
public boolean stat()
{
return this.stat;
}
public void addtime()
{
this.haveTime=haveTime+1;
}
public void changestat()
{
this.stat=true;
}
}
//动作处理
public void actionPerformed(ActionEvent e)
{
String event=e.getActionCommand();
String nowtext=info.getText();
int timeNum1 = 0,timeNum2 = 0,timeNum3 = 0,timeNum4 = 0,timeNum5 = 0;
//对异常进行处理。
try {
timeNum1 = Integer.parseInt(time1.getText());
timeNum2 = Integer.parseInt(time2.getText());
timeNum3 = Integer.parseInt(time3.getText());
timeNum4 = Integer.parseInt(time4.getText());
timeNum5 = Integer.parseInt(time5.getText());
} catch (NumberFormatException ex) {
info.setText("输入出错!各个进程需要的时间不能为空或0\n\n请重新输入各个进程需要的时间\n");
return ;
}
if(timeNum1==0||timeNum2==0||timeNum3==0||timeNum4==0||timeNum5==0){
info.setText("输入出错!各个进程需要的时间不能为空或0\n\n请重新输入各个进程需要的时间\n");
return ;
}
info.setText("输入时间正确,\n开始进行时间片轮转法实现处理器调度算法模拟\n");
//创建进程 q1,q2,q3,q4,q5
Q q1=new Q("q1",timeNum1);
Q q2=new Q("q2",timeNum2);
Q q3=new Q("q3",timeNum3);
Q q4=new Q("q4",timeNum4);
Q q5=new Q("q5",timeNum5);
//创建向量队列,用Vector来轮换处理进程
Vector v = new Vector();
v.add(new Q("q1",timeNum1));
v.add(new Q("q2",timeNum2));
v.add(new Q("q3",timeNum3));
v.add(new Q("q4",timeNum4));
v.add(new Q("q5",timeNum5));
String nowstat="";
for(;;){
Q temp=(Q) v.get(0);
//时间处理
temp.addtime();
if(temp.havetime()==temp.lefttime()){
temp.changestat();
}
//调整队列
if(temp.stat()==false)
{
nowstat="未完成";
v.add(new Q(temp.pname(),temp.lefttime(),temp.havetime()));
}else{
nowstat="已完成";
}
v.removeElementAt(0);
info.setText("正在运行:"+temp.pname()+",已运行时间加1,状态:"+nowstat+"\n\n");
nowtext=info.getText();
info.setText(nowtext+"等待就绪队列\n序号 进程名 需要时间 已用时间 状态\n");
nowtext=info.getText();
for (int i = 0; i < v.size(); i++)
{
temp=(Q) v.get(i);
if(temp.stat()==false)
{
nowstat="未完成";
}else{
nowstat="已完成";
}
info.setText(nowtext+" "+i+" "+temp.pname()+" "+temp.lefttime()+" "+temp.havetime()+" "+nowstat+"\n");
nowtext=info.getText();
}
if(v.size()==0)
{
break;
}
try{
Thread.sleep(2000);
} catch (Exception ev) {
info.setText("进程延时出错\n");
}
} //end if
nowtext=info.getText();
info.setText(nowtext+"\n调度完毕\n");
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -