很多人以为操作系统(OS)是一个“程序”,只要双击运行它,它就会开始工作。

但在庖丁解牛的视角下,操作系统根本不是普通的程序,它是 CPU 的“大内总管”和“物理世界的翻译官”。 CPU 是一台极度聪明但没有感情的算力机器,而操作系统就是那个随时在它耳边发号施令、维持秩序、并在关键时刻把它打晕(中断)换人的存在。

我们顺着 CPU 运行 OS 的纹理,切四刀:

第一刀:特权级的切换(从“主人”变成“保姆”)

骨节:为什么 CPU 不能直接执行你写的 PHP 代码?
解牛:
CPU 的硬件架构在设计时,就划分了“特权级”(Ring 0 到 Ring 3)。

  • 用户态(Ring 3):你写的 PHP、Nginx、微信,全都住在这里。CPU 在这里是个“瞎子”,不能直接碰网卡,不能直接读写磁盘,不能随便改内存。
  • 内核态(Ring 0):OS 住在这里,拥有无上特权。
  • 系统调用(Syscall):当你写 file_put_contents() 时,CPU 必须执行一条特殊的指令(比如 syscall),主动“掉入内核态”,把控制权交给 OS。OS 帮你把数据写到磁盘,然后再把你踢回用户态。
  • 真相:CPU 每次在用户态和内核态之间来回切换(保存现场、恢复现场),都要花费昂贵的开销。OS 的终极使命,就是尽量让这种切换变少、变快。

第二刀:硬件中断的“独裁者”(CPU 的包办婚姻)

骨节:CPU 正在算数据,网卡突然来了个数据包,怎么办?
解牛:

  • 如果没有 OS,CPU 得自己停下来问:“网卡大哥,你有事吗?”这叫轮询(Polling),极其浪费算力。
  • 有了 OS,网卡有数据了,会直接给 CPU 发个电信号(硬中断)。CPU 立刻停下所有工作,马上跳转去执行 OS 中断处理程序。
  • 时钟中断:OS 为了让多进程公平运行,必须有个“节拍器”。硬件定时器每隔一段时间(比如 10ms)就会给 CPU 发个中断。OS 借此机会强行剥夺当前进程的执行权,切给下一个进程(这就是所谓的时间片轮转)。
  • 真相:CPU 是被 OS 的“中断机制”牵着鼻子走的。你写的高并发,在 OS 看来,不过是一场场没完没了的“打断与被打断”。

第三刀:虚拟内存的“造梦师”(欺骗 CPU 的内存魔术)

骨节:OS 怎么让每个进程都以为自己独占了整块内存?
解牛:

  • CPU 内部有一个极其关键的硬件:MMU(内存管理单元)。OS 会在后台偷偷修改 MMU 里的页表。
  • 进程 A 以为自己访问的是物理地址 0x1000,实际上 OS 的页表把它映射到了真正的物理内存 0x5000。
  • 缺页中断:如果进程要访问的数据被 OS 换到磁盘上去了(Swap),CPU 会触发缺页中断。OS 会介入,把数据从磁盘读回内存,再让 CPU 接着跑。
  • 真相:CPU 看到的永远是虚拟地址,OS 就是在底层不断给 CPU 变戏法的那个魔术师。

第四刀:进程与线程的“生杀大权”(CPU 的调度器)

骨节:CPU 只有几个核,几百个进程抢着要,谁来决定谁先跑?
解牛:
OS 内部的**调度器(Scheduler)**决定了这一切。

  • 它要根据优先级、时间片、进程状态(就绪、阻塞)来综合计算。
  • 当进程需要读磁盘(I/O)时,OS 会把这个进程挂起(阻塞),让 CPU 立刻切给别人。等磁盘数据到了(中断),OS 再把进程放回就绪队列。
  • 上下文切换:OS 在切换进程时,要把 CPU 寄存器里的几十个数据全存到内存里,再把另一个进程的数据全加载回来。这是 CPU 运行 OS 时最大的纯开销。

总结:CPU 眼中的操作系统

CPU 运行操作系统,就像是一个极其绝顶聪明的天才(CPU),被一个极度严厉的管家(OS)管束着。

  • 管家不让你接触危险物品(特权级);
  • 管家随时打断你,让你休息换人(中断与时间片);
  • 管家让你产生幻觉,以为自己拥有无限的空间(虚拟内存);
  • 管家在外面帮你扛住了庞大的 I/O 阻塞,让你能专心算数据。

如果没有这个管家(OS),CPU 再强,也只是一堆只会发热、无法协调、随时死锁的无用硅片。操作系统的存在,就是为了把物理硬件那冷冰冰的“原始力”,驯服成程序员可以随意调遣的“算力”。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐