操作系统短作业优先(SJF)算法

本文介绍了短作业优先(SJF)调度算法,该算法优先选择运行时间较短的作业进行执行。文章通过Java代码展示了如何模拟SJF算法,包括创建Process类、算法过程分析及完整代码实现与测试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

短作业优先(SJF)算法

SJF概念

以运行作业的时间长短来决定计算的优先级,作业运行时间越短,优先级越高。

SJF算法展示(java)

首先我们先来创建一个Process类来模拟作业

package com.xu.demo.ytu;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Process {
   
   
    //作业名
    private String ProcessName;
    //到达时间
    private int InterTime;
    //运行时间
    private int WorkTime;
    //开始时间
    private int StartTime;
    //完成时间
    private int FinishTime;
    //周转时间
    private int TurnTime;
    //带权周转时间
    private float PowerTurnTime;
    //用于接收用户输入并赋值
    public Process(String processName, int interTime, int workTime) {
   
   
        ProcessName = processName;
        InterTime = interTime;
        WorkTime = workTime;
    }

    @Override
    public String toString() {
   
   
        return
                "作业名:" + ProcessName  +
                "   到达时间:" + InterTime +
                "   运行时间:" + WorkTime +
                "   开始时间:" + StartTime +
                "   完成时间:" + FinishTime +
                "   周转时间:" + TurnTime +
                "   带权周转时间:" + PowerTurnTime
                ;
    }
}

这里我使用了lombk来自动创建有参无参方法(等同于手动生成),toString方法为了显示结果明显我重写了一下,这样作业类就创建完毕

问题分析&创建SJF算法

算法过程分析
  1. 当一组作业进入集合的时候,如果我们要采用SJF算法的时候需要根据他们的进入时间进行排序,无论第一个作业执行时间的长短,第一个到达的永远是被第一个执行的

  2. 当第一个被执行后我们就要选择出下一个被执行的作业

  3. 然后我们根据剩余作业的运行时间进行排序,获得运行时间最短的作业

  4. 当我们和获得了运行时间最短的作业后还需要对运行时间最短的作业进行判断,假定根据运行时间排序后的第一作业是我们要处理的作业,然后我们拿已将执行完的上一个作业的完成时间与当前作业的到达时间做比较,如果上一个作业的完成时间>=当前作业的到达时间,那这个假定是成立的,那这个作业就要被处理。

  5. 如果上一个作业的完成时间<当前作业的到达时间,就说明这个作业还没有到达,就算它的运行时间短,它没到达也不会被执行。假设不成立,继续找第下一个作业,直到找打符合的作业并处理它。

SJF算法
  1. 首先进行初始化,执行第一个作业
 //进行初始化,在这个时候第一个作业无论时间长短都是第一个执行的
    public static Map<String, List<Process>> initSJF(List<Process> list, List<Process> finishList) {
   
   
        //根据进入时间对作业进行排序
        list.sort(new Comparator<Process>() {
   
   
            @Override
            public int compare(Process p1, Process p2) {
   
   
                int num = p1.getInterTime() - p2.getInterTime();
                return num == 0 ? p1.getWorkTime() - p2.getWorkTime() : num;
            }
        });
        //执行第一个作业
        list.get(0).setStartTime(list.get(0).getInterTime());
        list.get(0).setFinishTime(list.get(0).getStartTime() + list.get(0).getWorkTime());
        list.get(0).setTurnTime(list.get(0).getFinishTime() - list.get(0).getInterTime());
       
#include //定义一个结构体 struct sjf{ char name[10]; //进程名 float arrivetime; //到达时间 float servicetime;//服务时间 float starttime; //开始时间 float finishtime;//完成时间 float zztime;//周转时间 float dqzztime;//带权周转 }; //定义一个结构体数组 sjf a[100]; //定义一个输入函数 void input(sjf *p,int N) { int i; printf("intput the process's name & arrivetime & servicetime:\nfor exmple: a 0 100\n"); for(i=0;i<=N-1;i++) { printf("input the %dth process's information:\n",i+1); scanf("%s%f%f",&p[i].name,&p[i].arrivetime,&p[i].servicetime); } } //定义一个输出函数 void Print(sjf *p,float arrivetime,float servicetime,float starttime,float finishtime,float zztime,float dqzztime,int N) { int k; printf("run order:");//执行顺序 printf("%s",p[0].name); for(k=1;k%s",p[k].name); } printf("\nthe process's information:\n"); printf("\nname\tarrive\tservice\tstart\tfinish\tzz\tdqzz\n"); for(k=0;k<=N-1;k++) { printf("%s\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t\n",p[k].name,p[k].arrivetime,p[k].servicetime,p[k].starttime,p[k].finishtime,p[k].zztime,p[k].dqzztime); } } //按到达时间序 void sort(sjf *p,int N) { for(int i=0;i<=N-1;i++) for(int j=0;j<=i;j++) if(p[i].arrivetime<p[j].arrivetime) { sjf temp; temp=p[i]; p[i]=p[j]; p[j]=temp; } } //运行阶段 void deal(sjf *p, float arrivetime,float servicetime,float starttime,float finishtime,float &zztime,float &dqzztime,int N) { int k; for(k=0;k=p[k].arrivetime) { p[k].starttime=p[k-1].finishtime;} else { p[k].starttime =p[k].arrivetime;} p[k].finishtime=p[k].starttime+p[k].servicetime; } } for(k=0;k<=N-1;k++) { p[k].zztime=p[k].finishtime-p[k].arrivetime;//周转时间=完成时间-到达时间 p[k].dqzztime=p[k].zzti
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小徐404

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值