操作系统之多道系统作业调度实验(FCFS,SJF,HRRF算法)

本次实验为多道系统作业调度实验,包括了FCFS,SJF,HRRF算法

下面是运行结果:

代码如下:

//zhouzi
import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Queue;

public class Run {
    public static void main(String[] args) {
        arithmetic a=new arithmetic();
        a.FCFS();
        System.out.println();
        a.SJF();
        System.out.println();
        a.HRRF();
    }
}

class arithmetic{
    public JCB[] jcbs;
    public int systemMainStore=100;//系统主存
    public int systemResource=4;//系统资源
    Queue<JCB> Ready=new LinkedList<JCB>();//就绪队列
    boolean run=false;
    public JCB jcb=new JCB();
    class JCB{
        StringBuffer name = new StringBuffer("");//作业名
        int enterTime;//进入时间
        int runTime;//运行时间
        int jobTime;//作业调度时间
        int courseTme;//进程调度时间
        int mainStore;//主存需求量
        int resource;//系统资源需求量
        int endTime;//结束时间
        int revolveTime;//周转时间
        double revolvesTime;//带权周转时间
        boolean ready=false;
        boolean wait=false;
        boolean ran=false;
        double hrrf;
    }

    public void run(int i){
            for(int j=0;j<=4;j++)
            {
                if(jcbs[j].enterTime==i&&jcbs[j].wait==false)//查询当前时间是否有作业进入
                {
                    jcbs[j].wait=true;
                }
            }
            for(int j=0;j<=4;j++)
            {
                if(jcbs[j].wait==true&&jcbs[j].mainStore<=systemMainStore&&jcbs[j].resource<=systemResource&&jcbs[j].ready==false)//查询当前作业是否满足进入就绪队列
                {
                    jcbs[j].ready=true;
                    systemMainStore=systemMainStore-jcbs[j].mainStore;
                    systemResource=systemResource-jcbs[j].resource;
                    Ready.add(jcbs[j]);
                    jcbs[j].jobTime=i;
                }
            }

            if(run==false&&Ready!=null&&Ready.peek()!=null){
                jcb=Ready.poll();
                jcb.courseTme=i;
                run=true;
            }

            if(jcb!=null&&i==(jcb.courseTme+jcb.runTime)){
                run=false;
                jcb.endTime=(i);
                systemResource=systemResource+jcb.resource;
                systemMainStore=systemMainStore+jcb.mainStore;

                for(int j=0;j<=4;j++)
                {
                    if(jcbs[j].enterTime==i&&jcbs[j].wait==false)//查询当前时间是否有作业进入
                    {
                        jcbs[j].wait=true;
                    }
                    if(jcbs[j].wait=true&&jcbs[j].mainStore<=systemMainStore&&jcbs[j].resource<=systemResource&&jcbs[j].ready==false)//查询当前作业是否满足进入就绪队列
                    {
                        jcbs[j].ready=true;
                        systemMainStore=systemMainStore-jcbs[j].mainStore;
                        systemResource=systemResource-jcbs[j].resource;
                        Ready.add(jcbs[j]);
                        jcbs[j].jobTime=i;
                    }
                }

                if(run==false&&Ready!=null&&Ready.peek()!=null){
                    jcb=Ready.poll();
                    jcb.courseTme=i;
                    run=true;
                }
            }
    }

    public void FCFS(){
        ready();
        for(int i=0;i<=120;i++)
        {
            run(i);
        }
        sortEnd();
        System.out.println("FCFS调度算法:");
        calculate();
        print();
    }

    public void SJF()
    {
        ready();
        sortRun();

        for(int i=0;i<=120;i++)
        {
            run(i);
        }
        sortEnd();
        System.out.println("SJF调度算法:");
        calculate();
        print();
    }

    public void HRRF(){
        ready();

        for(int i=0;i<=120;i++)
        {
            calculateHRRF(i);
            run(i);
        }
        sortEnd();
        System.out.println("HRRF调度算法:");
        calculate();
        print();
    }


    public void sortRun(){
        JCB J=new JCB();
        for (int i=0;i<5;i++){
            for (int j=i+1;j<5;j++){
                if(jcbs[i].runTime>jcbs[j].runTime){
                    J=jcbs[i];
                    jcbs[i]=jcbs[j];
                    jcbs[j]=J;
                }
            }
        }
    }

    public void sortEnd(){
        JCB J=new JCB();
        for (int i=0;i<5;i++){
            for (int j=i+1;j<5;j++){
                if(jcbs[i].endTime>jcbs[j].endTime){
                    J=jcbs[i];
                    jcbs[i]=jcbs[j];
                    jcbs[j]=J;
                }
            }
        }
    }

    public void sortHRRF(){
        JCB J=new JCB();
        for (int i=0;i<5;i++){
            for (int j=i+1;j<5;j++){
                if(jcbs[i].hrrf<jcbs[j].hrrf){
                    J=jcbs[i];
                    jcbs[i]=jcbs[j];
                    jcbs[j]=J;
                }
            }
        }
    }

    public void print()
    {
        double sumRevolveTime=0;
        double sumRevolvesTime=0;
        System.out.print("作业名称"+"\t");
        System.out.print("进入时间"+"\t");
        System.out.print("运行时间"+"\t");
        System.out.print("作业调度"+"\t");
        System.out.print("进程调度"+"\t");
        System.out.print("结束时间"+"\t");
        System.out.print("周转时间"+"\t");
        System.out.println("带权周转时间"+"\t");
        for(int i=0;i<5;i++) {
            System.out.print(jcbs[i].name + "\t");
            System.out.print(jcbs[i].enterTime + "\t\t");
            System.out.print(jcbs[i].runTime + "\t\t");
            System.out.print(jcbs[i].jobTime + "\t\t");
            System.out.print(jcbs[i].courseTme + "\t\t");
            System.out.print(jcbs[i].endTime + "\t\t");
            System.out.print(jcbs[i].revolveTime + "\t\t");
            sumRevolveTime=sumRevolveTime+jcbs[i].revolveTime;
            System.out.println(String.format("%.2f",jcbs[i].revolvesTime ) + "\t\t");
            sumRevolvesTime=sumRevolvesTime+jcbs[i].revolvesTime;
        }
        System.out.println("作业平均周转时间T = "+sumRevolveTime/5);
        System.out.println("作业平均带权周转时间 = "+String.format("%.2f",sumRevolvesTime/5 ));
    }

    public void calculate()//计算周转时间和带权周转时间
    {
        for(int i=0;i<5;i++) {
            jcbs[i].revolveTime=jcbs[i].endTime-jcbs[i].enterTime;
            jcbs[i].revolvesTime=jcbs[i].revolveTime*1.0/jcbs[i].runTime;
        }
    }

    public void calculateHRRF(int a)//计算响应比
    {
        for (int i=0;i<5;i++){
            if((a-jcbs[i].enterTime)>=0){
                jcbs[i].hrrf=(((a-jcbs[i].enterTime)+jcbs[i].runTime)*1.0/jcbs[i].runTime);
            }else{
                jcbs[i].hrrf=0;
            }
        }
        sortHRRF();
    }

    public void ready(){
        jcb=new JCB();
        jcbs = new JCB[5];
        for(int i = 0;i < 5;i++) {
            jcbs[i] = new JCB();
            jcbs[i].ready=false;
            jcbs[i].wait=false;
        }
        jcbs[0].name.append("JOB1");
        jcbs[0].enterTime=0;
        jcbs[0].runTime=40;
        jcbs[0].mainStore=35;
        jcbs[0].resource=3;
        jcbs[1].name.append("JOB2");
        jcbs[1].enterTime=10;
        jcbs[1].runTime=30;
        jcbs[1].mainStore=70;
        jcbs[1].resource=1;
        jcbs[2].name.append("JOB3");
        jcbs[2].enterTime=15;
        jcbs[2].runTime=20;
        jcbs[2].mainStore=50;
        jcbs[2].resource=3;
        jcbs[3].name.append("JOB4");
        jcbs[3].enterTime=35;
        jcbs[3].runTime=10;
        jcbs[3].mainStore=25;
        jcbs[3].resource=2;
        jcbs[4].name.append("JOB5");
        jcbs[4].enterTime=40;
        jcbs[4].runTime=5;
        jcbs[4].mainStore=20;
        jcbs[4].resource=2;
    }
}

 

  • 2
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
作业调度实验是一种模拟计算机作业调度实验。单道系统指的是只有一个 CPU,只能执行一个作业,一次只能执行一个进程的系统。以下是单道系统作业调度实验的步骤: 1. 定义作业的属性:每个作业都有自己的属性,包括作业名、作业长度、作业提交时间、作业优先级、作业状态等。在实验中,可以使用一个作业控制块(JCB)来存储每个作业的属性。 2. 实现作业调度算法:选择合适的作业调度算法可以提高系统的效率。常用的作业调度算法有先来先服务(FCFS)、短作业优先(SJF)、优先级调度等。在实验中,可以通过编写相应的程序来模拟不同的作业调度算法。 3. 模拟作业执行过程:当一个作业调度到 CPU 上时,需要模拟其执行过程。可以定义一个时间片,并按照时间片的长度来模拟作业的执行情况。在实验中,可以使用一个进程控制块(PCB)来存储每个进程的属性,并根据作业长度、时间片长度等参数来模拟进程的执行过程。 4. 实现作业提交与撤销:在实验中,可以通过输入作业的属性来模拟作业的提交。当一个作业被提交后,可以将其添加到作业队列中,并根据作业调度算法来决定其执行顺序。同时,还需要实现作业的撤销功能,以便在有需要时可以撤销正在执行的作业。 5. 输出作业执行结果:当一个作业执行完成后,需要输出其执行结果。可以输出作业名、执行时间、等待时间、周转时间等指标,以评估作业调度算法的性能。 通过以上步骤,可以模拟单道系统下的作业调度过程,评估不同的作业调度算法,并优化系统的性能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值