笔者:YY同学
文章目录
Memory(内存) 种类
一般分为两类:
- SRAM(Static Random Access Memory,静态随机存取存储器)
容量小,速度快,价格昂贵。例如:Cache(缓存)- DRAM(Dynamic Random Access Memory,动态随机存取存储器)
容量大,速度慢,价格便宜。例如:Main Memory(主内存)
Memory 层级
一般距离 CPU 远近顺序为:
- L1 Cache(一级 Cache,最近)
- L2 Cache(二级 Cache)
- L3 Cache(三级 Cache,如有)
- Main Memory(主内存)
- Secondary Memory(二级内存,最远)
Cache 预读取
大家都知道,计算机在运行时 CPU 会不停地通过数据通路向 Memory 里拿数据,但是每一次拿数据都会消耗很多时间(因为距离比较远)。因此为了更加高效地存取数据,Memory 会在被访问的时候,将一些相关的数据提前保存进 Cache 里,因为 Cache 距离 CPU 比较近,因此从 Cache 中读取数据会比从 Memory 中读取快很多。一般 Cache 的预读取会有两种形式:
- Locality Temporal(时间频率):单位时间内访问频率越高的数据会被存入 Cache 中。
- Locality Spatial(空间频率):当读入一个数据时,考虑到与它相邻的数据会被用到,因此将这些相邻数据提前存入 Cache 中。
关于 Cache 的一些术语
- Cache Hit:读取命中,指预先读取到 Cache 的数据成功被 CPU 访问
- Cache Miss:读取缺失,预先读取到 Cache 的数据没有成功被 CPU 访问
- 内存地址(简称地址):一串二进制,用于表示数据在内存中的位置,由 Index 位、Tag 位以及 Block Offset 位组成
- Set:集合,由 Index,Valid,Tag,Block 组成
- Block:又称 Cache Line,内存中一行的存储区域,用于存放数据。n 个 Block 又可以成为 n-way associative(n 路组相联)
- Index:集合目录,表示集合的个数,由地址 mod 2^k 求得,k为地址中 Index 的位数,可自定
- Tag:标签位,地址位数 - Index 位数 - Block Offset 位数
- Valid:内存中表示数据的有效性,1 为有效,0 为无效
- Block Offset:偏移量(至少为 1),一个 Block 中可能划分为多块区域,存放多个数据,Offset 用于指明具体偏移到哪个位置
- Byte Offset:同 Block Offset,取决于数据类型(byte or word)
- Dirty:表示 Memory 与 Cache 数据的一致性,0 表示数据没有修改,是一致的;1 表示数据修改,不一致
Cache 读写数据
三类 Cache
假设地址总长为 N bits
类型 | Set 数量 | Block Offset | 优点 | 缺点 | Miss Rate |
---|---|---|---|---|---|
Directed mapped(直接映射) | 2^N | 0 | 实现简单 | 不灵活 | 高 |
Full associative(全相联) | 1 | N | 灵活 | 需要很多比较器,更大的硬件尺寸 | 低 |
Set associative(组相联) | 2^(N-K) | K | 灵活且有更小的硬件尺寸 | / | 介于中间 |
Write Hit & Write Miss Policy
- 当 CPU 需要写入一个数据并且 Cache 中存有这个数据,这种情况叫 Write Hit,一般有以下几种策略:
- Write Through:同时更新 Memory 和 Cache
- Write Buffer:预先写入缓冲区,提高写入速度
- Write Back:只更新 Cache 不更新 Memory
- 当 CPU 需要写入一个数据但是 Cache 中没有这个数据,这时候需要用到 Write Miss 策略:
- Write Allocate:先更新 Memory,然后将数据从 Memory 中读取到 Cache 中
- Write Not Allocate:只更新 Memory
一般的组合策略为:
Write Through + Write Not Allocate,或者 Write Back + Write Allocate,这样的组合效率最高
Cache Miss 的三个可能原因(3C Model)
- Compulsory:冷启动,初始赋值时造成的缺失。
解决方法:增加 block size - Capacity:block size 有限,导致所有指令数据无法全部放下。
解决方法:增加 cache 的大小 - Conflict:Memory 数据存入同一个 Cache 中写入位置发生冲突
解决方法:增加 cache 的大小或者增加 cache 相联度
Cache Miss Rate 和三大因素(block size,cache size,associativity)之间的关系:
Virtual Memory(虚拟内存)
数据在真实内存中的存放地址往往是乱序的,而虚拟内存相当于开辟一块看上去“连在一起”的虚假地址,然后将每个地址映射到真正的物理内存中去,给人一种“相关数据在地址上相连”的假象。
使用虚拟内存的好处:
- Reduce Memory Conflict(减少内存冲突 )
- Improve Safety(增加程序安全性和保密性,虚拟内存的独立性使得别的指令无法访问虚拟内存)
虚拟内存也需要一种 Cache 来提高内存的读取效率,它的名字叫做 TLB(Translation Lookaside Buffers)
TLB 事件一览:
Average Memory Access Time (AMAT)
- The L2 hit time determines L1’s miss penalty.
- L2 local miss rate >> than the global miss rate