【操作系统-18】SJF短作业优先算法

SJF算法(Shortest Job First)

定义

SJF(最短作业优先)是一种调度算法,执行时间最短的作业(任务)优先执行。它有两种形式:

  • 非抢占式SJF:一旦任务开始执行,就一直执行直到完成,不会被其他任务打断。
  • 抢占式SJF(也叫 SRTF,Shortest Remaining Time First):如果新的任务的剩余时间比当前正在执行的任务还短,当前任务会被中断,新的任务会先执行。

SJF的核心思想是 优先执行运行时间短的任务,这样可以减少任务的等待时间和系统的平均周转时间。

特点
  • 非抢占式:任务一旦开始执行,不会被中断,直到完成。
  • 效率较高:最短作业优先能够最小化平均等待时间(在理想情况下)。
  • 难以实现:在实际应用中,很难准确知道每个任务的执行时间,因此需要事先估算或假设任务的执行时间。
优缺点
  • 优点

    • 最小化平均等待时间:由于短任务会先执行,减少了长任务对短任务的延迟,使得平均等待时间相对较低。
    • 提高系统吞吐量:短任务优先执行,提高了系统的整体吞吐量。
  • 缺点

    • 难以预知任务执行时间:在实际应用中,往往很难准确预测任务的执行时间。
    • 可能导致长任务饥饿:长任务可能长时间无法执行,因为系统会优先处理短任务,导致长任务的等待时间过长(即“饥饿现象”)。
    • 不适合动态任务负载:如果任务的执行时间不是预先已知的,SJF 的效果可能会较差。
适用场景

适用于任务执行时间已知或能大致预测的系统,例如批处理系统或者任务执行时间固定的环境。但在动态负载下,使用SJF可能会存在困难。


SJF算法例题

假设有4个任务,它们的到达时间和服务时间(执行时间)如下:

任务到达时间 (Arrival Time)服务时间 (Burst Time)
P106
P218
P327
P433
步骤 1:按服务时间(Burst Time)排序

由于SJF优先执行服务时间(执行时间)最短的任务,因此我们首先需要确定任务的执行顺序。假设所有任务都在同一时刻到达并开始排队,首先会选择服务时间最短的任务执行。

  • 到达时间和服务时间的关系
    • P1 到达时没有其他任务,服务时间为 6。
    • P2 在 P1 执行时到达,服务时间为 8。
    • P3 在 P1 执行时到达,服务时间为 7。
    • P4 在 P1 执行时到达,服务时间为 3。

执行顺序根据任务的服务时间从短到长为:P4 → P1 → P3 → P2

步骤 2:计算完成时间、周转时间和等待时间
  1. P4:到达时间为 3,执行时间为 3。完成时间 = 3 + 3 = 6
  2. P1:到达时间为 0,执行时间为 6。完成时间 = 6 + 6 = 12
  3. P3:到达时间为 2,执行时间为 7。完成时间 = 12 + 7 = 19
  4. P2:到达时间为 1,执行时间为 8。完成时间 = 19 + 8 = 27
步骤 3:计算周转时间 (Turnaround Time) 和等待时间 (Waiting Time)
  • P4
    • 周转时间 = 完成时间 - 到达时间 = 6 - 3 = 3
    • 等待时间 = 周转时间 - 服务时间 = 3 - 3 = 0
  • P1
    • 周转时间 = 完成时间 - 到达时间 = 12 - 0 = 12
    • 等待时间 = 周转时间 - 服务时间 = 12 - 6 = 6
  • P3
    • 周转时间 = 完成时间 - 到达时间 = 19 - 2 = 17
    • 等待时间 = 周转时间 - 服务时间 = 17 - 7 = 10
  • P2
    • 周转时间 = 完成时间 - 到达时间 = 27 - 1 = 26
    • 等待时间 = 周转时间 - 服务时间 = 26 - 8 = 18
总结表格
任务到达时间服务时间完成时间周转时间等待时间
P433630
P10612126
P327191710
P218272618
平均等待时间

平均等待时间=0+6+10+184=8.5\text{平均等待时间} = \frac{0 + 6 + 10 + 18}{4} = 8.5

平均周转时间

平均周转时间=3+12+17+264=14.5\text{平均周转时间} = \frac{3 + 12 + 17 + 26}{4} = 14.5


分析

在这个例子中,SJF算法通过优先执行最短任务来减少了系统的平均等待时间和平均周转时间。具体表现为:

  • P4 是最短任务,首先执行,减少了后续任务的等待时间。
  • 长任务的等待时间较长:例如,P2 是服务时间最长的任务,它的等待时间(18)和周转时间(26)相对较长,反映了 “饥饿”现象,即长任务由于总是被短任务阻塞,导致它们的执行被推迟。

SJF的优缺点也可以从这个例子中看出:

  • 优点:最小化了平均等待时间和平均周转时间,优化了系统的性能。
  • 缺点:长任务的等待时间较长,可能会导致“饥饿”现象,影响系统的公平性。

总结:

SJF 算法通过优先执行短任务减少了等待时间,但在实际应用中,由于任务的执行时间通常难以预知,使用 SJF 可能会遇到困难。为了避免长任务饥饿,可以采用 带优先级调度多级反馈队列 等更复杂的调度策略。

#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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值