社区
CPU和硬件区
帖子详情
堆数据放在二级缓存,栈数据放在以及缓存具体是什么意思?
FatFat-Whale
2016-06-08 11:06:39
是不是意味着CPU在读取堆数据时会先在一级cache中查找,找不到再去二级缓存中查找?如果在二级缓存中没有就把堆中读取的数据块放在二级缓存中?那如果下一次读取数据是直接在二级缓存中查找还是依旧要先从一级缓存中查找呢?二级缓存会把数据块整理放入一级缓存中吗?
...全文
5336
3
打赏
收藏
堆数据放在二级缓存,栈数据放在以及缓存具体是什么意思?
是不是意味着CPU在读取堆数据时会先在一级cache中查找,找不到再去二级缓存中查找?如果在二级缓存中没有就把堆中读取的数据块放在二级缓存中?那如果下一次读取数据是直接在二级缓存中查找还是依旧要先从一级缓存中查找呢?二级缓存会把数据块整理放入一级缓存中吗?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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的,那么它们是都可以在一级,二级缓存上的
Go语言实战:
二级
缓存
框架
基于Go语言与MySQL和Redis的交互实现
二级
缓存
的小案例; 实现功能:优先从Redis获取
数据
,当Redis没有
数据
时从MySQL加载并同步
缓存
到Redis,
缓存
时间60秒; 技术
栈
:
数据
库,Go与MySQL的交互,Go与Redis的交互,封装...
关于
堆
和
栈
、一级
缓存
和
二级
缓存
的理解
关于
堆
和
栈
、一级
缓存
和
二级
缓存
的理解
数据
结构的
堆
和
栈
堆
:先进先出的
栈
:先进后出的、自顶向下 内存分布上的
堆
和
栈
堆
:也称为动态内存分配,是由我们自己在程序中分配内存和释放的,就是生存期是由我们自己决定的如malloc函数(注意避免内存泄漏)
栈
:局部变量的内存,函数结束后内存自动被释放,
栈
内存分配运算内置于处理器的指令集中,它的运行效率一般很高,但是分配的内存容量有限。 静态存储区:全局变量、static变量;它是由编译器自动分配和释放的,即内存在程序编译的时候就已经分配好,这块内存在程序
栈
、
堆
、
缓存
、内存之间的联系
先说
栈
和
堆
栈
和
堆
都是
放在
内存里的,没错就是RAM,通常所说的内存条! 因为程序运行就是在运行在内存里的!
栈
和
堆
有什么区别?
栈
:
栈
的大小是静态的,是编译时就知道的,比如数组的大小,每个程序允许申请的
栈
大小是有上限的,数组申请过大,会导致
栈
溢出!
堆
:
堆
的大小是动态的,程序运行是动态申请的,不固定,比如new对象的个数和大小!需要自己手动释放,不然会导致内存泄漏!
缓存
: 分为两种:程序
缓存
和CPU
缓存
程序
缓存
:就是所说的缓冲区!
栈
和
堆
都属于程序
缓存
!让
数据
保存在内存中,加快程序计算效率
关于
堆
、
栈
和队列
目录什么是
堆
?什么是
栈
?什么是
堆
栈
?
堆
、
栈
区别什么是队列?
堆
、
栈
、队列的区别? 之前经常老是听说
堆
栈
,但不知道
什么意思
,报着好奇去看看看的也是一脸蒙蔽。索性在此总结下,脱下它又厚又重让人头大的外衣。 什么是
堆
?
堆
可以被看作是一种经过排序的树形
数据
结构,每个节点都有一个值。且有以下特点: ①
堆
中的某个节点的值总是不大于或者不小于其父节点的值;
堆
总是一棵完全二叉树。
堆
得存取是随意的 ②
堆
是在程序运...
122.1
栈
、
堆
和内存的关系
1、
堆
栈
空间分配区别
栈
(操作系统):由操作系统(编译器)自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于
数据
结构中的
栈
。
堆
(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。 2、
堆
栈
缓存
方式区别
栈
使用的是一级
缓存
, 它们通常都是被调用时处于存储空间中,调用完毕立即释放。
堆
则是存
放在
二级
缓存
中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。 3、
堆
栈
数据
结构区别
CPU和硬件区
1,025
社区成员
562
社区内容
发帖
与我相关
我的任务
CPU和硬件区
Linux /Unix kernel支持不同的硬件体系,X86, ARM, MIPS, 等等
复制链接
扫一扫
分享
社区描述
Linux /Unix kernel支持不同的硬件体系,X86, ARM, MIPS, 等等
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章