Java操作系统进程调度算法——时间片轮转(RR)算法
文章目录
前言
一、算法思想
按进程到达顺序将进程依次加入就绪队列当中,然后将 CPU 分配给位于队首的进程,确定一个时间片,让该进程执行一个时间片。当该进程执行时间到时,该进程可能已经执行完毕(可能在时间片未到时就以及执行完毕),或者未执行完毕,如果是前者只需将进程弹出队列即可,如果是后者则将该进程加入队尾,并将 CPU 分配给新的队首进程,如此循环。
二、数据结构
1.定义PCB进程控制块
String name; //进程名
double AT; //到达时间
double RT; //需要运行时间
int CPUT=0; //已用CPU时间
char State; //进程状态
2.实现思路
(1)初始化进程控制块、各个队列。
(2)判断就绪队列是否为空;若不空,则就绪队列中首进程开始执行。
(3)设置时间片;时间片到,将运行进程已占用时间片+1。
(4)在该时间片内进程执行完毕,这种情况调度程序将立即把该进程弹出队列,并把 CPU 分配给新的队首进程。
(5)在该时间片内进程未执行完毕,调度程序将立即中断该进程执行,把该进程加入队尾,并将 CPU 分配给新的队首进程。
周转时间 = 进程完成时间 - 进程到达时间
带权周转时间 = 进程周转时间 / 进程实际运行时间
平均周转时间 = (进程1周转时间 + … + 进程n周转时间)/ n
平均带权周转时间 = (进程1带权周转时间 + … + 进程n带权周转时间)/ n
三、流程图
四、完整代码
import java.util.Scanner;
//private static void OS_HPF(HPF[] p)
class PCB{
//进程的pcb
String name; //进程名
double AT; //到达时间
double RT; //需要运行时间
int CPUT=0; //已用CPU时间
char State; //进程状态
PCB(){
}
PCB(String a,double b,double c){
name=a;
AT=b;
RT=c;
}
}
class Queue{
//队列
int a[]=new int[1000];
int F=0;
int L=0;
void come(int num){
if(L>=999)
System.out.println("队满");
a[L]=num;
L++;
}
void out(){
if(F>L)
System.out.println("队空");
F++;
}
int isexit() {
if(L>F)
return 1;
else
return 0;
}
}
class RR{
String name; //进程名
double AT; //到达时间
double RT; //需要运行时间
double Attime;
double AQttime;
public RR(){
}
public RR(String name,