存储器分级策略
不能用一块存储器来解决所有的需求,那就必须把需求分级。
一种可行的方案,
- 根据数据的使用频率使用不同的存储器:
- 高频使用的数据,读写越快越好,因此用最贵的材料,放到离 CPU 最近的位置;
- 使用频率越低的数据,我们放到离 CPU 越远的位置,用越便宜的材料。
寄存器分为6个级别
- 寄存器;
- L1-Cache;
- L2-Cache;
- L3-Cahce;
- 内存;
- 硬盘/SSD。
寄存器 --> l1-cache --> l2-cache --> l3-cache --> 内存 --> SSD/磁盘
从左到右,距离CPU逐渐变远,读取速度逐渐减低,空间逐渐增大。
寄存器:
寄存器紧挨着CPU的控制单元和逻辑计算单元,所以使用的材料是速度最快的,因而储存的速度最快,耗能就最高,产热就最大,而且花费也是最贵的,因此数量不多.
- 32 位 CPU 中大多数寄存器可以存储 4 个字节;
- 64 位 CPU 中大多数寄存器可以存储 8 个字节。
寄存器的访问速度非常快,一般在半个CPU时钟周期内完成
L1-Cache
L1- 缓存在 CPU 中,相比寄存器,虽然它的位置距离 CPU 核心更远,但造价更低。通常 L1-Cache 大小在几十 Kb 到几百 Kb 不等,读写速度在 2~4 个 CPU 时钟周期。
L2-Cache
L2- 缓存也在 CPU 中,位置比 L1- 缓存距离 CPU 核心更远。它的大小比 L1-Cache 更大,具体大小要看 CPU 型号,有 2M 的,也有更小或者更大的,速度在 10~20 个 CPU 周期。
L3-Cache
L3- 缓存同样在 CPU 中,位置比 L2- 缓存距离 CPU 核心更远。大小通常比 L2-Cache 更大,读写速度在 20~60 个 CPU 周期。
L3 缓存大小也是看型号的,比如 i9 CPU 有 512KB L1 Cache;有 2MB L2 Cache; 有16MB L3 Cache。
内存
内存的主要材料是半导体硅,是插在主板上工作的。因为它的位置距离 CPU 有一段距离,所以需要用总线和 CPU 连接。因为内存有了独立的空间,所以体积更大,造价也比上面提到的存储器低得多。现在有的个人电脑上的内存是 16G,但有些服务器的内存可以到几个 T。内存速度大概在 200~300 个 CPU 周期之间。
SSD和硬盘
SSD也叫固态硬盘结构和内存类似,
主要的优点就是在于断电后数据还在.内存,寄存器,缓存断电后数据就消失了.内存的内存的读写速度比 SSD 大概快 10~1000 倍
当CPU需要内存中某个数据的时候,如果寄存器这个数据,直接用,如果寄存器没有这个数据,查询 L1 缓存;L1 中没有,再查询 L2 缓存;L2 中没有再查询 L3 缓存;L3 中没有,再去内存中拿。
缓存条目结构
无论是缓存还是,内存,是一个线性储存器,也就是数据一个挨着一个的储存.比如:把内存想象成一个只有 1 列的表格,那么缓存就是一个多列的表格,这个表格中的每一行叫作一个缓存条目。
方案 1
缓存本质上是一个 Key-Value 的存储,它的 Key 是内存地址,值是缓存时刻内存地址中的值。
- 内存的地址;
- 缓存的值。
CPU读取到一个内存地址,就增加一个条目.当查询一个内存地址的数据在不在 L1- 缓存中的时候,可以遍历每个条目,,看条目中的内存地址是否和查询的内存地址相同.如果相同,我们就取出条目中的缓存的值.
缺点:效率低.
方案 2
想要快速的定位缓存条目可以通过取余(类似hash算法)快速定位缓存条目位置。地址 % 10
指令的预读
通过对于指令的预读,使得读取指令的速度跟的上指令的执行速度。减少指令从内存中的读取次数(更耗时),其实就是批处理。
缓存的命中:
所谓命中就是指在缓存中找的需要的数据.和命中相反的是穿透,也叫miss.就是一次读取操作没有从缓存中找到对应的数据。
- l1的缓存命中率约为80%,
- l1 l2 l3缓存加在一块命中率高达95%。
- CPU 缓存的设计还是相当合理的。只有 5% 的内存读取会穿透到内存,95% 都能读取到缓存。
缓存置换:
当缓存满了之后,再读取数据到缓存将置换掉之前的缓存。
SSD、内存和 L1 Cache 相比速度差多少倍?
因为内存比 SSD 快 10~1000 倍,L1 Cache 比内存快 100 倍左右。因此 L1 Cache 比 SSD 快了 1000~100000 倍。
这个问题告诉我们,不同的储存器之间的性能差距很大,构造储存器分级很有意义,分级的目录的是要构造缓存体系.