第 9 章 · 04 进程调度与虚拟内存


第 9 章 · 04 进程调度与虚拟内存

本节摘要:这是 OS 的两大核心抽象。「进程」让每个程序以为自己独占 CPU(靠调度时分复用),「虚拟内存」让每个程序以为自己独占整片内存(靠分页与页表映射)。本节讲清两者的机制——调度(轮转/优先级,靠时钟中断驱动)与分页(每进程独立页表,虚拟地址→物理地址映射)。理解这两个「用错觉制造多任务」的精巧机制,你就抓住了 OS 的核心。

内容来源:基于 OS 核心机制整理的导读,呼应姊妹篇《Linux 命令》第 6 章进程与 free/vmstat。

学习目标

  1. 说清进程的本质:运行中程序的封装,含代码/数据/寄存器/打开的文件等「上下文」。
  2. 解释调度:靠时钟中断,调度器决定下一个跑谁,保存/恢复上下文。
  3. 说清虚拟内存:每进程独立地址空间,虚拟地址经页表映射到物理。
  4. 解释缺页异常如何实现「按需加载」与「内存超分配」。

一、学习价值:OS 的两大「错觉制造机」

进程与虚拟内存,是 OS 提供给程序员的两大核心抽象。它们都靠「制造独占错觉」让多任务成为可能:

  • 进程:让 N 个程序「以为」自己独占 CPU(实际靠调度轮转)。
  • 虚拟内存:让 N 个程序「以为」自己独占整片内存(实际靠分页共享物理内存)。

理解这两者,你才真正理解「为什么能同时跑这么多程序」「为什么进程间内存隔离」——这些是你天天用 Linux 命令(姊妹篇)的底层基础。

二、认知拆解

进程与调度

进程:运行中程序的封装。每个进程有「上下文」:代码、数据、堆、栈、CPU 寄存器值(包括下条指令地址)、打开的文件描述符表等。

调度:CPU 只有一个(或几个核),但有 N 个进程「想跑」。OS 的调度器决定「此刻谁跑」:

  1. 时钟中断定期触发,进入调度器(内核态)。
  2. 调度器保存当前进程的上下文(寄存器等)。
  3. 选下一个进程(轮转/优先级/多级反馈队列)。
  4. 恢复下一进程的上下文,跳回去执行。
  5. 下次时钟中断再来,重复。

从用户看,每个进程都在「跑」——实际是被快速轮转(每秒几十到几百次),人感觉不到停顿。

上下文切换的代价:保存/恢复寄存器、切页表、刷 TLB。所以线程(共享地址空间,切换便宜)比进程(独立地址空间,切换贵)在某些场景更优。

虚拟内存与分页

问题:多个进程同时跑,它们的内存怎么隔离?A 不能读写 B 的内存。

解法:虚拟内存 + 分页:

  • 每个进程有自己的「虚拟地址空间」(从 0 开始的完整空间,看似独占)。
  • 虚拟地址经「页表」映射到「物理地址」(实际内存)。
  • 每进程独立页表,映射不同,自然隔离(A 的虚拟地址 0x1000 映射到物理 X,B 的 0x1000 映射到物理 Y,互不干扰)。

分页:把虚拟与物理地址空间都切成固定大小的「页」(如 4KB)。页表记录「虚拟页号 → 物理页号」。

缺页异常:进程访问某虚拟地址,页表里该页「不在内存」(还没加载,或被换出到磁盘 swap),CPU 触发缺页异常,OS 的处理程序从磁盘加载该页到物理内存、更新页表、恢复执行。这让「虚拟内存大于物理内存」成为可能(按需加载 + 换页)。

呼应姊妹篇《Linux 命令》第 6 章:free 看到的 buff/cache、vmstat 的 si/so,都是这套机制的对外表现。

三、上手第一步

写 OS 时:

  1. 实现进程结构(存上下文)。
  2. 写调度器(时钟中断里保存当前、切下一个、恢复)。
  3. 设分页(页表、虚拟到物理映射)。
  4. 实现缺页处理(按需加载)。

本节要点回顾

  1. 进程 = 运行中程序 + 上下文(代码/数据/寄存器/文件等)。
  2. 调度:时钟中断驱动,保存当前上下文→选下一个→恢复,制造「独占 CPU」错觉。
  3. 上下文切换有代价(保存寄存器/切页表/刷 TLB),线程比进程便宜(共享地址空间)。
  4. 虚拟内存 + 分页:每进程独立页表,虚拟地址映射到物理;进程间内存隔离。
  5. 缺页异常:访问未加载的页 → OS 从磁盘加载 → 实现「虚拟内存 > 物理内存」。

推荐上手顺序

  1. 实现进程结构 + 上下文保存/恢复。
  2. 写轮转调度器(时钟中断触发)。
  3. 设分页与页表。
  4. 实现缺页处理(按需加载)。
  5. 参考 xv6 的进程与虚拟内存实现。

下一节讲文件系统——持久化的抽象。

作者与出处
原作者:灏天文库
来源:codecrafters-io
许可证:CC0-1.0
整理人: 灏天文库整理
由灏天文库结构化整理,提供目录导航、全文检索与在线阅读,便于系统化学习
发布者: 作者: 灏天文库 转发
评论区 (0)
U