三分钟,教你操作系统的任务调度思想(一)

操作系统虚拟化CPU的思想很简单:行一个进程(线程)一段时间,然后运行另一个进程(线程),如此轮换,通过以这种方式时分共享(time sharing) CPU。

核心就是进程(线程)对CPU控制权的切换,决定该切换到哪个进程(线程)的过程就是进程(线程)调度

如何设计高效的调度策略?本篇我们从0到1聊聊 调度的基本思想

设计一个调度策略,我们必须考虑系统的两个指标:

  • 周转时间:任务完成时间 - 任务到达时间
  • 响应时间:任务首次执行时间 - 任务到达时间

接着,我们根据两个指标分别设计可能的方案

考虑周转时间

先进先出方案

先到的任务优先完成。看看如下图

我们考虑周转时间 ,图7.2的平均周转时间计算为 (100 + 110 + 120) / 3,A先执行,严重拖垮了B,C的周转时间

这也是一种典型的护航效应,耗费资源少的任务在耗费资源多的任务后执行。你可以想象在超市排队时,你买了几包零食只要几十秒完成结账,而你的前面有人装满了3辆购物车,花费十几倍的时间结账。你感觉如何😟

其他方案呢?

最短任务优先方案

假设,A,B,C三个任务同时到达。

最短任务优先代表一个总体调度原则,可以应用于所有系统,只要其中平均客户(或在我们案例中的任务)周转时间很重要。如图7.3就是时间短的B,C先执行,A后执行

此时,平均周转时间的计算 (10 + 20 + 120 ) / 3,相比图7.2大幅提高。但是这种假设并不实际,如果B,C任务在A执行中途加入,如下图

遗憾的是,B,C还得等待A完成。。。好像又绕回去了😫😫

抢占式最短作业优先方案

为了避免图7.4的情况,我们假设能否 在B,C到达时,先停止A任务的执行,让B,C先执行完成。如图7.5

关键问题:如何打断A的执行,让B,C执行?抢占式调度

抢占式调度

之前,我们讨论的都是非抢占式调度,这种模型会将每项任务做完,才考虑新的工作。而抢占式调度倾向暂停一项进程,运行新的进程。几乎所有的现代操作系统都是 抢占式调度的。

结合抢占式调度,一个抢占式最短作业优先的模型出来了。

当系统有B,C任务到达时,根据抢占式调度,系统会抢占A。然后判断哪个任务的剩余完成时间最少,就运行那个任务。图7.5的效果就达到了。这样平均周转时间大幅度提高。

缺点

但是以上的几种方案缩减了周转时间,却增加了响应时间

例如,如果 3 个工作同时到达,第三个工作必须等待前两个工作全部运行后才能运行。这种方法虽然有很好的周转时间,但对于响应时间和交互性是相当糟糕的。假设你在终端前输入,不得不等待 10s 才能看到系统的回应,只是因为其他一些工作已经在你之前被调度:你肯定不太开心。

考虑响应时间

响应时间 = 任务首次执行时间 - 任务完成时间

时间片轮转

轮转调度算法可以很好的提高响应时间。

其基本思想很简单:结合时钟中断,任务在一个时间片内执行,每进行一次时钟中断,就判断当前任务时间片是否用完,当时间片用完之后,就会切换下一个任务执行。(一个任务时间片的周期必须是时钟中断时间的倍数)

我们看个例子,当A,B,C任务同时到达,抢占式最短作业优先和时间片轮转的效果分别为左右两图

RR的平均响应时间是:(0 + 1 + 2)/3 = 1; SJF 算法平均响应时间是:(0 + 5 + 10)/ 3 = 5。

可以看出,时间片的长度决定平均响应时间。看起来,时间片越短平均响应时间越短。

但是,时间片太短是有问题的,因为进程调度伴随着上下文切换,其开销是蛮耗时间的,就会导致一个时间片都耗在上下文切换,真正执行任务的时间是很短的。降低了整个系统的性能。

所以,设置合理的时间片也是当务之急。

小结

本篇介绍了调度的基本思想,是深入操作系统进程调度的入门课,并基于响应时间周转时间开发了两类方法:

如果考虑平均周转时间抢占式最短作业优先 能够满足你,通过运行最短的工作,从而优化周转时间。如果你考虑公平性 ,时间片轮转 是你的最佳选择,通过交替运行所有工作,优化响应时间

其实我们还忽略了一些问题,想想最短作业优先,如何确定优先级?也就是操作系统咋知道这个任务到底运行多久?以及操作系统的调度方式如何取舍响应时间和周转时间?

我是爱聊技术的山人,下篇文章为大家揭晓

相关推荐
冰块的旅行40 分钟前
magic-api使用
后端
用户895356032822042 分钟前
Goroutine + Channel 高效在哪?一文吃透 Go 并发底层 G-M-P 调度与实现
后端·go
鸽芷咕44 分钟前
静态住宅 IP 实战测评:手把手教你高效获取全球前沿资讯
后端
西召1 小时前
Spring Kafka 动态消费实现案例
java·后端·kafka
lomocode1 小时前
前端传了个 null,后端直接炸了——防御性编程原来这么重要!
后端·ai编程
镜花水月linyi1 小时前
ThreadLocal 深度解析(上)
java·后端
镜花水月linyi1 小时前
ThreadLocal 深度解析(下)
java·后端
JavaEdge.1 小时前
Spring数据源配置
java·后端·spring
铭毅天下1 小时前
Spring Boot + Easy-ES 3.0 + Easyearch 实战:从 CRUD 到“避坑”指南
java·spring boot·后端·spring·elasticsearch
李慕婉学姐1 小时前
【开题答辩过程】以《基于Springboot的惠美乡村助农系统的设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
java·spring boot·后端