[英]stack, cache misses and virtual memory
通常,對於我記得的stack
,它是內存中以特殊方式(通過LIFO
結構即“堆棧”)處理的特殊部分。
我在使用C和C ++的Linux中工作,不確定以下幾點
作為堆棧中的一塊普通內存,是否意味着在Linux進程中它應該位於該進程的虛擬內存的某個頁面中?
我曾經知道,如果L1緩存中留有一塊內存(我一直只想着堆),那么它將比L3緩存更快地進行檢索。 它也適用於堆棧嗎?
現在堆棧通常比堆快,但是如果第2點為真,則堆棧中的某些數據可能仍在L3行中,從而導致系統運行緩慢。
我在以下幾個方面的推理是否正確?或者我缺少某些東西?
它是特定於處理器的:AMD和英特爾所做的事情是不同的,甚至在每個品牌內,它都是特定於模型的。
一些處理器(我忘記了,也許是較早的AMD)將堆棧機指令(即PUSH
, POP
, RET
和CALL
等)與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]
段。
另請參閱有關ASLR和vdso(7)的信息。
根據( CPU緩存的 )定義,L1緩存通常包含最常訪問的數據。 高速緩存未命中代價高昂(訪問RAM棒中的數據的速度可能比一級高速緩存慢100倍)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.