操作系统
进程调度之最高优先级算法
import java.util.ArrayList;
class process{
private int IDname; //进程ID
private int PR; //优先级
private int CPUTIME; //进程已运行的时间
private int LASTTIME; //进程还需运行的时间
private String STATE; //进程状态
process (int i,int PR,int CPUTIME,int LASTTIME,String STATE)
{
this.IDname=i; //用this引用成员变量,
this.PR=PR; //并将该构造方法所设置的值,
this.CPUTIME=CPUTIME; //赋予成员变量。
this.LASTTIME=LASTTIME; //
this.STATE=STATE; //
}
public int getIDname() //设置对应的成员变量的方法,
{ //并将变化的值返回。
return IDname; //
} //
public int getPR()
{
return PR;
}
public int getCPUTIME()
{
return CPUTIME;
}
public int getLASTTIME()
{
return LASTTIME;
}
public String getSTATE()
{
return STATE;
}
public String setSTATE(String i)
{
STATE=i;
return STATE;
}
public int setPR(int i)
{
return (PR=PR-i);
}
public int setCPUTIME(int i) //此处传入的参数为时间片,CPU每完成一次加一个时间片
{
return (CPUTIME=CPUTIME+i);
}
public int setLASTTIME(int i) //剩余时间减一次时间片
{
return (LASTTIME=LASTTIME-i);
}
}
public class RR{
public static void main(String[] args) {
ArrayList<process> list=new ArrayList<>();//创建数组列表存放 进程对象
ArrayList<process> temp=new ArrayList<>();
//用add方法添加对象加入数组列表中
list.add( new process(0, 4, 0, 8, "W"));
list.add( new process(1, 3, 0, 4, "W" ));
list.add( new process(2, 2, 0, 6, "W" ));
list.add( new process(3, 1, 0, 2, "W" ));
list.add( new process(4, 5, 0,10, "W" ));
//输出当前的进程对象
System.out.println("进程名\t优先级\t运行时间 \t剩余时间 \t状态");
for(process L : list) //for循环的简写
System.out.println(" "+L.getIDname()+"\t"+L.getPR()+" \t"+L.getCPUTIME()+" \t"+L.getLASTTIME()+" \t"+L.getSTATE());
while (list.size()>0) //size方法是表示数组中有多少个元素
{
int id=getID(list);
process q=list.get(id);
if(q.getLASTTIME()==0)
{
q.setSTATE("F");
System.out.println("运行完成的进程: ");
System.out.println("进程名\t优先级\t运行时间 \t剩余时间 \t状态");
System.out.println(" "+q.getIDname()+"\t"+q.getPR()+"\t"+q.getCPUTIME()+"\t"+q.getLASTTIME()+"\t"+q.getSTATE());
temp.add(new process(q.getIDname(),q.getPR(),q.getCPUTIME(),q.getLASTTIME(),q.getSTATE()));
list.remove(id); //移除该进程号
}
else {
q.setSTATE("R");
System.out.println("正在运行的进程: ");
System.out.println("进程名\t优先级\t运行时间 \t剩余时间 \t状态");
System.out.println(" "+q.getIDname()+"\t"+q.getPR()+"\t"+q.getCPUTIME()+"\t"+q.getLASTTIME()+"\t"+q.getSTATE());
q.setPR(1); //运行后优先级减1
q.setCPUTIME(1); //运行后CPU时间加1
q.setLASTTIME(1); //运行后,剩余需运行时间减1
q.setSTATE("W");
System.out.println("当前进程运行完的结果: ");
System.out.println("进程名\t优先级\t运行时间 \t剩余时间 \t状态");
System.out.println(" "+q.getIDname()+"\t"+q.getPR()+"\t"+q.getCPUTIME()+"\t"+q.getLASTTIME()+"\t"+q.getSTATE());
}
}
System.out.println("最后完成的顺序:");
System.out.println("进程名\t优先级\t运行时间 \t剩余时间 \t状态");
for(process q:temp)
System.out.println(" "+q.getIDname()+"\t"+q.getPR()+"\t"+q.getCPUTIME()+"\t"+q.getLASTTIME()+"\t"+q.getSTATE());
}
public static int getID(ArrayList<process> list){ //动态比较优先级,每当一个进程运行完后,就重新比较所有进程的优先级
int size=list.size(); //size为数组内剩余元素
int id=0; //id初值为0,即第一个进程
int p=list.get(0).getPR();//这里是获取list中的第一条数据,并获得优先级数,且赋值给p
for(int i=1;i<size;i++)
{
if(list.get(i).getPR()>p) //依次比较优先级数大小
{
p=list.get(i).getPR(); //优先级大的重新赋值
id=i; //更改进程号
}
}
return id;
}
}
如有不对,欢迎指出。