⼤家如果想⾃⼰组装电脑的话,肯定需要购买⼀个 CPU,但是存储器⽅⾯的设备,分类⽐较多,那我们肯 定不能只买⼀种存储器,⽐如你除了要买内存,还要买硬盘,⽽针对硬盘我们还可以选择是固态硬盘还是机械硬盘。
相信⼤家都知道内存和硬盘都属于计算机的存储设备,断电后内存的数据是会丢失的,⽽硬盘则不会,因为硬盘是持久化存储设备,同时也是⼀个 I/O 设备。
但其实 CPU 内部也有存储数据的组件,这个应该⽐较少⼈注意到,⽐如寄存器、CPU L1/L2/L3 Cache也都是属于存储设备,只不过它们能存储的数据⾮常⼩,但是它们因为靠近 CPU 核⼼,所以访问速度都⾮常快,快过硬盘好⼏个数量级别。
问题来了,那机械硬盘、固态硬盘、内存这三个存储器,到底和 CPU L1 Cache 相⽐速度差多少倍呢?
在回答这个问题之前,我们先来看看「存储器的层次结构」,好让我们对存储器设备有⼀个整体的认识。
存储器的层次结构
我们想象中⼀个场景,⼤学期末准备考试了,你前去图书馆临时抱佛脚。那么,在看书的时候,我们的⼤脑会思考问题,也会记忆知识点,另外我们通常也会把常⽤的书放在⾃⼰的桌⼦上,当我们要找⼀本不常⽤的书,则会去图书馆的书架找。
就是这么⼀个⼩⼩的场景,已经把计算机的存储结构基本都涵盖了。
我们可以把 CPU ⽐喻成我们的⼤脑,⼤脑正在思考的东⻄,就好⽐ CPU 中的寄存器,处理速度是最快的,但是能存储的数据也是最少的,毕竟我们也不能⼀下同时思考太多的事情,除⾮你练过。
我们⼤脑中的记忆,就好⽐ CPU Cache,中⽂称为 CPU ⾼速缓存,处理速度相⽐寄存器慢了⼀点,但是能存储的数据也稍微多了⼀些。
CPU Cache 通常会分为 L1、L2、L3 三层,其中 L1 Cache 通常分成「数据缓存」和「指令缓存」,L1是距离 CPU 最近的,因此它⽐ L2、L3 的读写速度都快、存储空间都⼩。我们⼤脑中短期记忆,就好⽐L1 Cache,⽽⻓期记忆就好⽐ L2/L3 Cache。
寄存器和 CPU Cache 都是在 CPU 内部,跟 CPU 挨着很近,因此它们的读写速度都相当的快,但是能存储的数据很少,毕竟 CPU 就这么丁点⼤。
知道 CPU 内部的存储器的层次分布,我们放眼看看 CPU 外部的存储器。当我们⼤脑记忆中没有资料的时候,可以从书桌或书架上拿书来阅读,那我们桌⼦上的书,就好⽐内存, 我们虽然可以⼀伸⼿就可以拿到,但读写速度肯定远慢于寄存器,那图书馆书架上的书,就好⽐硬盘,能
存储的数据⾮常⼤,但是读写速度相⽐内存差好⼏个数量级,更别说跟寄存器的差距了。
我们从图书馆书架取书,把书放到桌⼦上,再阅读书,我们⼤脑就会记忆知识点,然后再经过⼤脑思考,这⼀系列过程相当于,数据从硬盘加载到内存,再从内存加载到 CPU 的寄存器和 Cache 中,然后再通过CPU 进⾏处理和计算。
对于存储器,它的速度越快、能耗会越⾼、⽽且材料的成本也是越贵的,以⾄于速度快的存储器的容量都 ⽐较⼩。
CPU ⾥的寄存器和 Cache,是整个计算机存储器中价格最贵的,虽然存储空间很⼩,但是读写速度是极快的,⽽相对⽐较便宜的内存和硬盘,速度肯定⽐不上 CPU 内部的存储器,但是能弥补存储空间的不⾜。
存储器通常可以分为这么⼏个级别:
寄存器
最靠近 CPU 的控制单元和逻辑计算单元的存储器,就是寄存器了,它使⽤的材料速度也是最快的,因此价格也是最贵的,那么数量不能很多。
存储器的数量通常在⼏⼗到⼏百之间,每个寄存器可以⽤来存储⼀定的字节(byte)的数据。⽐如:
32 位 CPU 中⼤多数寄存器可以存储 4 个字节; 64 位 CPU 中⼤多数寄存器可以存储 8 个字节。 寄存器的访问速度⾮常快,⼀般要求在半个 CPU 时钟周期内完成读写,CPU 时钟周期跟 CPU 主频息息相关,⽐如 2 GHz 主频的 CPU,那么它的时钟周期就是 1/2G,也就是 0.5ns(纳秒)。
CPU 处理⼀条指令的时候,除了读写寄存器,还需要解码指令、控制指令执⾏和计算。如果寄存器的速度太慢,则会拉⻓指令的处理周期,从⽽给⽤户的感觉,就是电脑「很慢」。
CPU Cache
CPU Cache ⽤的是⼀种叫 SRAM(Static Random-Access Memory,静态随机存储器) 的芯⽚。
SRAM 之所以叫「静态」存储器,是因为只要有电,数据就可以保持存在,⽽⼀旦断电,数据就会丢失了。
在 SRAM ⾥⾯,⼀个 bit 的数据,通常需要 6 个晶体管,所以 SRAM 的存储密度不⾼,同样的物理空间下,能存储的数据是有限的,不过也因为 SRAM 的电路简单,所以访问速度⾮常快。
CPU 的⾼速缓存,通常可以分为 L1、L2、L3 这样的三层⾼速缓存,也称为⼀级缓存、⼆次缓存、三级缓存。
L1 高速缓存
L1 ⾼速缓存的访问速度⼏乎和寄存器⼀样快,通常只需要 2~4 个时钟周期,⽽⼤⼩在⼏⼗ KB 到⼏百KB 不等。
每个 CPU 核⼼都有⼀块属于⾃⼰的 L1 ⾼速缓存,指令和数据在 L1 是分开存放的,所以 L1 ⾼速缓存通常分成指令缓存和数据缓存。
在 Linux 系统,我们可以通过这条命令,查看 CPU ⾥的 L1 Cache 「数据」缓存的容量⼤⼩:
$ cat /sys/devices/system/cpu/cpu0/cache/index0/size
32K
⽽查看 L1 Cache 「指令」缓存的容量⼤⼩,则是:
$ cat /sys/devices/system/cpu/cpu0/cache/index1/size
32K
L2 高速缓存
L2 ⾼速缓存同样每个 CPU 核⼼都有,但是 L2 ⾼速缓存位置⽐ L1 ⾼速缓存距离 CPU 核⼼ 更远,它⼤⼩⽐ L1 ⾼速缓存更⼤,CPU 型号不同⼤⼩也就不同,通常⼤⼩在⼏百 KB 到⼏ MB 不等,访问速度则更慢,速度在 10~20 个时钟周期。
在 Linux 系统,我们可以通过这条命令,查看 CPU ⾥的 L2 Cache 的容量⼤⼩:
$ cat /sys/devices/system/cpu/cpu0/cache/index2/size
256K
L3 高速缓存
L3 ⾼速缓存通常是多个 CPU 核⼼共⽤的,位置⽐ L2 ⾼速缓存距离 CPU 核⼼ 更远,⼤⼩也会更⼤些,通常⼤⼩在⼏ MB 到⼏⼗ MB 不等,具体值根据 CPU 型号⽽定。
访问速度相对也⽐较慢⼀些,访问速度在 20~60 个时钟周期。
在 Linux 系统,我们可以通过这条命令,查看 CPU ⾥的 L3 Cache 的容量⼤⼩:
$ cat /sys/devices/system/cpu/cpu0/cache/index3/size
3072K
内存
内存⽤的芯⽚和 CPU Cache 有所不同,它使⽤的是⼀种叫作 DRAM (Dynamic Random Access Memory,动态随机存取存储器) 的芯⽚。
相⽐ SRAM,DRAM 的密度更⾼,功耗更低,有更⼤的容量,⽽且造价⽐ SRAM 芯⽚便宜很多。
DRAM 存储⼀个 bit 数据,只需要⼀个晶体管和⼀个电容就能存储,但是因为数据会被存储在电容⾥,电容会不断漏电,所以需要「定时刷新」电容,才能保证数据不会被丢失,这就是 DRAM 之所以被称为「动态」存储器的原因,只有不断刷新,数据才能被存储起来。
DRAM 的数据访问电路和刷新电路都⽐ SRAM 更复杂,所以访问的速度会更慢,内存速度⼤概在
200~300 个 时钟周期之间。
SSD/HDD 硬盘
SSD(Solid-state disk) 就是我们常说的固体硬盘,结构和内存类似,但是它相⽐内存的优点是断电后数据还是存在的,⽽内存、寄存器、⾼速缓存断电后数据都会丢失。内存的读写速度⽐ SSD ⼤概快10~1000 倍。
当然,还有⼀款传统的硬盘,也就是机械硬盘(Hard Disk Drive, HDD),它是通过物理读写的⽅式来访问数据的,因此它访问速度是⾮常慢的,它的速度⽐内存慢 10W 倍左右。
由于 SSD 的价格快接近机械硬盘了,因此机械硬盘已经逐渐被 SSD 替代了。
存储器的层次关系
现代的⼀台计算机,都⽤上了 CPU Cahce、内存、到 SSD 或 HDD 硬盘这些存储器设备了。
其中,存储空间越⼤的存储器设备,其访问速度越慢,所需成本也相对越少。
CPU 并不会直接和每⼀种存储器设备直接打交道,⽽是每⼀种存储器设备只和它相邻的存储器设备打交道。
⽐如,CPU Cache 的数据是从内存加载过来的,写回数据的时候也只写回到内存,CPU Cache 不会直接把数据写到硬盘,也不会直接从硬盘加载数据,⽽是先加载到内存,再从内存加载到 CPU Cache 中。
所以,每个存储器只和相邻的⼀层存储器设备打交道,并且存储设备为了追求更快的速度,所需的材料成本必然也是更高,也正因为成本太高,所以 CPU 内部的寄存器、L1\L2\L3 Cache 只好⽤较⼩的容量,相反内存、硬盘则可⽤更⼤的容量,这就我们今天所说的存储器层次结构。
另外,当 CPU 需要访问内存中某个数据的时候,如果寄存器有这个数据,CPU 就直接从寄存器取数据即可,如果寄存器没有这个数据,CPU 就会查询 L1 ⾼速缓存,如果 L1 没有,则查询 L2 ⾼速缓存,L2 还是没有的话就查询 L3 ⾼速缓存,L3 依然没有的话,才去内存中取数据。
存储器之间的实际价格和性能差距
前⾯我们知道了,速度越快的存储器,造价成本往往也越⾼,那我们就以实际的数据来看看,不同层级的存储器之间的性能和价格差异。
下⾯这张表格是不同层级的存储器之间的成本对⽐图:
你可以看到 L1 Cache 的访问延时是 1 纳秒,⽽内存已经是 100 纳秒了,相⽐ L1 Cache 速度慢了 100倍。另外,机械硬盘的访问延时更是⾼达 10 毫秒,相⽐ L1 Cache 速度慢了 10000000 倍,差了好⼏个数量级别。
在价格上,每⽣成 MB ⼤⼩的 L1 Cache 相⽐内存贵了 466 倍,相⽐机械硬盘那更是贵了 175000
倍。 我在某东逛了下各个存储器设备的零售价,8G 内存 + 1T 机械硬盘 + 256G 固态硬盘的总价格,都不及⼀块 Intle i5-10400 的 CPU 的价格,这款 CPU 的⾼速缓存的总⼤⼩也就⼗多 MB。
总结
各种存储器之间的关系,可以⽤我们在图书馆学习这个场景来理解。
CPU 可以⽐喻成我们的⼤脑,我们当前正在思考和处理的知识的过程,就好⽐ CPU 中的寄存器处理数据的过程,速度极快,但是容量很⼩。⽽ CPU 中的 L1-L3 Cache 好⽐我们⼤脑中的短期记忆和⻓期记忆, 需要⼩⼩花费点时间来调取数据并处理。
我们⾯前的桌⼦就相当于内存,能放下更多的书(数据),但是找起来和看起来就要花费⼀些时间,相⽐ CPU Cache 慢不少。⽽图书馆的书架相当于硬盘,能放下⽐内存更多的数据,但找起来就更费时间了,可 以说是最慢的存储器设备了。
从 寄存器、CPU Cache,到内存、硬盘,这样⼀层层下来的存储器,访问速度越来越慢,存储容量越来越⼤,价格也越来越便宜,⽽且每个存储器只和相邻的⼀层存储器设备打交道,于是这样就形成了存储器的层次结构。
再来回答,开头的问题:那机械硬盘、固态硬盘、内存这三个存储器,到底和 CPU L1 Cache 相⽐速度差多少倍呢?
CPU L1 Cache 随机访问延时是 1 纳秒,内存则是 100 纳秒,所以 CPU L1 Cache ⽐内存快 100 倍左右。
SSD 随机访问延时是 150 微妙,所以 CPU L1 Cache ⽐ SSD 快 150000 倍左右。
最慢的机械硬盘随机访问延时已经⾼达 10 毫秒,我们来看看机械硬盘到底有多「⻳速」:
SSD ⽐机械硬盘快 70 倍左右; 内存⽐机械硬盘快 100000 倍左右; CPU L1 Cache ⽐机械硬盘快 10000000 倍左右; 我们把上述的时间⽐例差异放⼤后,就能⾮常直观感受到它们的性能差异了。如果 CPU 访问 L1 Cache 的缓存时间是 1 秒,那访问内存则需要⼤约 2 分钟,随机访问 SSD ⾥的数据则需要 1.7 天,访问机械硬盘那更久,⻓达近 4 个⽉。
可以发现,不同的存储器之间性能差距很⼤,构造存储器分级很有意义,分级的⽬的是要构造缓存体系。