设计一个有 N个进程共享的进程调度程序。
进程调度算法:采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法。每个进程有一个进程控制块( PCB)表示。
进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。
进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。进程的到达时间为进程输入的时间。进程的运行时间以时间片为单位进行计算。
每个进程的状态可以是就绪 W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。
就绪进程获得 CPU后都只能运行一个时间片。用已占用CPU时间加1来表示。
如果运行一个时间片后,进程的已占用 CPU时间已达到所需要的运行时间,则撤消该进程,
如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU。
每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的 PCB,以便进行检查。
代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Main main = new Main();
main.createPCB();
main.dispPCB();
main.running();
}
void createPCB() {
Scanner sc = new Scanner(System.in);
System.out.println("请输入进程的数量:");
int num = sc.nextInt();
for(int i=0; i<num; i++) {
PCB pcb = new PCB();
System.out.println("请输入进程名:");
pcb.name = sc.next();
System.out.println("请输入进程所需运行时间:");
pcb.ntime = sc.nextInt();
insertPCB(pcb);
}
}
void running() {
System.out.println("系统开始运行");
while (!PCB.link.isEmpty()) {
PCB pcbR = PCB.link.getFirst();
PCB.link.remove();
System.out.println("进程:" + pcbR.name + " 正在运行...");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
pcbR.rtime++;
pcbR.priority--;
if (pcbR.rtime == pcbR.ntime) {
deletePCB(pcbR);
} else {
insertPCB(pcbR);
}
}
System.out.println("系统运行结束!!");
}
void insertPCB(PCB pcb) {
int size = PCB.link.size();
if (size == 0) {
PCB.link.add(pcb);
return;
}
for (int idx = 0; idx < size; idx++) {
if (pcb.priority <= PCB.link.get(idx).priority)
continue;
else {
PCB.link.add(idx, pcb);
break;
}
}
if (size == PCB.link.size()) PCB.link.add(pcb);
}
import java.util.LinkedList;
public class PCB {
public String name;
public String state;
public int priority;
public int ntime;
public int rtime;
public static LinkedList<PCB> link = new LinkedList<>();
public PCB() {
this.priority = (int)(Math.random() * 5);
this.rtime = 0;
}
}
void deletePCB(PCB pcb) {
int size = PCB.link.size();
for (int idx=0; idx<size; idx++) {
if (pcb.name.equals(PCB.link.get(idx).name)) PCB.link.remove(idx);
}
}
void dispPCB() {
System.out.println("——————————————————————");
System.out.println("系统中有:");
for (PCB pcb : PCB.link) {
System.out.println("进程:" + pcb.name + " 的优先级为:" + pcb.priority);
}
System.out.println("——————————————————————");
}
}