从输入井中选择作业读入内存,使其获得处理器,得到运行的机会,即为作业调度。输入井中的作业用“作业控制块”(JCB)标识,为了进行作业调度,将作业控制块组成一个队列,这个队列称为后备队列。
模拟实验中没有实际作业,作业控制块中的信息内容只使用了模拟实验中需要的数据。作业控制块中包括作业名、作业大小、所需打印机台数、所需磁带机数量、作业估计执行时间、作业等待时间、指向下一个作业控制块的指针等内容。将作业控制块组成一个队列,实验中采用动态链表的方式模拟作业的后备队列。作业控制块采用结构型数据模拟。
模拟实验中,主存采用可移动的可变分区管理方法,即只要主存空闲区总和比作业大就可以满足作业对主存的需求。对打印机和磁带机这两种独占设备采用静态分配法,即作业执行前必须获得所需资源,并且执行完才归还。
实验中作业的调度采用响应比高者优先算法。响应比为作业的等待时间和作业估计执行时间之比。首先计算出输入井中满足条件的作业的响应比,从中选择响应比最高的一个作业装入主存储器,分配资源。由于是模拟实验,可将作业控制块出队装入主存储器的工作用输出作业名模拟,同时修改系统的资源数量。
package OS;
import java.util.Arrays;
import java.util.Scanner;
public class ProcessSchAlg {
public static void main(String[] args) {
Scanner scn = new Scanner(System.in);
int num=Integer.valueOf(scn.nextLine());
String initMessage[]=new String[num];
for(int i=0;i<initMessage.length;i++) initMessage[i]=scn.nextLine();
List Queue=new List(initMessage);
Queue.show(0);
for(int i=0;i<num;i++) Queue.show(deal(Queue.getProcess()));
}
public static int deal(Process p){
if(p.large>5){
System.out.println("The RAM is not enough,Process "+p.name+" require failed!!!");
return 0;
}
if(p.printer>5){
System.out.println("The printer is not enough,Process "+p.name+" require failed!!!");
return 0;
}
if(p.tape>5){
System.out.println("The tape is not enough,Process "+p.name+" require failed!!!");
return 0;
}
System.out.println("Process "+p.name+" is under operating...");
System.out.println("Process "+p.name+" operated successfully!");
return p.needTime;
}
}
class List{
Process head;
Process tail;
public List(){
head=null;
tail=null;
}
public List(String[] initMessage){
head=null;
tail=null;
for(int i=0;i<initMessage.length;i++) {
Process temp =new Process(initMessage[i]);
insert(temp);
}
}
public void insert(Process temp){
if(head==null){
head=temp;
head.next=tail;
}
else if(head.next==null){
tail=temp;
head.next=tail;
}
else {
tail.next=temp;
tail=tail.next;
}
}
public Process getProcess(){
double[] lev= new double[10];
int index=0;
Process p=head;
while(p!=null){
lev[index]=p.level;
index++;
p=p.next;
}
Arrays.sort(lev);
p=head;
if(p==null)return null;
else{
if(p.next==null){
Process t=new Process();
t=head;
head=null;
return t;
}
else{
Process q=head;
if(p.level==lev[9]){
Process t=new Process();
t=head;
head=head.next;
return t;
}
p=p.next;
while(p!=null){
if(p.level==lev[9]){
q.next=p.next;
return p;
}
}
}
}
return null;
}
public void show(int time){
Process p=head;
if(p==null) System.out.println("Operate Over!");
else {
System.out.println("name "+"l\t"+"p\t"+"t\t"+"nT\t"+"wT\t"+"lev");
while (p != null) {
p.waitTime+=time;
p.print();
p = p.next;
}
System.out.println();
}
}
}
class Process{
String name;
int large;
int printer;
int tape;
int needTime;
int waitTime;
double level;
Process next;
public Process(){}
public Process(String s) {
int[] num= new int[4];
int index=0;
for(int i=0;i<s.length();i++){
if(s.charAt(i)==' ') {
num[index]=i;
index++;
}
}
this.name=s.substring(0,num[0]);
this.large=Integer.valueOf(s.substring(num[0]+1,num[1]));
this.printer=Integer.valueOf(s.substring(num[1]+1,num[2]));
this.tape=Integer.valueOf(s.substring(num[2]+1,num[3]));
this.needTime=Integer.valueOf(s.substring(num[3]+1));
}
public void print(){
level=1+((1.0*waitTime)/needTime);
System.out.print(name+"\t"+large+"\t"+printer+"\t"+tape+"\t"+needTime+"\t"+waitTime+"\t");
System.out.printf("%.2f",level);
System.out.println();
}
}
运行结果示范: