linux - 堆栈内存在 Linux 中物理上是连续的吗?

标签 linux heap-memory virtual-memory cpu-cache stack-size

据我所知,栈内存在虚拟内存地址上是连续的,但栈内存在物理上也是连续的?这与堆栈大小限制有关吗?

编辑:

我曾经认为栈内存在物理上不一定是连续的,但为什么我们认为栈内存总是比堆内存快呢?如果它在物理上不连续,堆栈如何才能更好地利用缓存?还有一件事一直让我很困惑,cpu在数据段执行指令,它在虚拟内存中不靠近堆栈段,我认为操作系统不会让堆栈段和数据段在物理上彼此靠近,所以这可能会损害缓存效果,您怎么看?

再次编辑: 也许我应该举个例子来更好地表达自己,如果我们要对大量数字进行排序,使用数组存储数字比使用列表更好,因为每个列表节点都可能由 malloc,所以它可能没有充分利用缓存,这就是为什么我说堆栈内存比堆内存更快。

最佳答案

As far as I can see, stack memory is contiguous in virtual memory address, but stack memory is also contiguous physically? And does this have something to do with the stack size limit?

不,栈内存在物理地址空间中不一定是连续的。它与堆栈大小限制无关。它与操作系统如何管理内存有关。操作系统仅在第一次访问相应的虚拟页面(或自从它被调出到磁盘后第一次访问)时才分配一个物理页面。这叫做 demand-paging ,它有助于节省内存使用量。

why do we think that stack memory is always quicker than heap memory? If it's not physically contiguous, how can stack take more advantage of cache?

与缓存无关。从堆栈分配和释放内存比从堆更快。这是因为从堆栈分配和释放只需要一条指令(递增或递减堆栈指针)。另一方面,从堆中分配和/或释放内存涉及更多的工作。参见 this文章了解更多信息。

现在一旦分配了内存(从堆或栈),访问分配的内存区域所花费的时间取决于它是栈内存还是堆内存。这取决于内存访问行为以及它是否是 friendly缓存和内存架构。

if we want to sort a large amount of numbers, using array to store the numbers is better than using a list, because every list node may be constructed by malloc, so it may not take good advantage of cache, that's why I say stack memory is quicker than heap memory.

使用数组更快并不是因为数组是从栈中分配的。可以从任何内存(堆栈、堆或任何地方)分配数组。它更快,因为数组通常一次访问一个连续的元素。当访问第一个元素时,包含该元素和其他元素的整个缓存行将从内存中提取到 L1 缓存。因此访问该缓存行中的其他元素可以非常有效地完成,但是访问缓存行中的第一个元素仍然很慢(除非缓存行是 prefetched )。这是关键部分:由于缓存行是 64 字节对齐的,虚拟页面和物理页面也是 64 字节对齐的,因此可以保证任何缓存行都完全驻留在单个虚拟页面和单个物理页面中。这使得获取缓存行变得高效。同样,所有这些都与数组是从栈还是堆分配无关。无论哪种方式,它都适用。

另一方面,由于链表的元素通常不连续(甚至在虚拟地址空间中也不连续),因此包含一个元素的缓存行可能不包含任何其他元素。因此获取每个元素的成本可能更高。

关于linux - 堆栈内存在 Linux 中物理上是连续的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49595006/

相关文章:

linux - 在 Linux 中链接信号处理程序的正确方法?

Linux 管道查找和 md5sum 不发送输出

Linux CentOS 为每个具有已知结构的目录重命名文件

eclipse - Eclipse 中的内存

c++ - 在 C++ 中摆脱非动态内存

c - 为什么在没有使用 malloc 时出现堆部分

Linux内核安装

android - Android Studio 1.3.1 中的错误 Java 堆大小

c++ - 什么是指针稳定性?

c++ - 虚拟内存或物理内存