深入理解 操作系统 SJF算法(以洛谷P1223题为例)
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题为例)相关推荐
- 深入理解 操作系统 LRU算法(以洛谷P1540题为例)
LRU算法 LeastRecentlyUsedLeast Recently UsedLeastRecentlyUsed 算法,意为"最近最少使用",这是操作系统内存管理部分重要的一 ...
- 通过“FBI树”复习二叉树算法(洛谷P1087题题解,Java语言描述)
题目要求 P1087题目链接 分析 所谓的"FBI树",其实就是一种二叉树,最后的结果也无非就是二叉树的后序遍历序列. 所以,考察的知识点就是--二叉树基本算法的灵活运用. 本题关 ...
- 线性存储的最短平均检索时间(洛谷P1253题题解,Java语言描述)
题目要求 P1253题目链接 分析 很像 ~洛谷P1223题题解~,也是一种类似SJF的贪心法. 排个序,由于两个不大于10000的数,乘起来还是int,就使用int属性吧. 数据量小,所以Scann ...
- 洛谷刷题C语言:LJESTVICA、FUNGHI、LJESNJAK、AUTORI、PLANINA
记录洛谷刷题QAQ [COCI2012-2013#5] LJESTVICA 题目背景 Veronica 在音乐学院上学,她拿到了一张只有音符的乐谱,并且需要识别其所使用的音阶. 题目描述 在这个问题中 ...
- 贪心策略摘果子(洛谷P1478题题解,Java语言描述)
题目要求 P1478题目链接 分析 本题的低配版题目链接 → 题解 那个题就是纯水题没啥可写的,我除了贴代码无话可说,但这题吧,虽然不算难,但也可一说. 建议大家移步这里 → 精辟题解 这位爷写了本题 ...
- 信息学奥赛一本通 1319:【例6.1】排队接水 | 洛谷 P1223 排队接水
[题目链接] ybt 1319:[例6.1]排队接水 洛谷 P1223 排队接水 [题目考点] 1. 贪心 2. 贪心选择性质的证明 要想证明贪心选择可以得到最优解,只需要证明最优解包含每一次的贪心选 ...
- [USACO18JAN]Lifeguards P 洛谷黑题,单调队列优化DP
传送门:戳我 这道题有两个版本,S和P,S是K等于1的情况,显然可以用线段树水过. P版本就难了很多,洛谷黑题(NOI/NOI+/CTSC),嘿嘿. 我自己也不是很理解,照着题解写了一遍,然后悟到了一 ...
- 洛谷刷题C语言:闰年判断、Apples、洛谷团队系统、肥胖问题、三位数排序
记录洛谷刷题QAQ 一.[深基3.例3]闰年判断 题目描述 输入一个年份,判断这一年是否是闰年,如果是输出 111,否则输出 000. 输入格式 输入一个正整数 nnn,表示年份. 输出格式 输出一行 ...
- 2021寒假——洛谷刷题计划(35题)
(希望大家不要Copy) AC:Accept,程序通过. CE:Compile Error,编译错误. PC:Partially Correct,部分正确. WA:Wrong Answer,答案错误. ...
最新文章
- 树莓派的Perl 遨游之旅
- 产品设计认知:如何构建A/B测试系统,其核心功能有哪些?
- Golang 在阿里集团调度集群管理系统 Sigma 中的实践
- 带你从源码了解SpringBoot启动流程
- java href_jnlp href属性中的url参数
- 用python输入名字并打印_python的输出与输入
- Docker实践(五)docker部署MySQL5.7
- mysql 官方docker_用docker安装官方mysql
- SpringBoot+Vue实现前后端分离的实习管理系统
- 图论及其应用 2018年期末考试 答案总结
- java二重积分_用java实现二重积分的计算
- w10计算机,打开win10自带计算器的多种方法
- DSPE磷脂用作药用辅料具有乳化、药物增溶的作用;CAS:1069-79-0
- 用计算机弹出音乐谱,抖音计算器音乐乐谱有哪些?抖音计算器弹奏简谱音乐大全...
- 大屏antdesign走马灯轮播加图形渲染
- Java使用阿里云视频点播
- c语言实现10个数由小到大排序(插入排序法)
- 感恩中国30年,速速来看甲骨文数据库云大会
- html2canvas没有样式,html2canvas没有抓住svg(html2canvas not grabbing svg)
- Hadoop,master和slave简单的分布式搭建