【问题标题】:stack, cache misses and virtual memory堆栈、缓存未命中和虚拟内存
【发布时间】:2014-08-05 16:53:56
【问题描述】:

总的来说,就我所记得的程序的stack 而言,它是以特殊方式处理的内存的特殊部分(通过LIFO 结构,即“堆栈”)。

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

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

  2. 我曾经知道,如果一块内存(我一直认为只是堆)驻留在 L1 Cache 中会比 L3 Cache 更快地检索。它也适用于堆栈吗?

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

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

【问题讨论】:

    标签: c++ linux caching stack


    【解决方案1】:

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

    一些处理器(我忘记了,可能是旧 AMD)将堆栈机器指令(即PUSHPOPRETCALL 等...)与一级缓存。

    顺便说一句,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] 段。

    另请阅读 ASLRvdso(7)

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-13
      • 2012-04-21
      • 2015-09-16
      • 1970-01-01
      相关资源
      最近更新 更多