簡體   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