进程调度算法-短作业优先调度算法(SJF)

基本思想

SJF算法是以作业的长度来计算优先级,作业越短,其优先级越高。作业的长短是作业所要求的运行时间来衡量的。

算法性能评价

面向用户
周转时间

从作业被提交给系统开始,到作业完成为止的这段时间间隔(作业在后备队列上等待时间、进程在就绪队列上等待时间、进程在cpu上执行时间、进程阻塞时间)

 1. 周转时间=完成时间-到达时间
 2. 平均周转时间:周转时间/进程数 
 3. 带权周转时间:周转时间/服务时间
 4. 平均带权周转时间:带权周转时间/进程数
响应时间

从用户通过键盘提交一个请求开始,到系统首次产生响应为止的时间,包括键盘输入时间、信息处理时间和信息回送时间。

截止时间

某任务必须开始执行的时间(开始截止时间)和执行完成时间(完成截止时间)

以例题来了解

在这里插入图片描述
系统有如下进程,计算平均周转时间和平均带权周转时间

非抢占式调度

非抢占式调度(Non-preemptiveMode)进程一旦获得处理机,只有在该进程任务完成或因某事件而阻塞时,才让出处理机,决不允许某进程抢占已经分配出去的处理机。

方法
  1. 找出最先到达的进程(该进程的完成时间=到达时间+服务时间);

  2. 根据上一进程的完成时间,找到在这个完成时间内所有到达的进程,并找到这些进程中服务时间最短的那个,然后计算它的完成时间(该进程的完成时间=上一进程的完成时间+该进程服务时间);

  3. 重复2直至完成所有进程的计算。

过程(A-B-D-C)

在这里插入图片描述
甘特图
在这里插入图片描述
平均周转时间:(1+100+99+200)/4=100
平均带权周转时间:(1+1+99+2)/4 =25.75

抢占式调度

抢占式调度(PreemptiveMode)允许调度程序根据某种原则,暂停某个占用处理机的进程,抢占已经分配出去的处理机。抢占的原则有优先权原则、短作业优先原则和时间片原则。

方法
  1. 找出最先到达的进程(该进程的完成时间=到达时间+服务时间)

  2. 根据上一进程的完成时间,找到在这个完成时间内所有到达的进程,并找到这些进程中服务时间最短的那个,在进程运行中,有新到达的进程时,会比较两者的服务时间(该进程剩余的服务时间与新进程的服务时间进行比较,若小则继续运行,若大则暂停进程,新进程运行。

  3. 重复2直至完成所有进程的计算。

过程

甘特图(A-B-D-C)
在这里插入图片描述
平均周转时间:(1+101+1+200)/4=75.75
平均带权周转时间:(1+1+99+2)/4 =1.25

结论

SJF特点是降低了系统平均周转时间。
但对长作业不利,长作业有可能长时间得不到调度。

  • 36
    点赞
  • 221
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
既然你想了解作业优先算法的C语言编程实现,那么我们可以先了解一下这种调度算法的基本思想。作业优先算法又称为SJF算法,它的核心思想是优先调度执行时间的进程。对于所有正在等待处理器的进程,按照它们的执行时间升序进行排序,然后选择执行时间最的进程先被调度执行。这种算法相对其他调度算法来说,它能够有效的缩进程的等待时间,提高系统的响应速度。下面是一个具体实现的C语言代码范例: ```c #include <stdio.h> #include <stdlib.h> #define max 50 struct process { int pid; // 进程ID int burst_time; // 执行时间 int waiting_time; // 等待时间 int turnaround_time; // 周转时间 }; int sjf(struct process p[], int n) { // 作业优先调度算法 int i, j, shortest; float avwt = 0; // 平均等待时间 float avtat = 0; // 平均周转时间 for (i = 0; i < n; i++) { shortest = i; for (j = i + 1; j < n; j++) { if (p[j].burst_time < p[shortest].burst_time) { shortest = j; } } struct process temp = p[i]; p[i] = p[shortest]; p[shortest] = temp; p[i].waiting_time = 0; p[i].turnaround_time = p[i].burst_time; for (j = 0; j < i; j++) { p[i].waiting_time += p[j].burst_time; } avwt += p[i].waiting_time; avtat += p[i].turnaround_time; } printf("\nProcess\tBurst Time\tWaiting Time\tTurnaround Time"); for (i = 0; i < n; i++) { printf("\n%d\t\t%d\t\t%d\t\t%d", p[i].pid, p[i].burst_time, p[i].waiting_time, p[i].turnaround_time); } printf("\n\nAverage waiting time = %f", avwt / n); printf("\nAverage turnaround time = %f", avtat / n); } int main() { struct process p[max]; int n, i; printf("Enter the number of processes: "); scanf("%d", &n); printf("\nEnter the burst time of each process:\n"); for (i = 0; i < n; i++) { printf("Process %d: ", i + 1); p[i].pid = i + 1; scanf("%d", &p[i].burst_time); } sjf(p, n); return 0; } ``` 上述代码中,我们首先定义了一个包含进程ID、执行时间、等待时间、周转时间等信息的结构体`process`,然后定义了一个`sjf`函数,该函数实现了作业优先调度算法,返回平均等待时间和平均周转时间。在`main`函数中,我们首先输入了进程数和每个进程的执行时间,并调用`sjf`函数进行调度。最后输出每个进程的执行时间、等待时间、周转时间,以及平均等待时间和平均周转时间。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值