跳转至

第2章 进程、线程与调度

CPU 在任一核心上只能执行一条指令流,但用户同时运行编辑器、浏览器、编译器和后台服务。进程与线程把执行状态组织成可管理对象,调度器则决定有限 CPU 时间怎样在这些对象之间分配。

本章的核心矛盾

交互程序希望快速响应,批处理程序希望高吞吐,实时任务关心截止期限,多核系统还关心缓存局部性和负载均衡。不存在对所有目标都最优的调度策略。

可运行任务集合
  -> 调度策略选择一个任务
  -> 恢复它的 CPU 上下文
  -> 运行至阻塞、退出或被抢占
  -> 更新状态与队列
  -> 再次调度

小结目录

学完应能回答

  • 程序、进程、线程分别是什么?
  • 线程切换为什么通常比进程切换轻,但仍不是免费操作?
  • 周转时间、响应时间、等待时间和吞吐量为何不能同时最优?
  • forkexecwait 在进程生命周期中各做什么?
  • 管道、共享内存和消息传递分别适合什么情形?

与并发章节的连接

调度器可能在几乎任意可抢占点切换线程,所以一段“看起来连续”的源代码并不一定原子执行。下一章的竞态、锁和条件变量,正是为了在不可预测的交错执行中维护不变量。