linux源码网站:https://elixir.bootlin.com/linux/latest/source
威斯康辛大学OS课程:https://pages.cs.wisc.edu/~remzi/OSTEP/
github上的教程:https://zorrozou.github.io/
调度算法
-
FIFO 先进先出
谁先到谁先执行
-
SJF ==> shorest job firs
谁的进程时间短,谁先被调度
-
STCF ==> shorest time-to-completion first
谁先完成,谁先被调度,可以打断长时间执行的进程
-
RR 轮询方式 ==> round robin
把1s分成很多时间片,把这些时间片分给每一个进程
进程队列
- 全局队列
多个CPU 全局队列
需要加锁,释放锁的各种操作,性能很低
- 局部队列
每个CPU都有自己的进程队列
每个CPU从自己的进程队列里面取进程然后释放
进程优先级
-
不是每一个进程都有相同的优先级
ps -l
nice(NI)值是什么
Linux nice 他对别的进程的好的程度,nice越高,优先级越低,得到CPU的时间越少
范围 -20到19
PRI值是什么
PRI是优先级,值越高,优先级越低,范围0-139
实时进程 用户的交互 需要及时响应 所以和普通进行的优先级要分开
实时进程优先级是从[0-100) #define MAX_USER_RT_PRIO 100
普通进程优先级是从[100-140) #define MAX_PRIO (MAX_RT_PRIO + 40)
-
静态优先级
nice 值来决定的优先级,权利在用户,用户在一开始就设定优先级,同时可以更改
-
动态优先级
内核来决定的,有些进程会超时,要受到惩罚,内核就会自动去修改优先级,有些进程受到不公平的待遇,内核就会调高他的优先级
Linux调度器
-
O(n)调度器
cpu 进程队列 队列里边放的是带有优先级的进程
链表 数据
遍历这个队列 找到优先级最高的进程,加入进程比较多,效率比较低
-
O(1)调度器
位运算是最快的 0-139的一个范围
优先级映射为一个bitmap一共140位
在这个优先级上面有进程,那么这个位就被置为1,没有进程就被置为0
active 活动队列 expire 过期队列
两个队列会交换,指针交换十分块。
0-140 优先级的这个值越小,优先级越高
0的优先级最高,因为find first 比find last要块
-
CFS调度器 完全公平调度器 O(lgN) Completely Fair Scheduler
分时间片 每个进程相对公平
保障每个进程都能分到时间片
引入 virtualtime
优先级高的进程 实际10ms 对应的virtualtime设置1s
优先级低的进程 实际10ms 对应的virtualtime设置10ms
红黑树 CPU调度的时候总是取最左边的这个进程进行调度