设计目的:
进程管理是操作系统中的重要功能,用来创建进程、撤消进程、实现进程状态转换,它提供了在可运行的进程之间复用CPU的方法。在进程管理中,进程调度是核心,因为在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态,当就绪进程个数大于处理器数目时,就必须依照某种策略决定哪些进程优先占用处理器。本设计模拟在单处理器情况下的进程调度,目的是加深对进程调度工作的理解,掌握不同调度算法的优缺点。
设计内容:
设计程序模拟单处理机系统中的进程调度算法,在短作业优先调度算法、时间片轮转调度、最高优先级优先算法三种算法中选择两种实现。
每个进程由一个进程控制块(PCB)表示。进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等。
进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。进程的到达时间为进程输入的时间。
进程的运行时间以时间片为单位进行计算。
每个进程的状态可以是就绪W(Wait)、运行R(Run)或完成F(Finish)3中状态之一。
以下是最高优先级优先算法思想:
就绪进程获得CPU后都只能运行一个时间片,用已占用CPU时间加1来表示。
如果运行一个时间片后,进程的已占用CPU时间已达到所需要的运行时间,则撤销该进程,如果运行一个时间片后进程的已占用CPU时间还未达到所需要的运行时间,也即进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU。
每进行一次调度程序都打印一次运行进程、就绪队列以及各个进程的PCB,以便进行检查。
import java.util.Scanner;
import org.omg.CORBA.PUBLIC_MEMBER;
public class PP {
public static void main(String[] args) {
int Num;
int i,j;
int t;
int a,b,c,d;
int o,p,q,r,s;
int NowTime;
int Sum = 0;
Scanner Shu = new Scanner(System.in);
System.out.print("请输入进程数:");
Num = Shu.nextInt();
PCB pcb[] = new PCB[Num];
System.out.println("请依次输入进程名 到达时间 需要运行时间 优先级");
for(i = 0;i < Num;i++){
a = Shu.nextInt();
b = Shu.nextInt();
c = Shu.nextInt();
d = Shu.nextInt();
pcb[i] = new PCB(a,b,c,d);
}
PCB e = new PCB();
e.sort1(pcb,Num);
System.out.println("进程名 到达时间 需要运行时间 优先级"); //输出排序后的进程
for(o=0;o<Num;o++){
System.out.print(" "+pcb[o].Name+" ");
System.out.print(pcb[o].ArrT+" ");
System.out.print(pcb[o].RunT+" ");
System.out.println(pcb[o].Piro);
}
NowTime = pcb[0].ArrT;
e.setCPUTIME(pcb,0);
e.setSTATE(pcb,0,'R');
e.setRunT(pcb, 0);
System.out.println("进程名 到达时间 需要运行时间 已占用CPU时间 进程状态");
System.out.print(" "+pcb[0].Name+" ");
System.out.print(pcb[0].ArrT+" ");
System.out.print(pcb[0].RunT+" ");
System.out.print(pcb[0].CPUTIME+" ");
System.out.println(pcb[0].State);
System.out.println("现在的时间为:"+NowTime);
while(true){
for(i=0;i<Num;i++){
if(pcb[i].State !='F')
break;
}
if(i==Num)
break;
e.sort2(pcb,Num);
e.setPiro(pcb, 0);
e.setCPUTIME(pcb,0);
e.setSTATE(pcb,0,'R');
e.setRunT(pcb, 0);
NowTime++;
for(p = 1;p < Num&&pcb[p].State!='F';p++){
e.setSTATE(pcb,p,'W');
}
for(r = 0;r < Num;r++){
if(pcb[r].RunT == 0){
e.setSTATE(pcb,r,'F');
e.changepiro(pcb, r);
}
}
System.out.println("进程名 到达时间 需要运行时间 已占用CPU时间 进程状态");
for(q = 0;q < Num;q++) {
System.out.print(" "+pcb[q].Name+" ");
System.out.print(pcb[q].ArrT+" ");
System.out.print(pcb[q].RunT+" ");
System.out.print(pcb[q].CPUTIME+" ");
System.out.println(pcb[q].State);
}
System.out.println("现在的时间为:"+NowTime);
}
}
}
class PCB{
int Name; //进程名
int ArrT; //到达时间
int RunT; //需要运行时间
int Piro; //优先级
int CPUTIME=0; //已用CPU时间
char State; //进程状态
PCB(){};
PCB(int a,int b,int c,int d){
Name = a;
ArrT = b;
RunT = c;
Piro = d;
}
void sort1(PCB pcb[],int n){ //排序,先到达的排在前面
PCB t = new PCB();
int i,j;
for(i = 0;i < n-1;i++)
for(j = 0;j < n-1;j++)
if(pcb[j].ArrT > pcb[j+1].ArrT){
t = pcb[j];
pcb[j] = pcb[j+1];
pcb[j+1] = t;
}
}
void sort2(PCB pcb[],int n){ //按照优先级排序
PCB t = new PCB();
int i,j;
for(i = 0;i < n-1;i++)
for(j = 0;j < n-1;j++)
if(pcb[j].Piro < pcb[j+1].Piro){
t = pcb[j];
pcb[j] = pcb[j+1];
pcb[j+1] = t;
}
}
int setCPUTIME(PCB pcb[],int n){
pcb[n].CPUTIME++;
return pcb[n].CPUTIME;
}
int setSTATE(PCB pcb[],int t,char n){
pcb[t].State = n;
return pcb[t].State;
}
int setRunT(PCB pcb[],int n){
pcb[n].RunT = pcb[n].RunT - 1;
return pcb[n].RunT;
}
int setPiro(PCB pcb[],int n){
pcb[n].Piro--;
return pcb[n].Piro--;
}
int changepiro(PCB pcb[],int n){
pcb[n].Piro = -99;
return pcb[n].Piro;
}
}
测试可用。