CPU Scheduling Algorithms

重要的CPU调度算法如下:

  • FCFS Scheduling(First-Come, First-Served)
  • SJF Scheduling(Shortest-Job-First)
    • Non-Preemptive SJF Scheduling
    • Preemptive SJF Scheduling
  • Priority Scheduling
  • RR Scheduling(Round Robin)

FCFS与SJF

这里只说FCFS和SJF。


先到先服务调度:先请求CPU的进程被首先分配到CPU,可采用FIFO队列实现。


Process Burst Time
P1 24
P2 3
P3 3

Suppose that the processes arrive in the order: P1 , P2 , P3 The Gantt Chart for the schedule is:

Waiting time for P1 = 0; P2 = 24; P3 = 27
Average waiting time: (0 + 24 + 27)/3 = 17

FCFS策略的平均等待时间通常相当长。例子中,平均等待时间为17ms。


Suppose that the processes arrive in the order: P2 , P3 , P1 The Gantt chart for the schedule is:

Waiting time for P1 = 6; P2 = 0; P3 = 3
Average waiting time: (6 + 0 + 3)/3 = 3
Convoy effect : short process behind long process.

进程区间变化很大时,平均等待时间也会变化很大。
护航现象(convoy effect):所有其他进程都等待一个大进程释放CPU,导致CPU和设备的使用率变得更低。
FCFS调度算法是非抢占的。一旦CPU被分配给了一个进程,该进程就会保持CPU知道释放CPU为止。


最短作业优先调度:将每个进程与其下一个CPU区间相关联。当CPU为可用时,它会赋给具有最短后续CPU区间的进程。如果两个进程具有同样长度的CPU区间,那么可以使用FCFS调度来处理。


Process Burst Time
P1 6
P2 8
P3 7
P4 3

The Gantt Chart for the schedule is:

Waiting time for P1 = 3; P2 = 16; P3 = 9; P4 = 0
Average waiting time: (3 + 16 + 9 + 0)/4 = 7

如果使用FCFS调度方案,平均等待时间为10.25ms。
可以证明对于给定的一组进程SJF算法的平均等待时间最小。通过将短进程移到长进程之前,短进程等待时间的减少大于长进程等待时间的增加。因而,平均等待时间减少了。

详解SJF

SJF的困难是如何知道下一个CPU请求的长度。
对于长期调度:可以使用用户在提交作业时制定的作业时间极限作为长度,因此,在长期调度中经常使用SJF。
对于短期调度:无法获得下一个CPU区间的长度,因此,只能试图近似SJF调度。


SJF算法可能是抢占的或非抢占的。
当一个新进程到达就绪队列而以前进程正在执行时,就需要选择。新进程与当前运行进程所产生的CPU区间相比,可能有一个更短的下一个CPU区间。
可抢占SJF算法可能会抢占当前运行进程,有时称最短剩余时间优先调度;
非抢占SJF算法会允许当前运行进程先完成其CPU区间。


Process Arrival Time Burst Time
P1 0.0 7
P2 2.0 4
P3 4.0 1
P4 5.0 4

SJF (non-preemptive)


Waiting time for P1 = 0; P2 = 6; P3 = 3; P4 = 7
Average waiting time = (0 + 6 + 3 + 7)/4 = 4


Process Arrival Time Burst Time
P1 0.0 7
P2 2.0 4
P3 4.0 1
P4 5.0 4

SJF (preemptive)

Waiting time for P1 = 9; P2 = 1; P3 = 0; P4 = 2
Average waiting time = (9 + 1 + 0 +2)/4 = 3


洛谷P1223题

题目要求

P1223题目链接

分析

其实本题正是如此,OS难以知道和确定接下来哪个进程剩余时间最短,但这里知道啊!

所谓的“最优策略”,来自于贪心算法,需要先排个序,耗时短的先结束任务可以使得总平均等待时间最短。

AC代码(Java语言描述)

import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;public class Main {private static class Person {Integer time;int id;public Person(int time, int id) {this.time = time;this.id = id;}}public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int num = scanner.nextInt();Person[] array = new Person[num];for (int i = 0; i < num; i++) {array[i] = new Person(scanner.nextInt(), i+1);}scanner.close();Arrays.sort(array, Comparator.comparing(person -> person.time));long waitingTime = 0, sum = 0;StringBuilder result = new StringBuilder();for (Person p : array) {waitingTime += sum;sum += p.time;result.append(p.id).append(" ");}System.out.println(result.toString().trim());System.out.printf("%.2f", waitingTime/(double)num);}
}

总结

FCFS算法和SJF算法是两种重要的算法。FCFS其实基于普通队列即可实现。比起算法本身,更重要的是领会到SJF算法的思想,并能在处理实际问题的时候得以启发,这样就很好啦!

另外,OS 的 SJF CPU调度算法也应该深刻理解,这是涉及计算机原理的重要知识。

希望对不懂SJF算法的读者一些启示,也希望帮助对洛谷P1223题理解不深的读者加深理解。
总之,希望对大家有所帮助!

深入理解 操作系统 SJF算法(以洛谷P1223题为例)相关推荐

  1. 深入理解 操作系统 LRU算法(以洛谷P1540题为例)

    LRU算法 LeastRecentlyUsedLeast Recently UsedLeastRecentlyUsed 算法,意为"最近最少使用",这是操作系统内存管理部分重要的一 ...

  2. 通过“FBI树”复习二叉树算法(洛谷P1087题题解,Java语言描述)

    题目要求 P1087题目链接 分析 所谓的"FBI树",其实就是一种二叉树,最后的结果也无非就是二叉树的后序遍历序列. 所以,考察的知识点就是--二叉树基本算法的灵活运用. 本题关 ...

  3. 线性存储的最短平均检索时间(洛谷P1253题题解,Java语言描述)

    题目要求 P1253题目链接 分析 很像 ~洛谷P1223题题解~,也是一种类似SJF的贪心法. 排个序,由于两个不大于10000的数,乘起来还是int,就使用int属性吧. 数据量小,所以Scann ...

  4. 洛谷刷题C语言:LJESTVICA、FUNGHI、LJESNJAK、AUTORI、PLANINA

    记录洛谷刷题QAQ [COCI2012-2013#5] LJESTVICA 题目背景 Veronica 在音乐学院上学,她拿到了一张只有音符的乐谱,并且需要识别其所使用的音阶. 题目描述 在这个问题中 ...

  5. 贪心策略摘果子(洛谷P1478题题解,Java语言描述)

    题目要求 P1478题目链接 分析 本题的低配版题目链接 → 题解 那个题就是纯水题没啥可写的,我除了贴代码无话可说,但这题吧,虽然不算难,但也可一说. 建议大家移步这里 → 精辟题解 这位爷写了本题 ...

  6. 信息学奥赛一本通 1319:【例6.1】排队接水 | 洛谷 P1223 排队接水

    [题目链接] ybt 1319:[例6.1]排队接水 洛谷 P1223 排队接水 [题目考点] 1. 贪心 2. 贪心选择性质的证明 要想证明贪心选择可以得到最优解,只需要证明最优解包含每一次的贪心选 ...

  7. [USACO18JAN]Lifeguards P 洛谷黑题,单调队列优化DP

    传送门:戳我 这道题有两个版本,S和P,S是K等于1的情况,显然可以用线段树水过. P版本就难了很多,洛谷黑题(NOI/NOI+/CTSC),嘿嘿. 我自己也不是很理解,照着题解写了一遍,然后悟到了一 ...

  8. 洛谷刷题C语言:闰年判断、Apples、洛谷团队系统、肥胖问题、三位数排序

    记录洛谷刷题QAQ 一.[深基3.例3]闰年判断 题目描述 输入一个年份,判断这一年是否是闰年,如果是输出 111,否则输出 000. 输入格式 输入一个正整数 nnn,表示年份. 输出格式 输出一行 ...

  9. 2021寒假——洛谷刷题计划(35题)

    (希望大家不要Copy) AC:Accept,程序通过. CE:Compile Error,编译错误. PC:Partially Correct,部分正确. WA:Wrong Answer,答案错误. ...

最新文章

  1. 树莓派的Perl 遨游之旅
  2. 产品设计认知:如何构建A/B测试系统,其核心功能有哪些?
  3. Golang 在阿里集团调度集群管理系统 Sigma 中的实践
  4. 带你从源码了解SpringBoot启动流程
  5. java href_jnlp href属性中的url参数
  6. 用python输入名字并打印_python的输出与输入
  7. Docker实践(五)docker部署MySQL5.7
  8. mysql 官方docker_用docker安装官方mysql
  9. SpringBoot+Vue实现前后端分离的实习管理系统
  10. 图论及其应用 2018年期末考试 答案总结
  11. java二重积分_用java实现二重积分的计算
  12. w10计算机,打开win10自带计算器的多种方法
  13. DSPE磷脂用作药用辅料具有乳化、药物增溶的作用;CAS:1069-79-0
  14. 用计算机弹出音乐谱,抖音计算器音乐乐谱有哪些?抖音计算器弹奏简谱音乐大全...
  15. 大屏antdesign走马灯轮播加图形渲染
  16. Java使用阿里云视频点播
  17. c语言实现10个数由小到大排序(插入排序法)
  18. 感恩中国30年,速速来看甲骨文数据库云大会
  19. html2canvas没有样式,html2canvas没有抓住svg(html2canvas not grabbing svg)
  20. Hadoop,master和slave简单的分布式搭建

热门文章

  1. Druid学习之路 (四)Druid的数据采集格式
  2. VBS基础篇 - Dictionary对象
  3. Android应用安全开发之浅谈网页打开APP
  4. 取消Win7关机时的补丁更新
  5. python3 shutil模块
  6. 新增或编辑保存时出错后,页面无法再次编辑
  7. CSS 图片上下部与边框有间隙
  8. 怎么在oracle中使用for循环
  9. kylin与superset集成实现数据可视化
  10. adb 静默安装_怎么实现Android APP静默安装