Skip to content

Commit 4004b14

Browse files
authored
lec08-p3~p5
1 parent 2cd85d6 commit 4004b14

File tree

4 files changed

+41
-27
lines changed

4 files changed

+41
-27
lines changed

lec8/figs/EEVDF.jpg

17.2 KB
Loading

lec8/p3-linux-O1-sched.md

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,10 @@ backgroundColor: white
5757

5858
* O(n) 调度器:内核版本 2.4-2.6
5959
* O(1) 调度器:内核版本 2.6.0-2.6.22
60-
* CFS 调度器:内核版本 2.6.23-至今
60+
* CFS 调度器:内核版本 2.6.23(2007)-6.5
61+
* EEVDF 调度器:内核版本 6.6(2023)-现在
6162

62-
![w:650](figs/linux-schedulers.png)
63+
![w:500px](figs/linux-schedulers.png)
6364

6465
<!--
6566
https://www.scaler.com/topics/operating-system/process-scheduling/
@@ -149,11 +150,11 @@ Linux历史 -->
149150

150151
- 把时间分成大量的微小时间片(Epoch)
151152
- 每个时间片开始时
152-
- 计算进程的动态优先级
153-
- 将进程优先级映射成缺省时间片
154-
- 然后选择优先级最高的进程来执行
155-
- 进程被调度器切换执行后,可不被打扰地用尽这个时间片
156-
- 如进程没有用尽时间片,则剩余时间增加到进程的下一个时间片中
153+
- 计算进程的**动态优先级**
154+
- 将进程优先级映射成**缺省时间片**
155+
- 然后选择**优先级最高**的进程来执行
156+
- 进程被调度器切换执行后,可不被打扰地**用尽这个时间片**
157+
- 如进程没有用尽时间片,**剩余时间**增加到进程的下一个时间片中
157158

158159

159160
<!-- 谈谈调度 - Linux O(1) https://cloud.tencent.com/developer/article/1077507

lec8/p4-linux-cfs-sched.md

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,10 @@ backgroundColor: white
5858
- O(1)和O(n)都将CPU资源划分为时间片
5959
- 采用**固定额度**分配机制,每个调度周期的进程可用时间片是确定的
6060
- 调度周期结束被重新分配
61-
- O(1)调度器本质上是MLFQ(multi-level feedback queue)算法思想
62-
- 不足:O(1)调度器对进程交互性的响应不及时
61+
- O(1)调度器本质上是**MLFQ**(multi-level feedback queue)算法思想
62+
- 不足:O(1)调度器对进程交互性的**响应不及时**
6363
- 需求
64-
- 根据进程的运行状况判断它属于IO密集型还是CPU密集型,再做优先级奖励和惩罚
64+
- 根据**进程的运行状况**判断它属于IO密集型还是CPU密集型,再做优先级奖励和惩罚
6565
- 这种推测本身存在误差,场景越复杂判断难度越大
6666

6767

@@ -88,20 +88,20 @@ backgroundColor: white
8888

8989
#### CFS 的思路
9090
- **把 CPU 视为资源**,并记录下每一个进程对该资源使用的情况
91-
- 在调度时,调度器总是选择消耗资源最少的进程来运行(**公平分配**
91+
- 在调度时,调度器总是选择**消耗资源最少**的进程来运行(公平分配
9292
- 由于一些进程的工作会比其他进程更重要,这种绝对的公平有时也是一种不公平
93-
- **按照权重来分配 CPU 资源**
93+
- 按照**权重**来分配 CPU 资源
9494
![bg right:47% 90%](figs/prio-to-weight.png)
9595

9696

9797
---
9898

9999
#### CFS 调度思想
100100

101-
- 虚拟运行时间(vruntime):CFS 为每个进程维护一个 vruntime 值,该值表示进程应该获得的 CPU 时间量。
102-
- 进程调度:每次调度vruntime最小的进程,使得每个进程根据vruntime相互追赶,期望每个进程vruntime接近,保证公平。
103-
- vruntime增长速度:进程的 nice 值(反映进程的相对优先级)会影响其 vruntime 的增长速率。nice值越低,权重越高,其vruntime增加得越慢。
104-
- 时间片管理:CFS 为每个进程分配一个时间片,当进程用完其时间片时,会被放回就绪队列的末尾。时间片的大小会根据系统的负载和进程的权重动态调整
101+
- 虚拟运行时间(vruntime):CFS 为每个进程维护一个 vruntime 值,该值表示**进程应该获得的 CPU 时间量**
102+
- 进程调度:每次**调度vruntime最小的进程**,使得每个进程根据vruntime相互追赶,期望每个进程vruntime接近,保证公平。
103+
- **vruntime增长速度**:进程的 nice 值(反映进程的相对优先级)会影响其 vruntime 的增长速率。nice值越低,权重越高,其vruntime增加得越慢。
104+
- 时间片管理:CFS 为每个进程分配一个时间片,当进程用完其时间片时,会被放回就绪队列的末尾。**时间片大小**会根据系统的**负载**和进程的**权重**动态调整
105105

106106
---
107107

@@ -165,10 +165,7 @@ Virtual runtime = (physical runtime) X (nice value 0的权重)/进程
165165
所有进程的vruntime增长速度宏观上看应该是同时推进的,就可以用这个vruntime来选择运行的进程。
166166

167167
* 进程的vruntime值较小说明它以前占用cpu的时间较短,受到了“不公平”对待,因此下一个运行进程就选择它。
168-
* 这样既能公平选择进程,又能保证高优先级进程获得较多的运行时间。
169-
170-
171-
168+
* 这样既能**公平**选择进程,又能保证高**优先级**进程获得较多的运行时间。
172169

173170
---
174171

@@ -222,6 +219,8 @@ CFS让每个调度实体(进程或进程组)的vruntime互相追赶,而每
222219
- 调度时,从红黑树中选取vruntime最小的进程出来运行
223220
![bg right:53% 90%](figs/rbtree.png)
224221

222+
参考:[红黑树插入/删除操作](https://zhuanlan.zhihu.com/p/91960960)
223+
225224
---
226225

227226
#### CFS 的进程权重
@@ -260,7 +259,7 @@ CFS让每个调度实体(进程或进程组)的vruntime互相追赶,而每
260259

261260
#### CFS中休眠进程的vruntime
262261

263-
- 在休眠进程被唤醒时重新设置 vruntime 值,以 min_vruntime 值为基础,给予一定的补偿,但不能补偿太多。
262+
- 在休眠进程被唤醒时重新设置 vruntime 值,以 min_vruntime 值为基础,给予**一定的补偿**,但不能补偿太多。
264263
![bg right:45% 90%](figs/rbtree.png)
265264

266265

@@ -322,7 +321,9 @@ signed char c = a - 250,
322321
signed char d = b - 250;
323322
//到此判断 c 和 d 的大小
324323
```
325-
![bg right:54% 90%](figs/rbtree.png)
324+
![bg right:52% 90%](figs/rbtree.png)
325+
326+
参考:[无符号数的有符号比较](https://piazza.com/class/i5j09fnsl7k5x0/post/357)
326327

327328
---
328329

@@ -339,13 +340,13 @@ signed char d = b - 250;
339340

340341
---
341342

342-
### 课程实验三 进程及进程管理
343+
### 实验三 进程及进程管理
343344

344345
* 实验目标
345346
* spawn 系统调用
346347
* stride 调度算法
347348
* 实验任务描述
348349
* [rCore](https://learningos.github.io/rCore-Tutorial-Guide-2023A/chapter5/4exercise.html)
349350
* [uCore](https://learningos.github.io/uCore-Tutorial-Guide-2023A/chapter5/4exercise.html)
350-
<!--* 实验提交要求
351-
* 布置实验任务后的第13天(11月12日24点);-->
351+
* 实验提交要求
352+
* 布置实验任务后的第13天(11月10日24点);

lec8/p5-linux-bfs-sched.md

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ BFS全称:Brain Fuck Scheduler,脑残调度器
8484
#### BFS 的虚拟截止时间计算
8585
- 依据当前时间、进程优先级和时间片设置计算;
8686
```
87-
offset = niffies + (prioratio ∗ rr_interval)
87+
offset = niffies + (prio_ratio ∗ rr_interval)
8888
prioratio increases by 10% for every nice level
8989
```
9090
- niffies是当前时间;prio_ratios[priority]是一个常量数组,不同的priority对应不同的prio_ratios[priority];rr_interval是timeslice,是CPU分配给每个任务的时间片,是一个常数
@@ -103,7 +103,7 @@ prioratio increases by 10% for every nice level
103103
---
104104

105105
#### BFS 的调度思路
106-
按照O(1)调度器的方式首先查找位图中不为0的那个queue,然后在该queue中执行O(n)查找,查找到virtual deadline最小的那个进程投入执行。
106+
按照O(1)调度器的方式首先查找位图中不为0的那个queue,然后在该queue中执行$O(n)$查找,查找到virtual deadline最小的那个进程投入执行。
107107

108108
![bg right 100%](figs/bfs.png)
109109

@@ -157,6 +157,18 @@ Ref: [Analysis of the BFS Scheduler in FreeBSD](http://vellvisher.github.io/pape
157157

158158
---
159159

160+
#### 最早可执行虚拟截止时间优先调度算法EEVDF
161+
162+
![w:600](figs/EEVDF.jpg)
163+
164+
延迟敏感进程较多时,EEVDF(Earliest Eligible Virtual Deadline First)可显著降低调度延迟,提高响应速度,而不会牺牲吞吐量和能耗。
165+
166+
<!--
167+
https://zhuanlan.zhihu.com/p/683775984
168+
-->
169+
170+
---
171+
160172
### 参考文献
161173
- http://repo-ck.com/bench/cpu_schedulers_compared.pdf
162174
- https://zhuanlan.zhihu.com/p/351876567

0 commit comments

Comments
 (0)