【发布时间】:2018-09-10 17:02:18
【问题描述】:
据我所知,堆栈内存在虚拟内存地址上是连续的,但堆栈内存在物理上也是连续的?这与堆栈大小限制有关吗?
编辑:
我曾经认为堆栈内存在物理上不一定是连续的,但为什么我们认为堆栈内存总是比堆内存快?如果它在物理上不是连续的,堆栈如何更好地利用缓存?还有一件事总是让我感到困惑,cpu在数据段中执行指令,它不在虚拟内存中的堆栈段附近,我认为操作系统不会使堆栈段和数据段在物理上彼此靠近,所以这可能会损害缓存效果,您怎么看?
再次编辑:
也许我应该举个例子来更好地表达自己,如果我们要对大量数字进行排序,使用数组来存储数字比使用列表更好,因为每个列表节点都可能由malloc构造,所以它可能没有好好利用缓存,所以我说栈内存比堆内存快。
【问题讨论】:
-
我们有虚拟内存,不用关心物理内存布局。如果您不编写内核或驱动程序(或设计硬件,或设计对缓存的攻击),请忘记物理内存。
-
Nah - 进程/线程堆栈可以并且经常像任何其他虚拟内存一样被分页。用于中断处理的内核堆栈必须是非分页的。
-
@jww 我已经编辑了我的问题以显示我的真正困惑,如果您得到答案,请在下面发布您的答案或添加评论,非常感谢。
-
在大多数架构上,堆栈都可以通过简单的算术指令来增长或缩小。
malloc是对一个函数的调用,该函数需要保留一个内存区域,最终分配新页面。那要花很多钱。简单来说,栈是一种限制性更强的数据结构。缓存与它关系不大,栈顶在缓存中几乎总是热的,因为它使用非常频繁,但很容易构造一个将其踢出缓存的函数。
标签: linux heap-memory virtual-memory cpu-cache stack-size