Part II · 一台机器 · 第 2 章
02

幻觉机器:虚拟化 CPU

一颗 CPU 如何让几十个程序都以为自己正在运行?答案不是“真的同时”,而是操作系统用中断、上下文切换和调度策略维护出来的高速幻觉。

难度 CS162 核心 用时 约 55 分钟 交互 流程动画 · 调度取舍模拟器 路线 螺旋式:先抓大图,再深入机制

0先把地图摊开

一颗 CPU 如何让几十个程序都以为自己正在运行?答案不是“真的同时”,而是操作系统用中断、上下文切换和调度策略维护出来的高速幻觉。 本章不会把概念排成术语表,而是沿着一条真实系统路径走:先看它解决什么痛点,再看 OS/云平台怎样实现,最后回到工程取舍。

进程程序运行起来之后的完整容器:代码、寄存器、栈、堆、打开的文件,以及它以为自己拥有的 CPU。
线程进程里的执行流。多个线程共享同一份地址空间,但各自有自己的栈和寄存器现场。
上下文切换操作系统把当前进程的寄存器现场保存起来,再恢复另一个进程的现场。幻觉的成本就在这里。
调度器内核里决定“下一小段时间谁来用 CPU”的策略模块。公平、延迟、吞吐永远在拉扯。
幻觉机器:虚拟化 CPU · 核心流程 分步动画 点击节点或用键盘 ← →
图 2.1核心机制路径。把这一章最容易散掉的流程压成可播放的五步。

2.1CPU 没有变多,只是切得够快

一颗 CPU 在一个时刻只能执行一条指令流。多任务的第一层真相,是内核把时间切成很小的片段,在进程之间快速切换。人的感知粗糙,于是把“轮流”看成了“同时”。这和云的虚拟机很像:底下资源有限,上层看到的是被精心包装后的独占假象。

2.2进程是云服务的最小叙事单位

第 1 章里 Web 服务器看起来是一台机器,本章把镜头推进去:真正处理请求的是某个进程。它拿到 socket,解析 HTTP,执行你的业务逻辑,再通过系统调用请内核收发网络和读写文件。理解进程,你才知道容器、Pod、serverless function 到底包住了什么。

2.3从用户态陷入内核态

普通程序没有权限直接操作网卡、磁盘、页表或时钟。它必须通过系统调用进入内核态。这个边界是安全边界,也是性能边界:每次跨越都有成本,所以高性能服务器会批量 I/O、用 epoll、减少不必要的内核往返。

2.4调度不是排队,而是价值判断

短时间片让交互延迟更低,但上下文切换开销更高;长时间片吞吐更好,却可能让小请求排队。云上调度器、Kubernetes scheduler、vLLM continuous batching 都是在同一个问题上换了尺度:有限资源,先服务谁?

2.5本章和云的连接

虚拟机的 vCPU、容器里的 CPU limit、serverless 的并发上限,本质都继承了单机调度的约束。云把 CPU 包成商品,但并没有消除 CPU 的物理事实。

幻觉机器:虚拟化 CPU · 取舍实验 可玩模拟器 切换策略,看指标怎么变
图 2.2工程取舍。云和 OS 的概念真正进入工程时,几乎都不是“选最好”,而是在约束之间找一个诚实的点。

云与 OS 的桥

这一章不是孤立知识点。下面这张表把它和前后章节接起来:你会看到,同一个机制在单机、云平台和 AI 基建里会换名字,但问题结构没变。

本章机制云上形态为什么重要
进程/线程容器里的主进程、Pod 里的多个 worker容器不是迷你虚拟机,它首先是一组被隔离和限制的进程。
调度器Kubernetes 调度、vLLM 请求调度尺度变了,但核心问题仍是资源分配与排队。
系统调用高性能网络、存储、serverless 冷启动云上性能瓶颈经常藏在用户态和内核态的边界。
深潜 读完本章后,怎么确认自己真的懂了?

不要只背定义。你应该能把一个线上现象翻译回机制:慢在哪里、谁在排队、哪个抽象漏了、哪个资源被过度承诺。下面三个检查点可以当成小作业。

本章收束 · 你现在握住了什么

  • 多任务不是 CPU 真的变多,而是时间被内核快速切片。
  • 进程是运行中程序的容器,线程是共享地址空间里的执行流。
  • 系统调用是用户态进入内核态的正门,也是性能和安全的边界。
  • 调度策略永远在延迟、吞吐、公平和开销之间做取舍。

下一章,我们把 CPU 旁边那块更会骗人的东西拆开:内存。每个进程为什么都以为自己拥有一整片连续的世界?