现在的 Linux 内核和 Linux 2.6 的内核有多大区别--https://www.zhihu.com/question/35484429

This commit is contained in:
gatieme
2020-07-05 16:22:00 +08:00
parent e89bfcdca7
commit eecdef52aa
2 changed files with 134 additions and 150 deletions
File diff suppressed because it is too large Load Diff
+26 -26
View File
@@ -71,7 +71,7 @@ Linux 除了实现上述策略, 还额外支持以下策略:
**-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*- 正文 -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**
## 1.1 抢占支持(preemption)
# 1.1 抢占支持(preemption)
-------
**2.6 时代开始支持** (首次在2.5.4版本引入[<sup>37</sup>](#refer-anchor-37), 感谢知友 [@costa](https://www.zhihu.com/people/78ceb98e7947731dc06063f682cf9640) 考证! 关于 Linux 版本规则, 可看我文章[<sup>4</sup>](#refer-anchor-4).
@@ -80,17 +80,17 @@ Linux 除了实现上述策略, 还额外支持以下策略:
可抢占性, 对一个系统的调度延时具有重要意义. 2.6 之前, 一个进程进入内核态后, 别的进程无法抢占, 只能等其完成或退出内核态时才能抢占, 这带来严重的延时问题, 2.6 开始支持内核态抢占.
## 1.2 进程调度类
# 1.2 进程调度类
-------
### 1.2.1 普通进程调度器(SCHED\_OTHER)之纠极进化史
## 1.2.1 普通进程调度器(SCHED\_OTHER)之纠极进化史
-------
Linux 一开始, 普通进程和实时进程都是基于优先级的一个调度器, 实时进程支持 100 个优先级, 普通进程是优先级小于实时进程的一个静态优先级, 所有普通进程创建时都是默认此优先级, 但可通过 **nice()** 接口调整动态优先级(共40个). 实时进程的调度器比较简单, 而普通进程的调度器, 则历经变迁[<sup>5</sup>](#refer-anchor-5):
#### 1.2.1.1 O(1) 调度器:
## 1.2.1.1 O(1) 调度器:
-------
2.6 时代开始支持(2002年引入).
@@ -98,7 +98,7 @@ Linux 一开始, 普通进程和实时进程都是基于优先级的一个调度
顾名思义, 此调度器为O(1)时间复杂度. 该调度器修正之前的O(n) 时间复杂度调度器, 以解决扩展性问题. 为每一个动态优先级维护队列, 从而能在常数时间内选举下一个进程来执行.
#### 1.2.1.2 夭折的 RSDL(The Rotating Staircase Deadline Scheduler)调度器
## 1.2.1.2 夭折的 RSDL(The Rotating Staircase Deadline Scheduler)调度器
-------
**2007 年 4 月提出, 预期进入 2.6.22, 后夭折.**
@@ -112,7 +112,7 @@ Con Kolivas (八卦: 这家伙白天是个麻醉医生)为解决这个问题提
#### 1.2.1.3 完全公平的调度器(CFS)
## 1.2.1.3 完全公平的调度器(CFS)
-------
**2.6.23(2007年10月发布)**
@@ -129,7 +129,7 @@ Con Kolivas 的完全公平的想法启发了原 O(1) 调度器作者 Ingo Molna
CFS 的测试性能比 RSDS 好, 并得到更多的开发者支持, 所以它最终替代了 RSDL 在 2.6.23 进入内核, 一直使用到现在. 可以八卦的是, Con Kolivas 因此离开了社区, 不过他本人否认是因为此事而心生龃龉. 后来, 2009 年, 他对越来越庞杂的 CFS 不满意, 认为 CFS 过分注重对大规模机器, 而大部分人都是使用少 CPU 的小机器, 开发了 BFS 调度器[<sup>48</sup>](#refer-anchor-48), 这个在 Android 中有使用, 没进入 Linux 内核.
#### 1.2.1.4 不那么重要的进程 SCHED\_IDLE
## 1.2.1.4 不那么重要的进程 SCHED\_IDLE
-------
**2.6.23(2007年10月发布)**
@@ -166,7 +166,7 @@ SCHED_IDLE 跟 SCHED_BATCH 一样, 是 CFS 中的一个策略, SCHED\_IDLE 的
#### 1.2.1.5 吭哧吭哧跑计算 SCHED\_BATCH
## 1.2.1.5 吭哧吭哧跑计算 SCHED\_BATCH
-------
**2.6.16(2006年3月发布)**
@@ -180,7 +180,7 @@ SCHED_IDLE 跟 SCHED_BATCH 一样, 是 CFS 中的一个策略, SCHED\_IDLE 的
### 1.2.2 十万火急, 限期完成 SCHED\_DEADLINE
## 1.2.2 十万火急, 限期完成 SCHED\_DEADLINE
-------
**3.14(2014年3月发布)**
@@ -195,12 +195,12 @@ SCHED_IDLE 跟 SCHED_BATCH 一样, 是 CFS 中的一个策略, SCHED\_IDLE 的
更多可参看此文章: [Deadline scheduling: coming soon? [LWN.net]](https://link.zhihu.com/?target=https%3A//lwn.net/Articles/575497/)
### 1.2.3 SCHED\_RT
## 1.2.3 SCHED\_RT
-------
### 1.2.4 其他一些调度类的尝试
## 1.2.4 其他一些调度类的尝试
-------
@@ -222,10 +222,10 @@ SCHED_IDLE 跟 SCHED_BATCH 一样, 是 CFS 中的一个策略, SCHED\_IDLE 的
[sched: Add micro quanta scheduling class](https://lkml.org/lkml/2019/9/6/178) 在 RT 之后, CFS 之前实现了一个类似于 RT 的策略, 为在线任务提供服务, 来解决同样的问题.
## 1.3 组调度支持(Group Scheduling)
# 1.3 组调度支持(Group Scheduling)
-------
### 1.3.1 普通进程的组调度支持(Fair Group Scheduling)
## 1.3.1 普通进程的组调度支持(Fair Group Scheduling)
-------
**2.6.24(2008年1月发布)**
@@ -240,7 +240,7 @@ SCHED_IDLE 跟 SCHED_BATCH 一样, 是 CFS 中的一个策略, SCHED\_IDLE 的
该功能是基于控制组(control group, cgroup)的概念, 需要内核开启 CGROUP 的支持才可使用. 关于 CGROUP , 以后可能会写.
### 1.3.2 实时进程的组调度支持(RT Group Scheduling)
## 1.3.2 实时进程的组调度支持(RT Group Scheduling)
-------
@@ -249,7 +249,7 @@ SCHED_IDLE 跟 SCHED_BATCH 一样, 是 CFS 中的一个策略, SCHED\_IDLE 的
该功能同普通进程的组调度功能一样, 只不过是针对实时进程的.
### 1.3.3 组调度带宽控制(CFS bandwidth control)** , **3.2(2012年1月发布)**
## 1.3.3 组调度带宽控制(CFS bandwidth control)** , **3.2(2012年1月发布)**
-------
@@ -257,7 +257,7 @@ SCHED_IDLE 跟 SCHED_BATCH 一样, 是 CFS 中的一个策略, SCHED\_IDLE 的
### 1.3.4 极大提高体验的自动组调度(Auto Group Scheduling)
## 1.3.4 极大提高体验的自动组调度(Auto Group Scheduling)
-------
**2.6.38(2011年3月发布)**
@@ -281,17 +281,17 @@ SCHED_IDLE 跟 SCHED_BATCH 一样, 是 CFS 中的一个策略, SCHED\_IDLE 的
该功能可以手动关闭.
## 1.4 负载跟踪机制
# 1.4 负载跟踪机制
-------
### 1.4.1 PELT
## 1.4.1 PELT
-------
### 1.4.2 WALT
## 1.4.2 WALT
-------
## 1.5 select_task_rq
# 1.5 select_task_rq
-------
调度器最关键的任务就是两个:
@@ -309,16 +309,16 @@ Linux 下各个调度类都实现了这两个接口, 各个调度类按照既定
内核中主体的进程都是以 SCHED_NORMAL 为策略的普通 CFS 进程, 以 select_task_rq_fair 为例, 其代码就经过了不断的重构和优化.
### 1.5.1 机制的 WAKE_AFFINE
## 1.5.1 机制的 WAKE_AFFINE
-------
### 1.5.2 限制遍历的 CPU 数目
## 1.5.2 限制遍历的 CPU 数目
-------
## 1.6 基于调度域的负载均衡
# 1.6 基于调度域的负载均衡
-------
@@ -357,7 +357,7 @@ Linux 下各个调度类都实现了这两个接口, 各个调度类按照既定
## 1.7 更精确的调度时钟(HRTICK), 2.6.25(2008年4月发布)**
# 1.7 更精确的调度时钟(HRTICK), 2.6.25(2008年4月发布)**
-------
@@ -373,7 +373,7 @@ CPU的周期性调度, 和基于时间片的调度, 是要基于时钟中断来
## 1.8 自动 NUMA 均衡(Automatic NUMA balancing)
# 1.8 自动 NUMA 均衡(Automatic NUMA balancing)
-------
**3.8(2013年2月发布)**
@@ -404,7 +404,7 @@ NUMA 机器一个重要特性就是不同 node 之间的内存访问速度有差
## 1.9 **CPU 调度与节能**
# 1.9 **CPU 调度与节能**
-------