栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

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

为什么我们认为堆栈内存总是比堆内存快?如果它在物理上不是连续的,那么堆栈如何利用缓存的更多优势?

它与缓存无关。从堆栈分配和取消分配内存比堆快得多。这是因为从堆栈分配和取消分配仅需要一条指令(递增或递减堆栈指针)。另一方面,从堆分配和/或取消分配内存涉及许多工作。请参阅本文章以了解更多信息。

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

如果我们要对大量数字进行排序,那么使用数组存储数字要比使用列表更好,因为每个列表节点都可以由malloc构造,因此它可能无法充分利用缓存,这就是为什么我说堆栈内存比堆内存快。

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

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



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/399217.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号