单道批处理模拟作业调度:

模拟作业调度的实现,分别实现

先来先服务(FCFS)、最短作业优先(SJF)、响应比高者优先(HRN)

实现思想:

1) 先来先服务算法:是按照作业进入输入井的先后次序来挑选作业,先进入输入井的作业优先被挑选,当系统中现有的尚未分配的资源不能满足先进入输入井的作业时,那么顺序挑选后面的作业。

2) 最短作业优先算法:在作业到达的情况下,总是按作业要求运行的时间来选择作业,每次挑选要求运行时间短且资源要求能满足的作业先进入主存执行。

3) 当作业执行结束进入完成状态时,做好释放资源等善后工作。

4) 本实验主要模拟作业调度,所以对处理器调度、作业控制过程简化。用输入随机数模拟处理器调度,用输出“用户名、作业名”模拟一个作业已经执行结束。

5) 为作业分配资源可用修改资源分配表来代替。

主程序流程图:

先来先服务算法JAVA实验报告 java先来先服务算法实现_操作系统

先来先服务算法:

流程图:

先来先服务算法JAVA实验报告 java先来先服务算法实现_java_02

关键代码:

public void fcfs()/*先来先服务*/ {    sort();    running();    output();}

短作业优先:

流程图:

先来先服务算法JAVA实验报告 java先来先服务算法实现_先来先服务算法JAVA实验报告_03

关键代码:

public void sjf()/*短作业优先*/ {
    int min;

    sort();
    for (m = 0; m < num; m++) {
        i = 0;
        if (m == 0)
            jk.get(m).finish = jk.get(m).arrivetime + jk.get(m).runtime;
        else
            jk.get(m).finish = jk.get(m - 1).finish + jk.get(m).runtime;
        for (n = m + 1; n < num; n++) {
            if (jk.get(n).arrivetime <= jk.get(m).finish)//判断每次作业完成之后又有多少作业到达
                i++;
        }

        for (k = m + 1; k < i + m; k++)//找出到达后的作业中运行时间最小的作业
        {
            min = k;
            for (int j = k + 1; j < i + m + 1; j++) {

                //printf("%f\n", jk[j].runtime);
                //printf("%f\n", jk[min].runtime);
                if (jk.get(j).runtime < jk.get(min).runtime) {

                    min = j;

                }
            }
            Collections.swap(jk, k, min);

        }
    }
    running();
    output();
}

高响应比优先:

流程图:

先来先服务算法JAVA实验报告 java先来先服务算法实现_算法_04

关键代码:

public void hrrf()/*最高响应比优先*/ {
    int max;

    sort();
    for (m = 0; m < num; m++) {
        i = 0;
        if (m == 0)
            jk.get(m).finish = jk.get(m).arrivetime + jk.get(m).runtime;
        else
            jk.get(m).finish = jk.get(m - 1).finish + jk.get(m).runtime;
        for (n = m + 1; n < num; n++) {
            if (jk.get(n).arrivetime <= jk.get(m).finish)
                i++;
        }

        for (k = m + 1; k < i + m; k++) {
            max = k;
            for (int j = k + 1; j < i + m + 1; j++) {
                // printf("%d\n", i + m + 1);
                if ((jk.get(m).finish - jk.get(max).arrivetime + jk.get(max).runtime) / jk.get(max).runtime <=
                        (jk.get(m).finish - jk.get(j).arrivetime + jk.get(j).runtime) / jk.get(j).runtime)//响应比大的先执行
                {
                    max = j;

                }
            }

            Collections.swap(jk, k, max);

        }

    }
    running();
    output();
}

重复调用的函数:

public void output( ) {
        float numT = 0, numW = 0, avgT = 0, avgW = 0;
        System.out.println("-----------------------------------------------------------------------\n");
        System.out.println(" 作业名  提交时间  运行时间  开始时间  完成时间  周转时间  带权周转时间\n");
        for (i = 0; i < num; i++) {
            System.out.println(jk.get(i).name + "\t\t" + jk.get(i).arrivetime + "\t\t" +
                    jk.get(i).runtime + "\t\t" + jk.get(i).run + "\t\t" + jk.get(i).finish + "\t\t" + jk.get(i).T + "\t\t" + jk.get(i).W);
            System.out.println("\n");
            numT = numT + jk.get(i).T;
            numW = numW + jk.get(i).W;
        }
        System.out.println("-----------------------------------------------------------------------\n");
        avgT = numT / num;
        avgW = numW / num;
        System.out.println("平均作业周转时间:" + avgT);
        System.out.println("\n");
        System.out.println("平均带权作业周转时间:" + avgW);
        System.out.println("\n");
    }

   public void sort() {
        int i, j;
        for (j = 0; j < num; j++) {
            for (i = 0; i < num - j - 1; i++) {
                if (jk.get(i).arrivetime > jk.get(i + 1).arrivetime) {
                    Collections.swap(jk, i, i + 1);
}
            }
        }
    }
    
    public void running() {
        for (k = 0; k < num; k++) {
            if (k == 0)/*运行第一个作业*/ {
                jk.get(k).run = jk.get(k).arrivetime;
                jk.get(k).finish = jk.get(k).run + jk.get(k).runtime;
            } else {
                if (jk.get(k).arrivetime >= jk.get(k - 1).finish)/*当前作业已经结束,下一个作业还没有到达或者刚好到达*/ {
                    jk.get(k).run = jk.get(k).arrivetime;
                    jk.get(k).finish = jk.get(k).run + jk.get(k).runtime;
                } else/*当前作业未完成,下一个作业已到达*/ {
                    jk.get(k).run = jk.get(k - 1).finish;
                    jk.get(k).finish = jk.get(k).run + jk.get(k).runtime;
                }
            }
    
        }
        for (k = 0; k < num; k++) {
            jk.get(k).T = jk.get(k).finish - jk.get(k).arrivetime;
            jk.get(k).W = jk.get(k).T / jk.get(k).runtime;
        }
    }