⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pcb.java

📁 使用java模拟实现操作系统一些功能
💻 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 + -