操作系统高响应比优先调度算法模拟实验

从输入井中选择作业读入内存,使其获得处理器,得到运行的机会,即为作业调度。输入井中的作业用“作业控制块”(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();
    }
}

运行结果示范:

在这里插入图片描述

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值