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

2023年 9月 16日 34.5k 0

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

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

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

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

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

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

考虑周转时间

先进先出方案

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

image-20230912234908016.png

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

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

其他方案呢?

最短任务优先方案

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

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

image-20230913004811880.png

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

image-20230913010446211.png

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

抢占式最短作业优先方案

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

image-20230913114230969.png

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

抢占式调度

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

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

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

缺点

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

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

考虑响应时间

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

时间片轮转

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

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

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

image-20230913211545381.png

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

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

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

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

小结

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

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

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

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

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论