文章目录
设计一个按照优先级调度算法实现处理机调度的程序
一、优先级调度算法实现处理机调度的程序设计提示如下:
( 1 ) 假设系统有n个进程,每个进程用一个进程控制块(PCB)来代表。进程控制块的格式如下表所示,且参数意义也相同。进程的优先数、到达时间和估计运行时间由用户程序任意设定,且优先数越低,优先级越高。调度时,总是选择优先级最高的进程运行。
(2)为了调度方便,设计一个指针指向就绪队列的第一个到达进程。另外再设一个当前运行进程指针,指向当前正运行的进程。
(3)处理机调度时,总是选择已经到达队列的优先级最高的进程运行。为了采用动态优先级调度,进程每运行一次,其优先级就减1。
(4)由于本题目是模拟实验,所以对被选中的进程并不实际启动运行,而只是执行如下操作:
1)优先数加1;
2)估计运行时间减1;
3)输出当前运行进程的名字。
用这三个操作来模拟进程的一次运行。
(5)进程运行一次后,应判断该进程的剩余运行时间是否为0,若不为0,且其优先级低于就绪队列的其他进程的优先级,则选择一个高优先级进程抢占CPU运行,若该进程的剩余运行时间为0,则将该进程的状态置为完成状态“C”,并撤出就绪队列。
(6)若就绪队列不为空,则重复上述的步骤(4)和(5)直到所有进程都运行完为止。
(7)在所设计的调度程序中,应包含显示或打印语句,以便显示或打印每次选中进程的名称及运行一次后进程的变化以及就绪队列中各进程排队情况。
二、程序中使用的数据结构及主要符号说明
模拟PCB进程控制块设置了如上数据结构,其中name是进程名,arrivalTime是到达时间,priorityNum是优先级数,runTime是运行时间,status是进程状态。
其中:
name为用户程序自定义的
priorityNum为1~10的随机数
arrivalTime和runTime为1~5的随机数
status的值有三种:Ready,Working,End,分别代表就绪状态,运行状态和终止状态。
三、程序流程图
四、参考代码
PCB类:
package pcb;
public class PCB {
private String name;//进程名字
private int arrivalTime;//到达时间,1~5的随机数
private int priorityNum;//优先级,1~10的随机数
private int runTime;//运行时间,1~5的随机数
private String status = "Ready";//进程状态
public PCB(String name) {
super();
this.name = name;
this.setArrivalTime(arrivalTime);
this.setPriorityNum(priorityNum);
this.setRunTime(runTime);
//this.printInformation();
}
//打印PCB信息
public void printInformation() {
System.out.println(this.getName()+"\t"+this.getArrivalTime()+"\t"+
this.getRunTime()+"\t"+this.getPriorityNum()+"\t"+this.getStatus());
}
// public PCB(String name, int arrivalTime, int priorityNum, int runTime) {
// super();
// this.name = name;
// this.arrivalTime = arrivalTime;
// this.priorityNum = priorityNum;
// this.runTime = runTime;
// this.printInformation();
//}
//进程运行
public void run() {
this.priorityNum++;
this