现代硬件算法[8.1]: 存储层次结构
存储层次结构
现代计算机存储具有高度层次化的结构。它由不同速度和大小的多个缓存层(cache layer)组成,其中高层通常存储低层中最常访问的数据以减少延迟:每高一层通常都要快一个数量级,但也会更小和/或更贵。

抽象来说,各类存储设备可以被描述为这样的模块:具有一定存储容量,并且可以一次读写尺寸为B的数据块(而非单个字节!),每次读写在固定的时间内来完成。
从这个角度看,各种类型的内存都有一些重要的特性:
- 总大小(total size);
- 数据块大小(block size);
- 延迟(latency),即获取一个字节需要多少时间;
- 带宽(bandwidth),可能高于单纯用数据块大小乘以延迟时间,这意味着I/O操作可能有重叠;
- 摊销成本,包括芯片的价格、功耗、维护等。
下面是2021年的消费级硬件的大致对比表:
Type | M | B | Latency | Bandwidth | $/GB/mo |
---|---|---|---|---|---|
L1 | 10K | 64B | 2ns | 80G/s | - |
L2 | 100K | 64B | 5ns | 40G/s | - |
L3 | 1M/core | 64B | 20ns | 20G/s | - |
RAM | GBs | 64B | 100ns | 10G/s | 1.5 |
SSD | TBs | 4K | 0.1ms | 5G/s | 0.17 |
HDD | TBs | - | 10ms | 1G/s | 0.04 |
S3 | ∞ | - | 150ms | ∞ | 0.02 |
事实上,每种类型的存储都有各自的特点,我们会大致介绍一遍。
易失性存储器
RAM层级以上的存储都被称为易失性存储器(volatile memory),因为在出现断电和其他故障时,它不会持久保存数据。但它的速度很快,这也是为什么在计算机上电时用它来存储临时数据。
从快到慢:
- CPU寄存器,这是CPU用来储存其所有中间值的零耗时数据访问单元,也可以理解为一种存储类型。它们的数量有限(例如,只有16个“通用”寄存器),在某些情况下,出于性能原因你可能想要使用所有的寄存器。
- CPU缓存,现代CPU拥有多层缓存(L1,L2,通常是L3,很少有L4)。最低层是核心之间共享的,通常与核心的数量成比例(例如,一个10核心的CPU应该有大约10M的L3缓存)。
- 随机访问内存(RAM,random access memory),是第一种可扩展的内存类型:现在,你可以在公有云上租用带0.5T RAM的机器。这是你大部分的工作数据应该储存的地方。
CPU缓存系统有一个重要的概念——缓存行(chche line),这是CPU和RAM之间进行数据传输的基本单元。在大多数架构上,缓存行的大小是64字节,这意味着所有主内存都被划分为64字节的块,无论你是否需要,只要你请求(读取或写入)一个字节,你也会获取它所有的63个缓存行“邻居”。
CPU级别的缓存操作会根据缓存行的最后访问时间自动完成。被访问时,缓存行的内容会被放置在最低的缓存层(L1),然后被逐渐“驱逐”到更高的级别,除非在短时间内被再次访问。程序员无法显式地控制这个过程,但是深入了解其工作原理是非常有价值的,我们会在下一章中详细讨论。
非易失性存储器
CPU缓存和RAM中的数据单元只地储存了少量的电子(这些电子会周期性地泄露并需要周期性地刷新),而非易失性存储(non-volatile memory)类型中的数据单元却储存了数百个电子。这让数据能在断电的情况下长期保持,但代价是性能和耐用性——因为当你有更多的电子时,它们与硅原子碰撞的机会也就更多。
有许多方法可以持久地储存数据,但从程序员的角度看,以下是主要的:
- 固态硬盘(SSD,solid state drives)。这些硬盘的延迟相对较低,大约为0.1毫秒(纳秒),但它们的价格也相对较高,特别是考虑到每个数据单元只能被写入有限的次数,因此它们的寿命有限。这是移动设备和大多数笔记本电脑使用的硬盘,因为SSD结构紧凑,没有活动部件(更耐摔)。
- 机械硬盘(HDD,Hard disk drives)很特别,因为它们实际上是旋转的物理磁盘,磁头附着在上面。要读取一个存储位置,你需要等待磁盘旋转到正确的位置,然后非常精确地移动磁头到那个位置。这就导致一些非常奇特的访问模式,例如随机读取一个字节可能需要与读取接下来的1MB数据相同的时间 —— 这通常在毫秒级别。由于机械硬盘是计算机中唯一一个有机械运动部件的部分(除了冷却系统外),因此机械硬盘经常出故障(数据中心的HDD平均寿命约为3年)。
- 网络附加存储(Network-attached storage),这是利用其他网络设备进行数据存储的做法。主要有两种类型。第一种是网络文件系统(Network File System,NFS),这是一种通过网络挂载另一台计算机的文件系统的协议。另一种是基于API的分布式存储系统,最著名的是Amazon S3,它们由公共云的一群做过存储优化的机器支持,内部通常使用便宜的HDD或一些更特化的存储类型。虽然位于同一数据中心的NFS有时甚至可以比HDD工作得更快,但存储在公共云中的对象通常具有50-100毫秒的延迟。这些存储系统通常会采用分布式并进行数据复制,以提高数据的可用性。
SSD和HDD的速度显著低于RAM,因此通常将这个级别及以下的所有存储设备称为外部存储(external memory)。
与CPU缓存不同,外部存储可以被显式控制,这在许多情况下是有用的。然而,大部分程序员更愿意对其进行抽象处理,将其作为主内存的扩展使用。操作系统通过虚拟内存的方式能够实现这种抽象化,用户可以像操作内存一样直接操作这些外部存储,更简便地执行各种存储操作。
参考资料
- 价格信息取自Google Cloud Platform。
- 云存储通常有多个价位,访问数据的频率越低,价格就越便宜。