堆数据放在二级缓存,栈数据放在以及缓存具体是什么意思?

FatFat-Whale 2016-06-08 11:06:39
是不是意味着CPU在读取堆数据时会先在一级cache中查找,找不到再去二级缓存中查找?如果在二级缓存中没有就把堆中读取的数据块放在二级缓存中?那如果下一次读取数据是直接在二级缓存中查找还是依旧要先从一级缓存中查找呢?二级缓存会把数据块整理放入一级缓存中吗?
...全文
5336 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhujinqiang 2017-04-25
  • 打赏
  • 举报
回复 1
通常来说,处理器的L1级缓存通常都是静态RAM,速度非常的快,但是静态RAM集成度低(存储相同的数据,静态RAM的体积是动态RAM的6倍),而且价格也相对较为昂贵(同容量的静态RAM是动态RAM的四倍)。扩大静态RAM作为缓存是一个不太合算的做法,但是为了提高系统的性能和速度又必须要扩大缓存,这就有了一个折中的方法:在不扩大原来的静态RAM缓存容量的情况下,仅仅增加一些高速动态RAM做为L2级缓存。高速动态RAM速度要比常规动态RAM快,但比原来的静态RAM缓存慢,而且成本也较为适中。一级缓存和二级缓存中的内容都是内存中访问频率高的数据的复制品(映射),它们的存在都是为了减少高速CPU对慢速内存的访问。 而缓存中的数据要经常按照一定的算法来更换,这样才能保证缓存中的数据经常是被访问最频繁的。命中率算法中较常用的“最近最少使用算法”(LRU算法),它是将最近一段时间内最少被访问过的行淘汰出局。因此需要为每行设置一个计数器,LRU算法是把命中行的计数器清零,其他各行计数器加1。当需要替换时淘汰行计数器计数值最大的数据行出局。这是一种高效、科学的算法,其计数器清零过程可以把一些频繁调用后再不需要的数据淘汰出缓存,提高缓存的利用率。 上面是预备知识, 至于说"堆数据放在二级缓存,栈数据放在一级缓存"这种说法 需要结合具体的体系结构来说,我们一般是指的intel的x86体系 L1cache里面存放了函数调用时候栈里面的一堆寄存器的值,EAX,EBX,ECX,EDX,EBP。。。等等 原因就是因为只有L1是最快的存储,而流水线执行的时候,需要取EAX,EBX等等的值去做内部映射到实际的物理寄存器, 所以为了保证函数调用时候指令的执行速度 也只能把栈放在这里cache。
zhujinqiang 2017-04-25
  • 打赏
  • 举报
回复
楼主是在哪一本书上看到的这个问题,可以告知下吗?
lysysjw 2016-07-28
  • 打赏
  • 举报
回复
如果你提到的是硬件中的"缓存",那么从计算机体系结构来分析的话,分析下面两种种场景 1 处理器拥有两级cache,待访问的内存地址A是经过cache的, 这时候如果cpu需要访问(读取)地址A时,首先从一级cache中查看是否有地址A对应的有效tag,如果存在,那么会首先从一级cache中读取数据,否则会在二级cache中查找是否有地址A对应的有效tag,如果有,那么就从二级cache中读取数据,并且同时将这个数据和地址A缓存到一级cache中,如果后面再从这个地址读取时那么就直接从一级缓存中读取数据就ok了,如果二级缓存中也没有地址A对应的有效的数据那么就会从DDR(RAM)中去读取数据,并且同时会将这个地址和对应的数据填写到一级和二级cache中,以备后面再次的访问. 写过程类似 2 处理器拥有两级cache,待访问的内存地址是不经过cache的. 如果是这种情况,那么直接从RAM中读取数据,而不再经过cache "堆数据放在二级缓存,栈数据放在以及缓存"这种说法不是规定或者常识,但是可以有这种场景存在.堆数据或者栈数据所对应的地址如果是经过cache的,那么它们是都可以在一级,二级缓存上的

1,025

社区成员

发帖
与我相关
我的任务
社区描述
Linux /Unix kernel支持不同的硬件体系,X86, ARM, MIPS, 等等
社区管理员
  • CPU和硬件区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧