本节摘要:这是 OS 的两大核心抽象。「进程」让每个程序以为自己独占 CPU(靠调度时分复用),「虚拟内存」让每个程序以为自己独占整片内存(靠分页与页表映射)。本节讲清两者的机制——调度(轮转/优先级,靠时钟中断驱动)与分页(每进程独立页表,虚拟地址→物理地址映射)。理解这两个「用错觉制造多任务」的精巧机制,你就抓住了 OS 的核心。
内容来源:基于 OS 核心机制整理的导读,呼应姊妹篇《Linux 命令》第 6 章进程与 free/vmstat。
进程与虚拟内存,是 OS 提供给程序员的两大核心抽象。它们都靠「制造独占错觉」让多任务成为可能:
理解这两者,你才真正理解「为什么能同时跑这么多程序」「为什么进程间内存隔离」——这些是你天天用 Linux 命令(姊妹篇)的底层基础。
进程:运行中程序的封装。每个进程有「上下文」:代码、数据、堆、栈、CPU 寄存器值(包括下条指令地址)、打开的文件描述符表等。
调度:CPU 只有一个(或几个核),但有 N 个进程「想跑」。OS 的调度器决定「此刻谁跑」:
从用户看,每个进程都在「跑」——实际是被快速轮转(每秒几十到几百次),人感觉不到停顿。
上下文切换的代价:保存/恢复寄存器、切页表、刷 TLB。所以线程(共享地址空间,切换便宜)比进程(独立地址空间,切换贵)在某些场景更优。
问题:多个进程同时跑,它们的内存怎么隔离?A 不能读写 B 的内存。
解法:虚拟内存 + 分页:
分页:把虚拟与物理地址空间都切成固定大小的「页」(如 4KB)。页表记录「虚拟页号 → 物理页号」。
缺页异常:进程访问某虚拟地址,页表里该页「不在内存」(还没加载,或被换出到磁盘 swap),CPU 触发缺页异常,OS 的处理程序从磁盘加载该页到物理内存、更新页表、恢复执行。这让「虚拟内存大于物理内存」成为可能(按需加载 + 换页)。
呼应姊妹篇《Linux 命令》第 6 章:free 看到的 buff/cache、vmstat 的 si/so,都是这套机制的对外表现。
写 OS 时:
下一节讲文件系统——持久化的抽象。