操作系统:高响应比优先调度算法(HRRN)Java代码实现

本文介绍了高响应比优先调度(HRRN)算法,它是FCFS和SJF的折衷方案,着重于平衡作业等待时间和运行时间。通过代码实例演示了如何运用HRRN进行进程调度,包括输入进程、优先级计算和调度流程。最终展示了调度前后作业的状态变化。
摘要由CSDN通过智能技术生成

一、算法思想:

        高响应比优先调度算法(HRRN)是一种对CPU响应比的分配的一种算法。HRRN是介于FCFS(先来先服务算法)与SJF(短作业优先算法)之间的折中算法,既考虑作业等待时间又考虑作业运行时间,既照顾短作业又不使长作业等待时间过长,改进了调度性能。

 二、实现代码:

package Package8;

import java.util.Scanner;

/**
 * 高响应比优先调度
 */
public class HRRN {

    public static void main(String[] args) {

        PCB[] a = new PCB[10];

        // input方法用于输入进程信息,返回输入进程的总数
        int k = input(a);

        // 输出初始作业状态
        System.out.println("初始作业状态:");
        // 遍历输出数组
        output(a, k);


        // 找出最早到达的进程,优先调度
        PCB min = new PCB();
        min = a[0];
        int m = 0; // 用于记录最早到达进程的id(下标)
        for (int i = 0; i < k; i++) {

            if (a[i].getArriveTime() < min.getArriveTime()){
                min = a[i];
                m = i;
            } else if(a[i].getArriveTime() == min.getArriveTime() && a[i].getServiceTime() < min.getServiceTime()){
                min = a[i];
                m = i;
            }
        }
        PCB temp;
        temp = a[0];
        a[0] = min;
        a[m] = temp;


        System.out.println("调度过程:");
        // currentTime 用于记录当前时间(最后一个已经调度的作业的完成时间)
        double currentTime = 0;
        // 当该进程最早到达时,直接调度
        a[0].setCondition(1); // 调度进程,将进程状态改为运行
        a[0].setFinishTime(a[0].getArriveTime() + a[0].getServiceTime());
        a[0].setCyclingTime(a[0].getFinishTime() - a[0].getArriveTime());
        // 将结果保留两位小数
        double time = a[0].getCyclingTime() / a[0].getServiceTime();
        a[0].setFloat_Wi(Double.parseDouble(String .format("%.2f", time)));
        output(a,k); // 遍历数组
        a[0].setCondition(2); // 进程调度完毕,将进程状态改为完成
        // 记录当前时间
        currentTime = a[0].getFinishTime();

        for (int i = 1; i < k; i++) {
            for (int j = i; j < k; j++) {

                    if (currentTime - a[j].getArriveTime() < 0){
                        a[j].setWaitTime(0);
                    } else {
                        a[j].setWaitTime(currentTime - a[j].getArriveTime());
                    }
                    a[j].setDibs((a[j].getWaitTime()/a[j].getServiceTime()) + 1);

            }


            // 找出优先权最大的进程,放到第i个位置,直接调度
            PCB max;
            max = a[0]; // a[0]的优先级默认为0
            int n = 0; // 用于当前优先权最大进程的id(下标)
            for (int x = i; x < k; x++) {
                if (a[x].getDibs() > max.getDibs()){
                    max = a[x];
                    n = x;
                } else if (a[x].getDibs() == max.getDibs() && a[x].getArriveTime() < max.getArriveTime()){
                    max = a[x];
                    n = x;
                }
            }
            temp = a[i];
            a[i] = max;
            a[n] = temp;

            // 调度第i个进程
            a[i].setCondition(1);
            output(a,k);
            if (a[i].getArriveTime() > a[i - 1].getFinishTime()){
                a[i].setFinishTime(a[i].getArriveTime() + a[i].getServiceTime());

            } else{

                a[i].setFinishTime(a[i - 1].getFinishTime() + a[i].getServiceTime());
            }
            a[i].setCyclingTime(a[i].getFinishTime() - a[i].getArriveTime());

            // 将结果保留两位小数
            time = a[i].getCyclingTime() / a[i].getServiceTime();
            a[i].setFloat_Wi(Double.parseDouble(String .format("%.2f", time)));
            a[i].setCondition(2);
            // 记录当前时间
            currentTime = a[i].getFinishTime();


        // 一轮循环结束,进入下一轮循环
        }

        // 遍历输出数组
        System.out.println("调度后作业状态:");
        output(a, k);

    }

    /**
     * 该方法用于遍历输出数组
     * @param a
     * @param k
     */
    public static void output(PCB[] a, int k){
        for (int i = 0; i < k; i++) {
            System.out.println(a[i]);
            if (i == k - 1){
                System.out.println();
            }
        }
    }

    /**
     * 该方法用于输入进程信息
     * @param a
     * @return 输入进程的个数
     */
    public static int input(PCB[] a){

        Scanner scanner = new Scanner(System.in);

        int k = 0; // 初始化,k记录总进程数
        System.out.println("请一次输入两个整数,之间用空格隔开,输入负数结束输入");

        // 重复输入进程信息
        while (true){
            System.out.printf("请输入第%d进程到达时间、服务时间:", k);
            // 将进程id设置为k
            double arriveTime = scanner.nextDouble();
            if (arriveTime < 0){
                System.out.println("输入结束");
                break;
            }
            double serviceTime = scanner.nextDouble();
            a[k] = new PCB(k,arriveTime, serviceTime); // 利用构造方法初始化数据
            k ++;
            if (serviceTime < 0){
                System.out.println("输入结束");
                break;
            }
        }
        scanner.close(); // 释放scanner

        return k;
    }


    public static class PCB implements Package8.PCB {

        private int id;
        private double arriveTime; // 到达时间
        private double serviceTime; // 服务时间
        private double finishTime; // 完成时间
        private double cyclingTime; // 周转时间
        private double float_Wi; // 带权周转时间
        private double waitTime; // 等待时间
        private double dibs; // 优先权
        private int condition; // 进程状态,0表示等待,1表示运行,2表示完成

        public int getCondition() {
            return condition;
        }

        public void setCondition(int condition) {
            this.condition = condition;
        }

        public double getWaitTime() {
            return waitTime;
        }

        public void setWaitTime(double waitTime) {
            this.waitTime = waitTime;
        }

        public double getDibs() {
            return dibs;
        }

        public void setDibs(double dibs) {
            this.dibs = dibs;
        }

        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        }

        public double getArriveTime() {
            return arriveTime;
        }

        public void setArriveTime(double arriveTime) {
            this.arriveTime = arriveTime;
        }

        public double getServiceTime() {
            return serviceTime;
        }

        public void setServiceTime(double serviceTime) {
            this.serviceTime = serviceTime;
        }

        public double getFinishTime() {
            return finishTime;
        }

        public void setFinishTime(double finishTime) {
            this.finishTime = finishTime;
        }

        public double getCyclingTime() {
            return cyclingTime;
        }

        public void setCyclingTime(double cyclingTime) {
            this.cyclingTime = cyclingTime;
        }

        public double getFloat_Wi() {
            return float_Wi;
        }

        public void setFloat_Wi(double float_Wi) {
            this.float_Wi = float_Wi;
        }

        public PCB() {
        }

        public PCB(int id, double arriveTime, double serviceTime) {
            this.id = id;
            this.arriveTime = arriveTime;
            this.serviceTime = serviceTime;
        }

        @Override
        public String toString() {
            String condition1;
            if (condition == 2){
                condition1 = "完成";
                return "进程信息:" +
                        "id=" + id +
                        ", 到达时间=" + arriveTime +
                        ", 服务时间=" + serviceTime +
                        ", 完成时间=" + finishTime +
                        ", 周转时间=" + cyclingTime +
                        ", 带权周转时间=" + float_Wi +
                        ", 进程状态:" + condition1;
            } else {
                if (condition == 1){
                    condition1 = "运行";
                } else {
                    condition1 = "等待";
                }

                return "进程信息:" +
                        "id=" + id +
                        ", 到达时间=" + arriveTime +
                        ", 服务时间=" + serviceTime +
                        ", 完成时间=" + finishTime +
                        ", 周转时间=" + cyclingTime +
                        ", 带权周转时间=" + float_Wi +
                        ", 进程状态:" + condition1 +
                        ", 进程优先权:" + dibs;
            }
        }

    }
}

三、运行结果: 

 

 

实验一 批处理系统的作业调度 1.实验目的 加深对作业概念的理解; 深入了解批处理系统如何组织作业、管理作业和调度作业; 2.实验预备知识 作业的概念; 作业的创建; 作业的调度。 3.实验内容 编写程序完成批处理系统中的作业调度,要求采用响应比高者优先的作业调度算法。实验具体包括:首先确定作业控制块的内容,作业控制块的组成方式;然后完成作业调度;最后编写主函数对所作工作进程测试。 4.提示与讲解 操作系统根据允许并行工作的道数和一定的算法从系统中选取若干作业把它们装入主存储器,使它们有机会获得处理器运行,这项工作被称为“作业调度”。实现这部分功能的程序就是“作业调度程序”。 作业调度的实现主要有两个问题,一个是如何将系统中的作业组织起来;另一个是如何进行作业调度。 为了将系统中的作业组织起来,需要为每个进入系统的作业建立档案以记录和作业相关的信息,例如作业名、作业所需资源、作业执行时间、作业进入系统的时间、作业信息在存储器中的位置、指向下一个作业控制块的指针等信息。这个记录作业相关信息的数据块称为作业控制块(JCB),并将系统中等待作业调度的作业控制块组织成一个队列,这个队列称为后备队列。一个作业全部信息进入系统后,就为其建立作业控制块,并挂入后备队列。当进行作业调度时,从后备队列中查找选择作业。 由于实验中没有实际作业,作业控制块中的信息内容只使用了实验中需要的数据。作业控制块中首先应该包括作业名;其次是作业所需资源,根据需要,实验中只包括需要主存的大小(采用可移动的动态分区方式管理主存,作业大小就是需要主存的大小)、需要打印机的数量和需要磁带机的数量;采用响应比作业调度算法,为了计算响应比,还需要有作业的估计执行时间、作业在系统中的等待时间;另外,指向下一个作业控制块的指针必不可少。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值