软件架构设计师笔记(缓存)
Cache(缓存) 的功能是提高 CPU 数据输入输出的速率,突破所谓的“冯•诺依曼瓶颈”
由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,这时就存在一个问题,由于CPU执行速度很快,而从内存读取数据和向内存写入数据的过程跟CPU执行指令的速度比起来要慢的多,
因此如果任何时候对数据的操作都要通过和内存的交互来进行,会大大降低指令执行的速度。因此在CPU里面就有了高速缓存
为了节约成本 通常在CPU 和内存之间设置小容量的 Cache。
Cache 基本原理
其中:1级缓存的容量通常在32~256KB。二级缓存一般为128KB~3MB
缓存真的很小,是 内存的 千分之一,甚至 十万分之一
缓存如此之小,怎么可能让CPU提速呢?
原因是:程序的局部性原理。
根据程序的局部性原理,最近的、未来要用的指令和数据大多局限于正在用的指令和数据,或是存放在与这些指令和数据位置上邻近的单元中
所以我们就将相邻的数据放入了缓存中,方便CPU提取。
当然,缓存的容量有限,有时候cpu 在缓存中没有找到数据,只能去主存中获取数据了,这时我们就称 (访问未命中)
于是我们有了cpu执行一段程序的时间,公式
t3 = t1* h + t2*(1-h)
t3 : 系统执行平均时间 (系统的平均周期)
t1 : 系统在 缓存中消耗的时间
h : 系统在缓存中命中率 (如 查询 100次数据 命中了 95 次 命中率 为 95% )
t2 : 系统在 内存 中耗费的时间
(1-h) : 系统的未命中率 (1- 命中率 )
注: 未命中率 =!命中率 命中率 最大值就是为1 未命中率 就是 1- 命中率
例如,设某计算机主存的读/写时间为 l00ns,有一个指令和数据合一的 Cache,已知该Cache 的读/写时间为 10ns,取指令的命中率为 98%,取数的命中率为 95%。在执行某类程序时,约有 1/5 指令需要存/取一个操作数。假设指令流水线在任何时候都不阻塞,则设置 Cache 后,每条指令的平均访存时间约为:
(2%′100ns+98%′10ns)+1/5′(5%′100ns+95%′10ns)=14.7ns
指令时间 + 取数时间
直接映像
从高到低依次为:区号、页号以及页内地址
内存容量为 1GB,Cache 容量为 8MB,页面的大小为 512KB。
直接映像中,先分区,再分页。一个区的大小就是 Cache 容量的大小,所以一共分:1GB/8MB=128 个区,区号 7 位。
每个区分:8MB/512KB=16 个页,所以页号为 4 位