计算机中的cache相关知识

背景

最近在看多线程的内存模型,看的一头雾水,里面的底层硬件绕不开cache,这里对cache好好的捋一下,我们这里讲的概念是狭隘的cache, 就是指计算机cpu里的cache, 其实广义的cache可以是硬盘,内存都行。

cache是什么

一开始是没有cache一说的,那时候cpu需要数据的话就直接去内存中取就行了,拆过电脑的同学都知道cpu和内存条是两个独立的硬件,他们都插在主板上通过主板上的线路沟通,所以取一次数据需要花一定的时间,比如1ms。现在需要做一个a+b的计算,那么总时间就是两次取数时间和一次加法时间,比如一次加法时间只要1us, 总时间=2ms+1us, 那么可以看出耗时都在取数上了?怎么办?

解决方法就是在cpu里面搞一块cache内存,比如32k大小,每次取数去cache上看看有没有,没有的话先把数据从内存上读取到cache中,然后再从cache中取数到cpu,假如cache到cpu的时间是10us, 那么这个计算时间就是2ms+1us+20us, 可以看到耗时比原来多20us, 但是假如a+b要做两次,那么第二次的时间只有1us+20us.

总结一下可以看到,cache其实只有在第二次以后才有效果,但是在计算机中基本大部分数据都会被多次使用,根据上面的时间可以看到加速效果明显。

cache为什么快

  1. 在cpu内部,简单理解就是数据传输距离都变近了,对比内存条的话
  2. 空间很小,可以理解房子很小,找东西起来就比较快,整个大别墅要找半天

cpu为什么不直接抛弃内存,只用缓存

  1. cache的成本高
  2. cache不易修建太大,因为空间太大找东西不方便
  3. 小的cache基本够用了

cache长什么样子

就是一个个单元格,每个单元格叫做cache line, 这里一个cache line的大小是64字节。
在这里插入图片描述

cache 命中率

什么是cache命中率,还是刚才的加法例子,比如这个加法做100次循环,变量a需要有99次在cache中拿到了值,那么命中率就是99%。

cpu如何写数据

  • 当cache中存在该数据
  1. Write-through: 顾名思义就是cache和内存都改好
  2. write-behind(write-back) :顾名思义就是一开始先在cache改,后面有空在更新到内存上
  • 当cache中不存在该数据
  1. Write allocate: 先把原始数据从内存拉到cache中,然后执行当cache中存在该数据的策略
  2. No-write allocate :不需要先拉数据到cache, 直接写到内存里
    一般cpu会采用2+3的方式组合,或者1+4的策略。下面图展示了write-behind + Write allocate
    在这里插入图片描述

预取策略

上面我们知道a+b需要取两次从内存到cache, 但是实际可能只取一次,原因是:cache每次可以拉取64字节的数据过来,假如a,b都在一个cache line中,那么当访问b的时候,发现cache中已经有了,这就是预取策略,说白了就是我猜你后面会用,所以在拿数据a的时候顺道把b也拿到cache中。这里有个前提是数据a不能超过64字节,不然压根没有位置留给b搭顺风车,第二是b在a旁边,不然还要单独去接b也不可能。

如何看自己的cache的相关策略

命令:sudo dmidecode -t cache
在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值