01程序平时住在哪里?
当电脑关机时,浏览器、游戏、画图软件这些程序仍然存在。 因为它们长期保存在SSD、硬盘等非易失性存储设备里。
但当程序真正运行时,CPU 需要不断取得下一条指令和正在处理的数据。 这时,操作系统会让程序当前需要的内容进入内存体系,方便处理器快速访问。
SSD / 硬盘
长期保存程序文件
关机后仍然保留内存 RAM
放当前正在使用的代码和数据
速度更快,断电后通常会消失CPU
执行机器指令
还会使用自己的缓存和寄存器02为什么不一直直接从硬盘里运行?
因为 SSD 和硬盘虽然适合长期保存大量数据, 但它们的访问速度和访问方式,都和 RAM 不一样。
SSD / 硬盘
- 适合长期保存
- 容量通常更大
- 断电后数据仍然存在
- 访问延迟通常远高于 RAM
RAM 内存
- 适合频繁读写
- 访问延迟更低
- CPU 可以高效地通过内存系统访问
- 断电后内容通常会消失
03程序“进入内存”时真正发生了什么?
入门教材常说“程序从硬盘加载到内存”。 这个说法作为第一步理解没有问题,但更准确的过程是:
找到可执行文件
程序文件还在 SSD / 硬盘中
建立内存映射
把程序代码和数据安排到进程的虚拟地址空间
需要时调入页面
真正访问时,再把所需页面放进物理内存
线程被调度执行
CPU 开始执行相应机器指令
04什么是虚拟内存?
每个进程看到的“内存地址”,通常并不是直接等于某一块真实 RAM 的物理位置。 操作系统和 CPU 的内存管理硬件会共同维护虚拟地址到物理地址的映射。
进程看到的地址空间
地址映射
操作系统 + CPU 内存管理硬件共同完成
物理内存
真正的 RAM 页面
05程序会一次全部搬进内存吗?
通常不会。 现代系统常使用按需分页(Demand Paging): 某一部分代码或数据只有在程序真正访问时,才需要被调入物理内存。
程序文件
有很多页面
当前真正需要
只让需要的页面进入 RAM
如果程序突然访问一个还没在 RAM 里的页面呢?
CPU 会触发一种称为缺页(Page Fault)的异常。 操作系统判断这个访问是否合法;如果合法,就把需要的页面准备到物理内存,再继续执行。
“Page Fault”这个名字听起来像“出错”,但很多时候它其实是虚拟内存正常工作的组成部分。
06CPU 真正从哪里取指令?
说“CPU 从 RAM 读取指令”仍然是一个简化说法。 真实处理器内部还有更快的缓存(Cache)和寄存器(Register)。
CPU 核心
缓存
非常快,容量较小
RAM
更大,但比缓存慢
SSD / 硬盘
容量大,适合长期保存
07是不是所有程序都必须这样运行?
对我们常见的 Windows、Linux、macOS 个人电脑来说, “程序文件保存在存储设备中,运行时通过虚拟内存进入内存体系”是非常典型的方式。
但计算机世界很大,并不是所有设备都完全一样。
个人电脑
通常使用虚拟内存、分页和 RAM 来运行普通应用程序
某些嵌入式系统
有的代码可以直接从可执行存储器读取执行
不同硬件架构
具体的存储、缓存和地址管理方式可能不同
你已经知道了什么
- 程序平时长期保存在 SSD、硬盘等非易失性存储设备中。
- 运行时,系统会让当前需要的代码和数据进入内存体系,方便 CPU 高效访问。
- 现代操作系统通常不是把整个程序文件一次性完整复制进 RAM。
- 程序会被映射到进程的虚拟地址空间,需要的页面再按需进入物理内存。
- 虚拟地址不是直接等于物理 RAM 地址,系统和 CPU 内存管理硬件会维护映射关系。
- 按需分页可以只装入当前需要的页面;缺页异常也是虚拟内存正常机制的一部分。
- CPU 还会使用缓存和寄存器,所以“CPU 直接从 RAM 取每条指令”也是简化说法。
- 某些嵌入式系统存在直接从可执行存储器运行代码的情况,因此“必须完整搬到 RAM”不是普遍定律。
下一个问题: 程序已经能被 CPU 访问了,那么 CPU 到底怎样把一长串机器指令一步一步执行下去? 下一篇:CPU 是怎样一步一步执行程序的?