你的电脑同时在播放音乐、渲染视频、收微信、下载文件——请问它到底有几颗脑袋?
答案是:一颗。或者说一个核心在同一时刻真的只能做一件事。但你感觉它能同时做所有事,是因为操作系统在骗你。这个骗术的名字叫分时复用(Time-Sharing),是计算机体系中最优雅的障眼法之一。
一、从批处理到分时:一场革命
早期的计算机不跟你互动。你塞一叠穿孔卡片进去,它算完你的作业,打印结果,然后你再塞下一叠。这叫批处理——像食堂打饭,一个人打完了下一个才能上。
后来人们忍不了了。1960年代MIT搞出了Multics(Unix的前身就是嫌Multics太复杂而生的),开创了分时系统:把CPU时间切成很小的片,轮流分给每个程序。因为时间片通常只有几十毫秒,你的程序还没来得及发现自己被暂停了,CPU就已经切回来继续算。所以你以为自己在独享整台电脑。
二、上下文切换:操作系统的记忆术
进程调度最核心的操作叫上下文切换。想象你在看书,有人敲门。你开门之前会做什么?八成是看一眼页码记住它。回来翻开继续读。
进程切换一模一样。当一个进程被中断时,操作系统把它的全部状态——所有寄存器值、程序计数器(执行到哪条指令)、内存地址——存进一个叫PCB(Process Control Block)的结构体里,然后加载下一个进程的状态,让它接着跑。这一切发生在微秒级别。
问题是:切换本身也有成本。如果时间片设得太短,CPU的时间全花在存状态、读状态上了,真正干活的时间反而少了。这就像一节课四十分钟,如果每五分钟打一次铃,学生刚进入状态就被打断,一天下来什么都没学到。
三、调度算法:谁先谁后有讲究
排队得有规则。操作系统的调度算法就是排队规则:
先来先服务(FCFS)——最有礼貌也最蠢。一个大任务堵在前面,后面的小任务全部干等,像高速路上一个大卡车挡着所有小车。
最短作业优先(SJF)——谁的活短谁先上。听起来公平,但短作业源源不断时,长作业就被饿死了,永远轮不到。
时间片轮转(Round Robin)——一人一棒轮流来。公平,但切换开销摆在那。
多级反馈队列(MLFQ)——现代系统的标配。把进程分级:前台交互的(比如你在打字)优先级高,后台算数的(比如渲染视频)优先级低。而且进程可以降级——如果你抢了太多CPU时间,系统会怀疑你在偷跑,把你往后调。
四、并发 ≠ 并行
很多人搞混这两个概念:
并行是你有四个核心,四个任务真的同时在跑。
并发是哪怕只有一个核心,你让每个任务各跑一小段就切到下一个,看起来像同时在做。
生活类比:搬四张椅子。并行是四个人一人搬一张;并发是一个人搬——一次只能搬一张,但每搬完一张就换下一张,看着像四张同时在动。
五、为什么手机越用越卡
知道这些有什么用?你手机卡的时候,本质上是:要跑的程序太多了,每个进程分到的时间片越来越小,切换开销占比越来越大。为什么新手机不卡?除了CPU更快外,核心数多了才是关键——一核有难多核支援,调度器轻松多了。
操作系统用每秒几百上千次的切进切出,给你营造了一个万事万物同时运转的幻觉。每一次你点一下屏幕、发一条消息、切一个应用,背后都有一场精心编排的调度在发生。你以为的魔法,全是算法。