系统相关
首页 > 系统相关> > 堆栈内存是否在Linux中是连续的?

堆栈内存是否在Linux中是连续的?

作者:互联网

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

编辑:

我曾经认为堆栈内存不必在物理上是连续的,但为什么我们认为堆栈内存总是比堆内存更快?如果它不是物理上连续的,那么堆栈如何更好地利用缓存呢?还有另一件事总是让我感到困惑,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,heap-memory,cpu-cache,stack-size,virtual-memory
来源: https://codeday.me/bug/20190724/1521706.html