首页 / 知识库 / 进大厂必备计算机基础 / 计算机操作系统原理

04 - CPU 凭什么能同时跑很多程序

你的电脑 CPU 可能只有 8 个核,意味着物理上同一时刻最多只能真正跑 8 件事。但你打开任务管理器一看,几百个进程都在「运行」。这是怎么做到的?

答案有点反直觉:它其实没在同时跑,只是切得太快,你察觉不到。

核心戏法:时间片轮转

操作系统把 CPU 时间切成一小段一小段,每段叫一个时间片(通常几毫秒到几十毫秒)。然后:

  1. 让程序 A 用 CPU 跑一个时间片;
  2. 时间到,暂停 A,把它现在的状态存起来,切给程序 B;
  3. B 跑一个时间片,时间到,存 B、切 C……
  4. 转一圈回到 A,恢复 A 之前存的状态,接着跑。

由于切换速度极快(一秒钟切几十上百次),在你眼里,A、B、C 就像在「同时」运行。

就像一个厨师照看好几口锅:这口翻两下、那口搅两下,快速轮流。他其实一次只顾一口,但因为切得勤,几口锅都没糊,看起来像同时在做好几道菜。

并发 vs 并行:一字之差,别搞混

  • 并发(Concurrency):一个 CPU 快速切换,交替处理多个任务。宏观上像同时,微观上是轮流。(一个厨师照看多口锅。)
  • 并行(Parallelism):多个 CPU 核真的在同一时刻各干各的。(多个厨师,一人一口锅,真同时。)

现代电脑是两者结合:8 个核(并行)+ 每个核上又快速切换很多任务(并发),所以能「同时」跑几百个程序。

切换的代价:上下文切换

第 2 步里「把 A 的状态存起来、再恢复」,这个动作叫上下文切换(Context Switch)

「上下文」指的是程序跑到一半时的现场:CPU 里各个寄存器的值、执行到哪一行了等等。切换时必须把现场完整保存,下次才能无缝接着跑。

但这件事本身不产生任何有用工作,纯属「换班交接」的开销。所以:

切换太频繁,CPU 大量时间浪费在「交接班」上,真正干活的时间反而少了。这也是「线程不是开得越多越好」的原因之一。

一个关键收获

理解了这个机制,很多现象就通了:

  • 为什么一个程序卡死,别的程序还能动?——因为 OS 会强制收回它的时间片,切给别人。
  • 为什么程序里 sleep(1) 不会把整台电脑卡住一秒?——它一 sleep,就主动让出了 CPU,OS 立刻切给别人干活。

小结

  • CPU 核数有限,靠时间片轮转 + 极快的切换,营造出「同时运行很多程序」的假象。
  • 并发是一个核交替处理多任务(宏观同时);并行是多个核真正同时干活。现代电脑两者兼有。
  • 每次切换要保存/恢复「上下文」,这叫上下文切换,是纯开销——所以切换不是越多越好。
  • 那么,时间片到了之后到底该切给谁?这就是「调度」,下一章讲。

下一章 → 05 - 进程调度:谁先用 CPU | 回到 README 目录