前言:绝大部分内容来源于北京大学的慕课《计算机组成原理》,地址:
https://www.coursera.org/learn/jisuanji-zucheng
![5dfaeb59ebdddb587ada9c566601939c.png](https://i-blog.csdnimg.cn/blog_migrate/29240dab2b3193ba3e1eab095670d8b8.jpeg)
cache是为了解决cpu和内存速度不对等的问题。
一,cache的结构
当前较为普遍的cache配置是L1,L2,L3。
![bd60f3de34ae82564303b87a119a3ccb.png](https://i-blog.csdnimg.cn/blog_migrate/8a4db33ad0f446b3e93805f8cd039688.jpeg)
L1 Cache:指令和数据分离,各32KB 8路组相联,命中时间4个周期 。
L2 Cache:统一的指令和数据,共256KB 8路组相联,命中时间11个周期 。
L3 Cache:统一的指令和数据,多核共享,共8MB 16路组相联,命中时间30~40个周期。
![155d092a611eea6f22e2d3b4ef215a58.png](https://i-blog.csdnimg.cn/blog_migrate/36ae4c500327c5e5adea14a25b40cc06.jpeg)
局部性:
计算机程序从时间和空间都表现出“局部性” 。
时间局部性(Temporal Locality) :最近被访问的存储器单元(指令或数据)很快还会被访问 。
空间局部性(Spatial Locality):正在被访问的存储器单元附近的单元很快会被访问。
缓存行(Cache Line):根据局部性结论可以知道,CPU为了高效,在获取数据不是一个字节一个字节,而是一块一块(block),也即Cache Line(常见的有64Byte)。
![2d10fbcf01ce4a9c345a253c7f001cfb.png](https://i-blog.csdnimg.cn/blog_migrate/fe4d168fe13a2f8aa1bfbee956b8435f.png)
二,cache访问流程
![94f42ab710ea132603650812597eed8e.png](https://i-blog.csdnimg.cn/blog_migrate/4686dee5a918bfb9a7b4737d509fbe48.jpeg)
Cache命中时的写策略:
① 写穿透(Write Through):数据同时写入Cache和主存 。
② 写返回(Write Back):数据只写入Cache,仅当该数据块被替换时 才将数据写回主存。
Cache失效”时的写策略 :
① 写不分配(Write Non-Allocate):直接将数据写入主存 。
② 写分配(Write Allocate):将该数据所在的块读入Cache后,再将数 据写入Cache。
参考:
https://www.coursera.org/learn/jisuanji-zucheng
https://coolshell.cn/articles/20793.html
https://www.stardog.com/blog/writing-cache-friendly-code/
https://dzone.com/articles/optimizing-memory-access-with-cpu-cache
https://coolshell.cn/articles/10249.html
https://max.book118.com/html/2017/1007/136335602.shtm