一般来说,对于我记得程序的stack
,它是以特殊方式处理的内存的一个特殊部分(通过LIFO
结构,即'堆栈& #39;)
我使用C和C ++在Linux上工作,我不确定以下几点
将堆栈作为一般内存,是否意味着在Linux进程中它应该位于该进程的虚拟内存的某个页面中?
我习惯知道,如果一块内存(我一直以来只考虑堆)驻留在L1缓存中,将比L3缓存检索更快。它也适用于堆栈吗?
现在堆栈通常比堆快,但如果第2点为真,那么堆栈中的一些数据可能仍然在L3行中并且在系统中引入缓慢。
我是否正确地按照以下条款进行推理,或者我错过了什么?
答案 0 :(得分:1)
具体针对处理器:AMD和英特尔正在做不同的事情,即使在每个品牌中,它都是特定型号的。
有些处理器(我忘了哪些,也许是较旧的AMD)与堆栈机器指令有关(即PUSH
,POP
,RET
和{{1}等等...)到L1缓存。
但我相信调用堆栈的热门部分通常都在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]
段。
根据(vdso(7))的定义,L1缓存通常包含最常访问的数据。高速缓存未命中成本很高(RAM中的数据访问速度比L1高速缓存慢100倍)。