01程序平时住在哪里?

当电脑关机时,浏览器、游戏、画图软件这些程序仍然存在。 因为它们长期保存在SSD、硬盘等非易失性存储设备里。

但当程序真正运行时,CPU 需要不断取得下一条指令和正在处理的数据。 这时,操作系统会让程序当前需要的内容进入内存体系,方便处理器快速访问。

SSD 或硬盘

SSD / 硬盘

长期保存程序文件

关机后仍然保留

内存 RAM

放当前正在使用的代码和数据

速度更快,断电后通常会消失
CPU 处理器

CPU

执行机器指令

还会使用自己的缓存和寄存器

02为什么不一直直接从硬盘里运行?

因为 SSD 和硬盘虽然适合长期保存大量数据, 但它们的访问速度和访问方式,都和 RAM 不一样。

SSD / 硬盘

  • 适合长期保存
  • 容量通常更大
  • 断电后数据仍然存在
  • 访问延迟通常远高于 RAM

RAM 内存

  • 适合频繁读写
  • 访问延迟更低
  • CPU 可以高效地通过内存系统访问
  • 断电后内容通常会消失

03程序“进入内存”时真正发生了什么?

入门教材常说“程序从硬盘加载到内存”。 这个说法作为第一步理解没有问题,但更准确的过程是:

1

找到可执行文件

程序文件还在 SSD / 硬盘中

2

建立内存映射

把程序代码和数据安排到进程的虚拟地址空间

3

需要时调入页面

真正访问时,再把所需页面放进物理内存

4

线程被调度执行

CPU 开始执行相应机器指令

04什么是虚拟内存?

每个进程看到的“内存地址”,通常并不是直接等于某一块真实 RAM 的物理位置。 操作系统和 CPU 的内存管理硬件会共同维护虚拟地址到物理地址的映射。

进程看到的地址空间

代码 数据

地址映射

操作系统 + CPU 内存管理硬件共同完成

物理内存

真正的 RAM 页面

05程序会一次全部搬进内存吗?

通常不会。 现代系统常使用按需分页(Demand Paging): 某一部分代码或数据只有在程序真正访问时,才需要被调入物理内存。

程序文件

ABCDEF GHIJKL

有很多页面

当前真正需要

ACFJ

只让需要的页面进入 RAM

如果程序突然访问一个还没在 RAM 里的页面呢?

CPU 会触发一种称为缺页(Page Fault)的异常。 操作系统判断这个访问是否合法;如果合法,就把需要的页面准备到物理内存,再继续执行。

“Page Fault”这个名字听起来像“出错”,但很多时候它其实是虚拟内存正常工作的组成部分。

06CPU 真正从哪里取指令?

说“CPU 从 RAM 读取指令”仍然是一个简化说法。 真实处理器内部还有更快的缓存(Cache)寄存器(Register)

CPU

CPU 核心

缓存

非常快,容量较小

RAM

更大,但比缓存慢

SSD

SSD / 硬盘

容量大,适合长期保存

更靠近 CPU、通常更快
更远、容量通常更大

07是不是所有程序都必须这样运行?

对我们常见的 Windows、Linux、macOS 个人电脑来说, “程序文件保存在存储设备中,运行时通过虚拟内存进入内存体系”是非常典型的方式。

但计算机世界很大,并不是所有设备都完全一样。

个人电脑

通常使用虚拟内存、分页和 RAM 来运行普通应用程序

某些嵌入式系统

有的代码可以直接从可执行存储器读取执行

不同硬件架构

具体的存储、缓存和地址管理方式可能不同

你已经知道了什么

  • 程序平时长期保存在 SSD、硬盘等非易失性存储设备中。
  • 运行时,系统会让当前需要的代码和数据进入内存体系,方便 CPU 高效访问。
  • 现代操作系统通常不是把整个程序文件一次性完整复制进 RAM。
  • 程序会被映射到进程的虚拟地址空间,需要的页面再按需进入物理内存。
  • 虚拟地址不是直接等于物理 RAM 地址,系统和 CPU 内存管理硬件会维护映射关系。
  • 按需分页可以只装入当前需要的页面;缺页异常也是虚拟内存正常机制的一部分。
  • CPU 还会使用缓存和寄存器,所以“CPU 直接从 RAM 取每条指令”也是简化说法。
  • 某些嵌入式系统存在直接从可执行存储器运行代码的情况,因此“必须完整搬到 RAM”不是普遍定律。

下一个问题: 程序已经能被 CPU 访问了,那么 CPU 到底怎样把一长串机器指令一步一步执行下去? 下一篇:CPU 是怎样一步一步执行程序的?