堆栈,缓存未命中和虚拟内存

时间:2014-08-05 16:53:56

标签: c++ linux caching stack

一般来说,对于我记得程序的stack,它是以特殊方式处理的内存的一个特殊部分(通过LIFO结构,即'堆栈& #39;)

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

  1. 将堆栈作为一般内存,是否意味着在Linux进程中它应该位于该进程的虚拟内存的某个页面中?

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

  3. 现在堆栈通常比堆快,但如果第2点为真,那么堆栈中的一些数据可能仍然在L3行中并且在系统中引入缓慢。

    我是否正确地按照以下条款进行推理,或者我错过了什么?

1 个答案:

答案 0 :(得分:1)

具体针对处理器:AMD和英特尔正在做不同的事情,即使在每个品牌中,它都是特定型号的。

有些处理器(我忘了哪些,也许是较旧的AMD)与堆栈机器指令有关(即PUSHPOPRET和{{1}等等...)到L1缓存。

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

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

当然,调用堆栈位于call stack;使用virtual memory,例如尝试

CALL

(您可以使用 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] 段。

另请阅读proc(5)& ASLR

根据(vdso(7))的定义,L1缓存通常包含最常访问的数据。高速缓存未命中成本很高(RAM中的数据访问速度比L1高速缓存慢100倍)。