1. 存储器的层次结构

场景:周六去图书馆学校,通常会把一些常⽤的书 放在桌⼦上,当需要⼀本桌上没有的书,则去书架上找。另外,看书时 ⼤脑会思考问题,也会记忆知识内容。
可以把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自身大小就有限制)

当⼤脑记忆中也没有资料时,可以从书桌或书架上拿书来阅读。桌⼦上的书,就好⽐内存,虽然触手可及,但读写速度也 远慢于寄存器;书架上的书,就好⽐硬盘,虽然能存储的数据⾮常多,但是读写速度 相⽐内存要差好几个数量级,更别说跟寄存器相比了。

                                    (1)从图书馆书架取书 放到桌⼦上;(2)开始阅读 ⼤脑就会获取知识内容;(3)然后再经过⼤脑思考;
这⼀系列过程相当于:(1)数据从硬盘加载到内存;(2)再从内存加载到 CPU 的寄存器和 Cache 中;(3)然后再通过CPU 进⾏处理和计算;
对于存储器来说,它的速度越快、能耗就会越高、材料成本也会越高。因此速度快的存储器 的容量都比较小。
CPU里的 寄存器和Cache 是整个计算机存储器中价格最贵的,虽然存储空间很⼩,但读写速度极快。⽽相对⽐较便宜的 内存和硬盘,虽然速度比 CPU的内部存储器 慢很多,但存储空间要大很多。

存储器通常可以分为如下几个级别:

  • 寄存器
  • CPU Cache:L1-Cache、L2-Cache、L3-Cahce
  • 内存
  • SSD/HDD 硬盘

(1) 寄存器:
最靠近CPU的控制单元和逻辑计算单元的存储器 就是寄存器。寄存器的 材料成本最高,速度最快,因此寄存器的数量有限
寄存器的数量通常在 几十到几百之间,每个寄存器可以⽤来 存储⼀定字节的数据。⽐如:
  • 32位CPU 中⼤多数寄存器可以存储 4个字节
  • 64位CPU 中⼤多数寄存器可以存储 8个字节
寄存器的访问速度⾮常快,⼀般要求在 半个CPU时钟周期 完成读写。
CPU执行⼀条指令时,除了读写寄存器,还需要解码指令、控制指令的执⾏和计算。(如果读写寄存器的速度太慢,则会拉⻓指令的处理周期,从而延长程序执行的时间)


(2) CPU Cache:
CPU Cache 用的是⼀种称为 SRAM(静态随机存储器)  的芯片。
SRAM之所以称为 静态随机存储器,是因为 只有在保持供电的情况下,数据才可以保持存在,而一旦断电,数据就会丢失
SRAM内部,存储1bit数据通常需要 6个晶体管,所以SRAM的存储密度不高,同样的物理空间下 能存储的数据有限。但是也因为 SRAM的电路简单,因此访问速度非常快
CPU的高速缓存,通常可以分为 L1、L2、L3 三层高速缓存,也称为⼀级缓存、⼆次缓存、三次缓存。

L1 高速缓存:
L1高速缓存的访问速度 几乎和寄存器⼀样快,通常只需要 2~4 个时钟周期,而大小在 几十KB到几百KB 不等。
每个CPU核心 都有一块 L1高速缓存,指令和数据在L1中 是分开存放的,所以 L1高速缓存 通常分成 指令缓存数据缓存
1. Linux系统中,查看CPU的 L1 Cache数据缓存 的容量大小 的指令:
        $ cat /sys/devices/system/cpu/cpu0/cache/index0/size
        32K
2. 查看CPU的 L1 Cache指令缓存 的容量大小 的指令:
        $ cat /sys/devices/system/cpu/cpu0/cache/index1/size
        32K
L2 高速缓存:
每个CPU核心 也都有一块 L2高速缓存, L2高速缓存比L1高速缓存 距离CPU核心更远,但L2高速缓存的大小比 L1高速缓存更大,大小在 几百KB到几MB 不等,因此 L2访问速度更慢,通常需要 10~20 个时钟周期
1. Linux系统中,查看CPU的 L2 Cache 的容量大小 的指令:
        $ cat /sys/devices/system/cpu/cpu0/cache/index2/size
        256K
L3 高速缓存:
L3 高速缓存通常 多个CPU核心 共用,位置比 L2高速缓存 距离CPU核心更远,但L3高速缓存的大小比 L2高速缓存更大,大小在 几MB到几十MB 不等。因此 L3访问速度更慢,通常需要 20~60 个时钟周期
1. Linux系统中,查看CPU的 L3 Cache 的容量大小 的指令:
        $ cat /sys/devices/system/cpu/cpu0/cache/index3/size
        3072K


(3) 内存:
内存用的芯片 与CPU Cache有所不同,它使⽤的是⼀种称为 DRAM (动态随机存取存储器) 的芯⽚。
相比SRAM,DRAM的密度更高,功耗更低,有更大的容量,而且成本比 SRAM芯片 便宜很多
在DRAM内部, 存储1bit数据只需要 ⼀个晶体管和⼀个电容,所以DRAM的存储密度更高,同样的物理空间下 能存储的数据比SRAM更多
DRAM之所以称为 动态随机存储器,是因为 数据存储在电容⾥,电容会不断漏电,所以需要 定时刷新电容,才能保证数据不会被丢失,只有不断刷新电容,数据才能被持续存储起来。
DRAM的 数据访问电路和刷新电路 都比SRAM更复杂,所以访问的速度更慢,访问内存通常需要 200~300 个时钟周期之间。


(4) SSD/HDD 硬盘:
  • SSD硬盘:也称为 固态硬盘,结构和内存类似,但SSD相⽐内存的优点是 断电后数据依旧存在,而 寄存器、⾼速缓存、内存 断电后数据都会丢失。SSD读写速度比内存 慢10~1000倍左右
  • HDD硬盘:也称为 机械硬盘,通过物理读写的方式来访问数据,因此访问速度很慢,HDD读写速度比内存 慢10W倍左右
由于SSD的价格 逐渐接近机械硬盘,因此机械硬盘也逐渐 被SSD替代。

2. 存储器的层次关系

CPU并不会 和所有存储器设备 直接打交道,每⼀种存储器设备只和 它相邻的存储器设备 打交道。(比如,CPU Cache 的数据是 从内存加载过来的,写回数据的时 也是写回到内存。CPU Cache 不会直接把数据 写到硬盘,也不会直接从硬盘 加载数据,⽽是先将数据从硬盘 加载到内存,再从内存加载到 CPU Cache 中)

每个存储器只和 相邻的⼀层存储器设备 打交道。存储设备的访问速度越快,成本必然也会越⾼,为了同时兼顾 成本和速度,所以CPU内部的 寄存器、L1\L2\L3 Cache 只用较小的容量,而 内存、硬盘 则用更大的容量,也就形成上图所示的 存储器层次结构。

当CPU需要访问 内存中的某个数据时,如果寄存器中有这个数据,CPU就可以 直接从寄存器中读取数据,如果寄存器中没有这个数据,CPU 就会查询L1高速缓存,如果L1中也没有,则查询L2⾼速缓存,如果L2中还是没有,就查询L3高速缓存,如果L3中依然没有的话,才去内存中读取数据。

注:可以看出,存储层次结构 也形成了 缓存体系

3. 存储器之间的实际价格和性能差距