* 无论是O(1) O(1)O(1)的基于优先级的时间片轮转还是CFS的基于权重的时间配额,均可以既满足优先级的差别服务需求又保证高吞吐率 , 这些都来自于调度器本身而不是依靠频繁的切换 。
* 额外的简单启发式奖惩机制可以让网络IO以及磁盘IO的响应度更高,同时又不影响CPU密集型计算服务的高吞吐 。
上面的第二点是一个额外的辅助,照顾IO过程快速获得响应,这是一个非常棒的辅助,但是注意,再棒的启发式算法也总是辅助性的,提高响应度就是个辅助性的锦上添花的功能 , 以高吞吐为目标才是根本 。
IO过程对于一台Linux服务器而言是与外界交互的唯一渠道 , 通过该渠道可以将处理好的数据送出到网络或者磁盘 , 同时从网络或者磁盘获取新的数据,换句话说,IO过程类似一道门 。但也仅仅是一道门 。
照顾IO过程获得高响应度这件事是为了让门开得更大,通行效率更高!
熟悉Linux内核调度器变迁的都应该知道O(1) O(1)O(1)到CFS过渡的这段历史,即2.6.0内核开始一直到2.6.22为止的这些版本,采用Linux内核划时代的O(1) O(1)O(1)调度器,随后由于两个原因:
1、O(1) O(1)O(1)调度器动态范围太大或者太小 。
2、IO补偿机制不到位,时间片分配不公平 。
为了解决这些问题,Linux内核切换到了CFS调度器 。
切换到了CFS调度器,事实上,人们更多指望的是CFS能够让进程时间片分配更加公平,多个进程运行更加平滑 , 如此一来,上GUI界面的话 , 岂不是就不卡顿了 。
然而还是卡顿 , 本质原因是,场景根本就不对路子 。
在Linux服务器的场景中 , 优先级和时间片是正相关的,无论是O(1) O(1)O(1)调度器的静态线性映射的时间片,还是CFS的动态时间配额,都是优先级越高的进程其每次运行的时间也就越久 , 但是实际上,这两者并不是一回事 。
在更复杂的场景中,正确的做法应该是参考 时间管理的四象限法则 来设计进程调度器 。其中:
* 优先级表示紧急性 。
* 时间片表示重要性 。
于是,如果不是因为Linux服务器场景过于单一简单,CPU的时间管理要复杂得多 , 比如调度器应该按照四象限法则设计成下面的样子:
1、处理重要且紧急事件的进程,需要赋予高优先级分配长时间片去抢占当前进程 。
2、处理重要但是不紧急事件的进程,保持固有优先级分配长时间片就绪等待 。
3、处理不重要但紧急事件的进程,提升优先级但不分配长时间片 , 处理完毕立即返回固有优先级 。
4、既不重要也不紧急的后台进程,低优先级短时间片,系统闲了再调度 。
后面我们会看到,Windows的调度器就是这般设计的 。
我们先总体看看GUI系统的场景 。
它的服务对象是人 , 和Linux的服务场景的行为可预期相反,人的操作是 不可预期 的!
Windows,MacOS/iOS这种Desktop系统的GUI进程,很多时候都是在等待人的进一步操作而睡眠,要么在等鼠标,要么在等键盘,要么在等声卡,显卡的输出 , 或者就是在将用户输入的信息往磁盘里写而等待IO完成,Desktop系统更多关注的是要对以上这些事件提供高效率的响应服务,而不是系统的数据吞吐 。
Desktop在乎的是时延,而不是总吞吐,同时,这个时延还是区分对待的,有些时延的可容忍区间很大,比如网卡(网卡IO之所以优先级提升并不是很多,是因为首先网卡是有队列缓存的,而大多数的报文都是burst而来的 , 队列缓存可以平滑掉首包延迟,其次,由于光速极限,相比于网络延迟,主机调度延迟真的可以忽略不计 。),有些却很小 , 比如键盘鼠标 。所以说 , Windows之类的Desktop系统 必须能够区分一个进程当前的紧急性和重要性 。
推荐阅读
- 如何提升新媒体阅读量,新媒体时代如何有效阅读
- go语言上手快吗的简单介绍
- 更改阿里云服务器系统,更改阿里云服务器系统名称
- 斗鱼直播文字介绍,斗鱼直播介绍怎么写
- python类动态函数名 python 动态变量名
- 用cad做gis图,怎样用gis打开cad图
- 年度电子竞技游戏有哪些,2021年电子竞技
- 冒险解谜游戏有哪些,冒险解谜游戏有哪些恐怖的
- linux中计划任务命令 linux的计划任务