简介
多道程序设计中,经常是若干个进程同时处于就绪状态,为了使系统中的各进程有条不紊地运行,必须选择某种调度策略,以选择一个进程占用处理机。
思路分析
由于本实验是按照处理机调度算法模拟实现处理机的调度,与真正的处理机调度过程不完全相同,比如没有实现中断,进程的运行也不是真正的运行,而是在屏幕上打印其运行时间等。
大致思路:
- 建立三个队列:PCB队列,就绪队列,完成队列。
- PCB队列:保存将进入系统的进程。(由于没有实现中断,所以将进入系统运行的进程必须在程序运行前给出)。
- 就绪队列:到达进程进入系统的时间,将该进程放入就绪队列,等待调度。
- 完成队列:将“运行”完的进程放入完成队列。
- 进程运行过程是在屏幕上打印相关信息。
- 使用轮转算法调度的进程应打印的信息包括:进程占用处理机序列,该进程每次占用处理机的开始时间与结束时间。
- 统计出进程的周转时间T和带权周转时间W。
大致流程图
实现
public class OSRR {
public static void main(String[] args) {
new RR();
}
}
class RR {
private Queue<RRBean> PCBQueue;
private LinkedList<RRBean> ReadyQueue;
private Queue<RRBean> CompleteQueue;
// 定义时间片的长度
private static final int SLICETIME = 4;
// 定义总的运行时间
private int time;
RR() {
time = 0;
InitQueue();
InitBean();
StartProcess();
showResult();
}
private void StartProcess() {
System.out.println("PCB进程数" + PCBQueue.size());
StringBuilder sb = new StringBuilder();
sb.append("运行过程:");
while (true) {
// 是否所有进程运行完
if (PCBQueue.size() == 0 && ReadyQueue.size() == 0) {
// 如果所有进程都运行完了,就终止程序
break;
}
// 是否有新的进程进入系统
for (RRBean r : PCBQueue) {
// 新的进程进入就绪队列
if (r.arrive_time <= time) {
ReadyQueue.addFirst(r);
PCBQueue.remove(r);
break;
}
}
// 就绪队列不为空的时候
if (ReadyQueue.size() != 0) {
// 取出一个进程运行
RRBean r = ReadyQueue.poll();
r.run_time += SLICETIME;
int temp = time;
// 如果时间片用完之后,
if (r.run_time >= r.time) {
time += r.time - r.run_time + SLICETIME;
r.endTime = time;
// 该进程已经完成了
CompleteQueue.offer(r);
} else {
time += SLICETIME;
// 该进程没有完成
ReadyQueue.offer(r);
}
System.out.println("进程号:" + r.id +
",本次开始时间:" + temp + "