设计一:进程调度
设计内容:
设计程序模拟单处理机系统中的进程调度算法,在短作业优先调度算法、时间片轮转调度、最高优先级优先算法三种算法中选择两种实现。
每个进程由一个进程控制块(PCB)表示。进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等。
进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。进程的到达时间为进程输入的时间。
进程的运行时间以时间片为单位进行计算。
每个进程的状态可以是就绪W(Wait)、运行R(Run)或完成F(Finish)3中状态之一。
以下是最高优先级优先算法思想:
就绪进程获得CPU后都只能运行一个时间片,用已占用CPU时间加1来表示。
如果运行一个时间片后,进程的已占用CPU时间已达到所需要的运行时间,则撤销该进程,如果运行一个时间片后进程的已占用CPU时间还未达到所需要的运行时间,也即进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU。
每进行一次调度程序都打印一次运行进程、就绪队列以及各个进程的PCB,以便进行检查。
重复以上过程,直到所有进程都完成为止。
import java.util.ArrayList;
import java.util.Scanner;
import java.util.Collections;
import java.util.Comparator;
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);
}
}
class shijian{
private int IDname; //进程ID
private int TIME; //到达时间
private int CPUTIME; //进程已运行的时间
private int LASTTIME; //进程还需运行的时间
private String STATE; //进程状态
shijian (int i,int TIME,int CPUTIME,int LASTTIME,String STATE)
{
this.IDname=i; //用this引用成员变量,
this.TIME=TIME; //并将该构造方法所设置的值,
this.CPUTIME=CPUTIME; //赋予成员变量。
this.LASTTIME=LASTTIME;
this.STATE=STATE;
}
public int getIDname() //设置对应的成员变量的方法,
{ //并将变化的值返回。
return IDname;
}
public int getTIME()
{
return TIME;
}
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 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) {
Scanner scanner=new Scanner(System.in);
System.out.println("请选择需要运行的算法:1.优先级算法 2.时间片算法");
int choose=scanner.nextInt();
switch(choose)
{
case 1:you();break;
case 2:shi();break;
default:System.out.println("请重新输入: ");break;
}
}
public static void you() {
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 d=getID(list);
process q=list.get(d);
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(d); //移除该进程号
}
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 d=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(); //优先级大的重新赋值
d=i; //更改进程号
}
}
return d;
}
public static void shi(){
ArrayList<shijian> list=new ArrayList<>();//创建数组列表存放 进程对象
ArrayList<shijian> temp=new ArrayList<>();
list.add( new shijian(0, 0, 0, 8, "W"));//用add方法添加对象加入数组列表中
list.add( new shijian(1, 0, 0, 4, "W" ));
list.add( new shijian(2, 0, 0, 6, "W" ));
list.add( new shijian(3, 0, 0, 2, "W" ));
list.add( new shijian(4, 0, 0,10, "W" ));
Collections.sort(list, new Sort()); //调用排序
//输出当前的进程对象
System.out.println("进程名\t到达时间\t运行时间 \t剩余时间 \t状态");
for(shijian L : list) //for循环的简写
System.out.println(" "+L.getIDname()+"\t"+L.getTIME()+" \t"+L.getCPUTIME()+" \t"+L.getLASTTIME()+" \t"+L.getSTATE());
int id=0;
while (list.size()>0) //size方法是表示数组中有多少个元素
{
shijian 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.getTIME()+"\t"+q.getCPUTIME()+"\t"+q.getLASTTIME()+"\t"+q.getSTATE());
temp.add(new shijian(q.getIDname(),q.getTIME(),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.getTIME()+"\t"+q.getCPUTIME()+"\t"+q.getLASTTIME()+"\t"+q.getSTATE());
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.getTIME()+"\t"+q.getCPUTIME()+"\t"+q.getLASTTIME()+"\t"+q.getSTATE());
}
id++;
if(id>=list.size())
id=0;
}
System.out.println("最后完成的顺序:");
System.out.println("进程名\t到达时间\t运行时间 \t剩余时间 \t状态");
for(shijian q:temp)
System.out.println(" "+q.getIDname()+"\t"+q.getTIME()+"\t"+q.getCPUTIME()+"\t"+q.getLASTTIME()+"\t"+q.getSTATE());
}
}
class Sort implements Comparator { //排序
public int compare(Object o1, Object o2) { //比较到达时间的大小,并排序
shijian s1 = (shijian) o1;
shijian s2 = (shijian) o2;
if (s1.getTIME() > s2.getTIME())
return 1;
return -1;
}
}
如有不对,欢迎指出。