2016-04-22 68 views
3

我們知道緩存使用虛擬地址。那麼,當涉及多個進程時,特別是共享高速緩存(如共享L2高速緩存),甚至是本地L1高速緩存,進程切換時(如同時(超)多線程),這可以如何工作?兩個不同的進程在同一個物理內核上運行。當涉及不同進程的線程時,超線程是否有用,或者只有在涉及同一進程的線程時才能提升性能?緩存是否可以保留多個進程的數據?

+1

確定的x86高速緩存使用虛擬地址?[這](http://stackoverflow.com/questions/19039280/物理或虛擬尋址被使用在處理器-X86-x86-64-for-c-in-t)答案說不同的是,IMO。 – Downvoter

+0

這是特定的體系結構如果緩存是虛擬索引/物理標記完全沒有問題。兩個不同的線程可以使用相同的虛擬地址進行查找,但只有具有匹配物理地址的進程纔會受到打擊。 – 4386427

+2

這種高級抽象結構和低級真實機制的混合不可能產生一個有意義的問題。 – SergeyA

回答

3

沒有一個主要的x86 CPU微架構使用虛擬緩存。它們都使用虛擬索引/物理標記(VIPT)L1高速緩存。 VIPT是一種性能破解,允許從TLB查找中並行提取一個集合中的標籤。

用作索引的地址位在物理地址和虛擬地址中是相同的。 (即它們是4k頁面內偏移的一部分,所以它們不需要由TLB翻譯)。這意味着它的行爲與phys/phys(PIPT)緩存完全相同,避免了虛擬尋址的所有問題。

這可以通過保持緩存小並且有足夠的方式來實現。英特爾的L1高速緩存是32kiB,8路相關性,64B線。這佔所有的頁內地址位。 (請參閱其他資源的圖表和更詳細的解釋。)

超線程工作正常,單獨進程,因爲x86 CPU避免高速緩存別名(同義/同音異名問題)。他們像物理地址緩存一樣工作。儘管如此,兩個不共享任何內存的內存密集型進程在超線程運行時可能會比慢運行速度慢。如果這是一個選項,高速緩存的競爭性共享可能比在另一個完成之後運行一個進程更糟糕。

對於超線程資源以外的其他資源瓶頸的進程,HT肯定有幫助。例如與分支mispredicts。由於對無法預知的大型工作集的訪問導致緩存未命中,這種情況在沒有超線程的情況下仍會經常丟失。使用的virt /緩存的virt


的CPU做需要它們無效的上下文切換,或者有額外的標籤來跟蹤它的PID他們的。這就像現在的緩存支持虛擬化一樣:它們使用虛擬機ID進行標記,因此他們知道虛擬機的物理地址。 virt/virt L1意味着你不需要一個快速的TLB:它只需要在L1未命中時使用,因此L1緩存也可以緩存轉換。

一些設計必須使用phys/phys L1,但我不知道任何具體的例子。 virt/phys技巧在高性能CPU中很常見,因爲有足夠的方法使L1成爲可能的L1無論如何只是一個好主意。

請注意,只有L1曾使用virt地址。 Big L2 and L3 caches are always phys/phys


其他鏈接:

相關問題