You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

119 lines
12 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 35 | 存储器层次结构全景:数据存储的大金字塔长什么样?
今天开始,我们要进入到计算机另一个重要的组成部分,存储器。
如果你自己组装过PC机你肯定知道想要CPU我们只要买一个就好了但是存储器却有不同的设备要买。比方说我们要买内存还要买硬盘。买硬盘的时候不少人会买一块SSD硬盘作为系统盘还会买上一块大容量的HDD机械硬盘作为数据盘。内存和硬盘都是我们的存储设备。而且像硬盘这样的持久化存储设备同时也是一个I/O设备。
在实际的软件开发过程中我们常常会遇到服务端的请求响应时间长吞吐率不够的情况。在分析对应问题的时候相信你没少听过类似“主要瓶颈不在CPU而在I/O”的论断。可见存储在计算机中扮演着多么重要的角色。那接下来这一整个章节我会为你梳理和讲解整个存储器系统。
这一讲,我们先从存储器的层次结构说起,让你对各种存储器设备有一个整体的了解。
## 理解存储器的层次结构
在有计算机之前,我们通常把信息和数据存储在书、文件这样的物理介质里面。有了计算机之后,我们通常把数据存储在计算机的存储器里面。而存储器系统是一个通过各种不同的方法和设备,一层一层组合起来的系统。下面,我们把计算机的存储器层次结构和我们日常生活里处理信息、阅读书籍做个对照,好让你更容易理解、记忆存储器的层次结构。
我们常常把CPU比喻成计算机的“大脑”。我们思考的东西就好比CPU中的**寄存器**Register。寄存器与其说是存储器其实它更像是CPU本身的一部分只能存放极其有限的信息但是速度非常快和CPU同步。
而我们大脑中的记忆,就好比**CPU Cache**CPU高速缓存我们常常简称为“缓存”。CPU Cache用的是一种叫作**SRAM**Static Random-Access Memory静态随机存取存储器的芯片。
### SRAM
SRAM之所以被称为“静态”存储器是因为只要处在通电状态里面的数据就可以保持存在。而一旦断电里面的数据就会丢失了。在SRAM里面一个比特的数据需要68个晶体管。所以SRAM的存储密度不高。同样的物理空间下能够存储的数据有限。不过因为SRAM的电路简单所以访问速度非常快。
![](https://static001.geekbang.org/resource/image/25/99/25c619a683c161d3678c7339aa34d399.png)
[图片来源](https://commons.wikimedia.org/wiki/File:SRAM_Cell_(6_Transistors)
6个晶体管组成SRAM的一个比特
在CPU里通常会有L1、L2、L3这样三层高速缓存。每个CPU核心都有一块属于自己的L1高速缓存通常分成**指令缓存**和**数据缓存**分开存放CPU使用的指令和数据。
不知道你还记不记得我们在[第22讲](https://time.geekbang.org/column/article/100569)讲过的哈佛架构这里的指令缓存和数据缓存其实就是来自于哈佛架构。L1的Cache往往就嵌在CPU核心的内部。
L2的Cache同样是每个CPU核心都有的不过它往往不在CPU核心的内部。所以L2 Cache的访问速度会比L1稍微慢一些。而L3 Cache则通常是多个CPU核心共用的尺寸会更大一些访问速度自然也就更慢一些。
你可以把CPU中的L1 Cache理解为我们的短期记忆把L2/L3 Cache理解成长期记忆把内存当成我们拥有的书架或者书桌。 当我们自己记忆中没有资料的时候可以从书桌或者书架上拿书来翻阅。这个过程中就相当于数据从内存中加载到CPU的寄存器和Cache中然后通过“大脑”也就是CPU进行处理和运算。
### DRAM
内存用的芯片和Cache有所不同它用的是一种叫作**DRAM**Dynamic Random Access Memory动态随机存取存储器的芯片比起SRAM来说它的密度更高有更大的容量而且它也比SRAM芯片便宜不少。
DRAM被称为“动态”存储器是因为DRAM需要靠不断地“刷新”才能保持数据被存储起来。DRAM的一个比特只需要一个晶体管和一个电容就能存储。所以DRAM在同样的物理空间下能够存储的数据也就更多也就是存储的“密度”更大。但是因为数据是存储在电容里的电容会不断漏电所以需要定时刷新充电才能保持数据不丢失。DRAM的数据访问电路和刷新电路都比SRAM更复杂所以访问延时也就更长。
![](https://static001.geekbang.org/resource/image/be/b8/befed615bf50df878b26455288eccbb8.png)
### 存储器的层级结构
整个存储器的层次结构其实都类似于SRAM和DRAM在性能和价格上的差异。SRAM更贵速度更快。DRAM更便宜容量更大。SRAM好像我们的大脑中的记忆而DRAM就好像属于我们自己的书桌。
大脑CPU中的记忆L1 Cache不仅受成本层面的限制更受物理层面的限制。这就好比L1 Cache不仅昂贵其访问速度和它到CPU的物理距离有关。芯片造得越大总有部分离CPU的距离会变远。电信号的传输速度又受物理原理的限制没法超过光速。所以想要快并不是靠多花钱就能解决的。
我们自己的书房和书桌(也就是内存)空间一般是有限的,没有办法放下所有书(也就是数据)。如果想要扩大空间的话,就相当于要多买几平方米的房子,成本就会很高。于是,想要放下更多的书,我们就要寻找更加廉价的解决方案。
没错,我们想到了公共图书馆。对于内存来说,**SSD**Solid-state drive或Solid-state disk固态硬盘、**HDD**Hard Disk Drive硬盘这些被称为**硬盘**的外部存储设备,就是公共图书馆。于是,我们就可以去家附近的图书馆借书了。图书馆有更多的空间(存储空间)和更多的书(数据)。
你应该也在自己的个人电脑上用过SSD硬盘。过去几年SSD这种基于NAND芯片的高速硬盘价格已经大幅度下降。
而HDD硬盘则是一种完全符合“磁盘”这个名字的传统硬件。“磁盘”的硬件结构决定了它的访问速度受限于它的物理结构是最慢的。
这些我们后面都会详细说,你可以对照下面这幅图了解一下,对存储器层次之间的作用和关联有个大致印象就可以了。
![](https://static001.geekbang.org/resource/image/ab/0a/ab345017c3f662b15e15e97e0ca1db0a.png)
存储器的层次关系图
从Cache、内存到SSD和HDD硬盘一台现代计算机中就用上了所有这些存储器设备。其中容量越小的设备速度越快而且CPU并不是直接和每一种存储器设备打交道而是每一种存储器设备只和它相邻的存储设备打交道。比如CPU Cache是从内存里加载而来的或者需要写回内存并不会直接写回数据到硬盘也不会直接从硬盘加载数据到CPU Cache中而是先加载到内存再从内存加载到Cache中。
**这样,各个存储器只和相邻的一层存储器打交道,并且随着一层层向下,存储器的容量逐层增大,访问速度逐层变慢,而单位存储成本也逐层下降,也就构成了我们日常所说的存储器层次结构。**
## 使用存储器的时候,该如何权衡价格和性能?
存储器在不同层级之间的性能差异和价格差异都至少在一个数量级以上。L1 Cache的访问延时是1纳秒ns而内存就已经是100纳秒了。在价格上这两者也差出了400倍。
我这里放了一张各种存储器成本的对比表格,你可以看看。你也可以在点击这个[链接](https://people.eecs.berkeley.edu/~rcs/research/interactive_latency.html)通过拖拉查看19902020年随着硬件设备的进展访问延时的变化。
![](https://static001.geekbang.org/resource/image/d3/a6/d39b0f2b3962d646133d450541fb75a6.png)
因为这个价格和性能的差异,你会看到,我们实际在进行电脑硬件配置的时候,会去组合配置各种存储设备。
我们可以找一台现在主流的笔记本电脑来看看比如一款入门级的惠普战66的笔记本电脑。今天在京东上的价格是4999人民币。它的配置是下面这样的。
1. Intle i5-8265U的CPU这是一块4核的CPU
* 这块CPU每个核有32KB一共128KB的L1指令Cache。
* 同样每个核还有32KB一共128KB的L1数据Cache指令Cache和数据Cache都是采用8路组相连的放置策略。
* 每个核有256KB一共1MB的L2 Cache。L2 Cache是用4路组相连的放置策略。
* 最后还有一块多个核心共用的12MB的L3 Cache采用的是12路组相连的放置策略。
1. 8GB的内存
2. 一块128G的SSD硬盘
3. 一块1T的HDD硬盘
你可以看到在一台实际的计算机里面越是速度快的设备容量就越小。这里一共十多兆的Cache成本只是几十美元。而8GB的内存、128G的SSD以及1T的HDD大概零售价格加在一起也就和我们的高速缓存的价格差不多。
## 总结延伸
这节的内容不知道你掌握了多少呢?为了帮助你记忆,我这里再带你复习一下本节的重点。
我们常常把CPU比喻成高速运转的大脑那么和大脑同步的寄存器Register就存放着我们当下正在思考和处理的数据。而L1-L3的CPU Cache好比存放在我们大脑中的短期到长期的记忆。我们需要小小花费一点时间就能调取并进行处理。
我们自己的书桌书架就好比计算机的内存能放下更多的书也就是数据但是找起来和看起来就要慢上不少。而图书馆更像硬盘这个外存能够放下更多的数据找起来也更费时间。从寄存器、CPU Cache到内存、硬盘这样一层层下来的存储器速度越来越慢空间越来越大价格也越来越便宜。
这三个“越来越”的特性,使得我们在组装计算机的时候,要组合使用各种存储设备。越是快且贵的设备,实际在一台计算机里面的存储空间往往就越小。而越是慢且便宜的设备,在实际组装的计算机里面的存储空间就会越大。
在后面的关于存储器的内容里,我会带着你进一步深入了解,各个层次的存储器是如何运作的,在不同类型的应用和性能要求下,是否可以靠人工添加一层缓存层来解决问题,以及在程序开发层面,如何利用好不同层次的存储器设备的访问原理和特性。
## 补充阅读
如果你学有余力,关于不同存储器的访问延时数据,有两篇文章推荐给你阅读。
第一个是Peter Novig的[_Teach Yourself Programming in Ten Years_](http://norvig.com/21-days.html#answers)。我推荐你在了解这些数据之后读一读这篇文章。这些数字随着摩尔定律的发展在不断缩小,但是在数量级上仍然有着很强的参考价值。
第二个是Jeff Dean的[_Build Software Systems at Google and Lessons Learned_](https://research.google.com/people/jeff/Stanford-DL-Nov-2010.pdf)。这份PPT中不仅总结了这些数字还有大量的硬件故障、高可用和系统架构的血泪经验。尽管这是一份10年前的PPT但也非常值得阅读。
## 课后思考
最后给你留一道思考题。在上世纪8090年代3.5寸的磁盘大行其道。它的存储空间只有1.44MB比起当时40MB的硬盘它却被大家认为是“海量”存储的主要选择。你猜一猜这是为什么
欢迎把你思考的结果写在留言区。如果觉得有收获,你也可以把这篇文章分享给你的朋友,和他一起讨论和学习。