gpt4 book ai didi

c++ - 堆栈、高速缓存未命中和虚拟内存

转载 作者:太空宇宙 更新时间:2023-11-04 11:06:17 30 4
gpt4 key购买 nike

一般来说,我记得程序的堆栈是内存中以特殊方式处理的特殊部分(通过LIFO结构,即一个“堆栈”)。

我在 Linux 中使用 C 和 C++ 工作,我不确定以下几点

  1. 堆栈是一 block 通用内存,这是否意味着在 Linux 进程中它应该位于该进程的虚拟内存的某个页面中?

  2. 我习惯于知道,如果一 block 内存(我一直只考虑堆)驻留在 L1 缓存中,检索起来会比 L3 缓存更快。它也适用于堆栈吗?

现在堆栈通常比堆快,但如果第 2 点为真,堆栈中的一些数据可能仍然在 L3 行中并导致系统变慢。

我在以下方面的推理是否正确,还是我遗漏了什么?

最佳答案

它是特定于处理器的:AMD 和英特尔在做不同的事情,甚至在每个品牌中它也是特定于型号的。

一些处理器(我忘了是哪个,也许是旧的 AMD)正在关联堆栈 机器 指令(即 PUSHPOPRET CALL 等...)到 L1 缓存。

顺便说一句,Andrew Appel 写道(在上个世纪)garbage collection can be faster than stack allocation (对于使用 CPS 技术编译的 SML),但是,IIRC,这在今天不太正确,因为当前处理器有一些与 call stack 相关的行为到缓存。

但我相信调用堆栈的热门部分通常在 L1 缓存中(即使没有硬件来帮助),因为那里的数据(局部变量、返回地址...)经常被访问。

当然,调用栈在virtual memory中;使用 proc(5) ,例如尝试

 tail /proc/$$/maps

(你可以使用 cat 而不是 tail )来获得也许:

7f6366db5000-7f6366dd5000 r-xp 00000000 08:11 2100860                    /lib/x86_64-linux-gnu/ld-2.19.so
7f6366fac000-7f6366fb0000 rw-p 00000000 00:00 0
7f6366fcc000-7f6366fd3000 r--s 00000000 08:11 964796 /usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache
7f6366fd3000-7f6366fd5000 rw-p 00000000 00:00 0
7f6366fd5000-7f6366fd6000 r--p 00020000 08:11 2100860 /lib/x86_64-linux-gnu/ld-2.19.so
7f6366fd6000-7f6366fd7000 rw-p 00021000 08:11 2100860 /lib/x86_64-linux-gnu/ld-2.19.so
7f6366fd7000-7f6366fd8000 rw-p 00000000 00:00 0
7fff59aa1000-7fff59ac2000 rw-p 00000000 00:00 0 [stack]
7fff59bfe000-7fff59c00000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]

注意 [stack] 段。

另请阅读 ASLR & vdso(7)

根据(CPU caches 的)定义,L1 缓存通常包含最常访问的数据。缓存未命中代价高昂(访问 RAM 棒中的数据可能比访问 L1 缓存慢 100 倍)。

关于c++ - 堆栈、高速缓存未命中和虚拟内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25144290/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com