10 - 为什么读硬盘比读内存慢那么多
前面几章反复出现一句话:「硬盘比内存慢」。到底慢多少?为什么会这样?这章讲清楚存储金字塔和缓存思想——这是整个计算机世界里最重要、最通用的一个思想,不止操作系统用,处处都在用。
速度差距大到超乎想象
计算机里的存储设备,速度和容量刚好成反比。从快到慢排下来是一座金字塔:
▲ 越往上:越快、越贵、越小
┌───────────────┐
│ 寄存器 │ 在 CPU 里,最快
├───────────────┤
│ CPU 缓存 │ L1/L2/L3,很快
├───────────────┤
│ 内存 (RAM) │ 快,断电即失
├───────────────┤
│ 固态硬盘 SSD │ 慢一些,断电还在
├───────────────┤
│ 机械硬盘 HDD │ 更慢,更便宜、更大
└───────────────┘
▼ 越往下:越慢、越便宜、越大
差距有多夸张?打个比方,如果把「从 CPU 缓存拿数据」看成1 秒,那么:
- 从内存拿,大概相当于 几分钟;
- 从固态硬盘拿,相当于 几天;
- 从机械硬盘拿,相当于 几个月。
这就是为什么第 07 章说「内存不够、频繁换硬盘会卡到死机」——每次找硬盘要数据,对 CPU 来说都是漫长的等待。
矛盾:又想快,又想大又便宜
我们当然希望所有存储都像寄存器一样快,可那样太贵了,根本装不起几个 G。反过来,全用大硬盘又太慢。
怎么办?答案是分层 + 缓存:把它们组合起来用,让「大部分访问都落在快的那一层」。
缓存思想:把常用的放在离你近的地方
**缓存(Cache)**的核心思路一句话:
把「最近、最常用」的数据,复制一份放到更快的那一层,下次直接从快的地方拿。
CPU 要数据时,先问最快的缓存有没有:
- 有(命中):直接拿,飞快。
- 没有(未命中):只好去下一层(内存、硬盘)找,慢,但找到后会顺手复制一份放进缓存,赌你待会儿还会用。
这招为什么有效?因为程序访问数据有个规律叫局部性:
- 你刚用过的数据,很可能马上又要用(比如循环里的计数器);
- 你用了某个数据,它旁边的数据也很可能马上要用(比如遍历一个数组)。
所以把「刚用的」和「旁边的」提前放进快的层,命中率就很高,整体速度被大大拉快。
这个思想到处都是
缓存不是 CPU 的专利,它是通用智慧,你会在无数地方再遇到它:
- 浏览器缓存:网页图片存本地,第二次打开就不用重新下载。
- Redis:把数据库里的热点数据放进内存,避免每次都去查慢的数据库。
- CDN:把网站内容复制到离你最近的服务器,加载更快。
- 操作系统:读过的文件内容会先留在内存里(叫「页缓存」),下次再读同一文件就快得多。
记住这句万能咒语:慢的东西,就在它前面架一层「常用数据的快副本」。 这几乎是所有性能优化的起点。
小结
- 存储设备是一座金字塔:寄存器 → 缓存 → 内存 → SSD → 机械硬盘,越往下越慢越大越便宜,速度差距成千上万倍。
- 既想快又想大又便宜是矛盾的,解法是分层组合 + 缓存。
- 缓存的核心:把最近、最常用的数据复制到更快的层,命中就飞快;靠的是程序访问的局部性规律。
- 缓存是贯穿整个计算机世界的通用思想:CPU 缓存、页缓存、浏览器缓存、Redis、CDN……本质都一样。
下一章 → 11 - 从开机到跑起一个程序,OS 都做了什么 | 回到 README 目录