课程内容#
进程调度#
- 进程调度是一个内核子系统,用户管不了
- 进程调度的主要任务是决定哪一个就绪状态的进程先运行
- 就绪进程是非阻塞进程,已具备运行条件,不需要阻塞等待了
- 阻塞进程就是正在睡眠 [不占用 CPU] 的进程,需要内核唤醒的进程
三态模型#
- 阻塞、就绪、运行
- 阻塞,不占用系统资源;就绪,需要等内核调度;运行,在 IO 请求或等待某事件时阻塞
👉 五态模型
- 加入新建态、终止态
从单任务到多任务#
- DOS 是单任务操作系统,每次只运行一个进程
- 进程交错运行,如同多任务运行
- 多处理器可以做到真正的并行
- 并发 VS 并行
- 并发:一个时间段内有很多任务进行
- 并行:有多少个 CPU,就可以有多少个任务同时运行
- 调度的核心:运行哪个进程,运行多久
时间片#
强影响着系统的全局行为和性能
- 过长
- 👍:提升系统吞吐率和全局性能
- × :降低了并发运行;用户感到明显的延迟[响应能力下降,应用过多也会导致调度间隔长]
- 过短
- 👍:提升交互性能
- × :大量时间花在调度大;时间局部性带来的性能提升大打折扣
- 时间局部性:缓存,记忆 [高速缓存是随着时间慢慢建立起来的]
- 空间局部性:预先多准备部分临近空间的数据
- 有学习、预判的意味
- 所以,时间片长短难以确定,解决方案是干脆不用时间片,取而代之的是完全公平调度算法
- 系统根据就绪队列和优先级调整策略
- 调度时间和优先级的分配,本质上是为了更好地服务于用户,并没有不公平
- 详见下文 —— 完全公平调度器
处理器约束型和 IO 约束型进程#
根据进程使用 CPU 的特点划分,取决于处理器还是 IO 用得多
- 处理器约束型
- 【一直消耗完可用时间片的进程】
- 需要获取大量的 CPU 资源,会消耗调度器分配的全部 CPU
- 如:while (1);,很容易将 CPU 使用率达到 100%
- 对时间片的要求
- 期待更长的时间片,从而最大化缓存命中,尽快完成任务 [不会浪费资源]
- IO 约束型
- 【多数时间处于阻塞状态或者等待资源的进程】
- 经常阻塞在文件 IO 操作上:文件,网络,键盘,鼠标 [如听音乐、打字];或者除了请求内核执行 I/O 操作之外什么也不做 [如 cp]
- 对时间片的要求
- 需要更短的时间片,被调度的越快,越有无缝衔接的感觉
- 进程只会运行极短的时间,然后阻塞在内核资源;会用到中断
调度器分类#
协同式调度器#
[不干预型,实用性不高]
- 进程会一直运行直到它自己结束
- 操作系统不做任何干预
抢占式调度器#
[时间片型]
- 内核给进程分配时间片,时间片用完,挂起该进程 [不占用任何资源],执行其它进程
- 没有其他就绪的进程时,内核给已经执行过的进程重新划分时间片
- 调度器安排进程的运行顺序、时长
- [PS]
- 新建态进入就绪队列,终止态退出就绪队列 [五态模型]
- 考虑优先级,所有进程都有机会被运行
完全公平调度器#
[非时间片型]
CFS:Completely Fair Scheduler
- 给 N 个进程,每个进程分别分配 1 / N 的处理器时间
- 优先级和权值
- 优先级越高,值越小,权值越大
- 默认优先级为 0,权值为 1
- 目标延迟:调度的固定周期
- 最小粒度:避免目标延迟过小导致每个进程运行的时间过短
👉公平配额
Tips#
- 我是一个 CPU:这个世界慢!死!了!—— 微信公众号
- 有趣的文章,了解 CPU 和硬盘、网络之间的速度鸿沟