繁体   English   中英

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

[英]stack, cache misses and virtual memory

通常,对于我记得的stack ,它是内存中以特殊方式(通过LIFO结构即“堆栈”)处理的特殊部分。

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

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

  2. 我曾经知道,如果L1缓存中留有一块内存(我一直只想着堆),那么它将比L3缓存更快地进行检索。 它也适用于堆栈吗?

现在堆栈通常比堆快,但是如果第2点为真,则堆栈中的某些数据可能仍在L3行中,从而导致系统运行缓慢。

我在以下几个方面的推理是否正确?或者我缺少某些东西?

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

一些处理器(我忘记了,也许是较早的AMD)将堆栈指令(即PUSHPOPRETCALL等)与L1高速缓存相关。

顺便说一句,安德鲁·阿佩尔(Andrew Appel)写道(在上个世纪), 垃圾回收可能比堆栈分配 (对于使用CPS技术编译的SML) 更快 ,但是,IIRC在今天已经不那么正确了,因为当前的处理器具有将调用堆栈与缓存相关联的某些行为。 。

但我相信,调用堆栈的热门部分通常位于L1高速缓存中(即使没有硬件也可以提供帮助),因为那里的数据(局部变量,返回地址等)经常会被访问。

当然,调用堆栈位于虚拟内存中 使用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]段。

另请参阅有关ASLRvdso(7)的信息。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM