MMU是Memory Management Unit的縮寫,中文名是內存管理單元,它是中央處理器(CPU)中用來管理虛擬存儲器、物理存儲器的控制線路,同時也負責虛擬地址映射為物理地址,以及提供硬件機制的內存訪問授權,多用戶多進程操作系統。
TLB(Translation Lookaside Buffer)傳輸后備緩沖器是一個內存管理單元用於改進虛擬地址到物理地址轉換速度的緩存。TLB是一個小的,虛擬尋址的緩存,其中每一行都保存着一個由單個PTE組成的塊。如果沒有TLB,則每次取數據都需要兩次訪問內存,即查頁表獲得物理地址和取數據。
多進程間頻繁切換對TLB有什么影響?現代的處理器是如何面對這個問題的?
在現代處理器中,軟件使用虛擬地址訪問內存,而處理器的MMU單元負責把虛擬地址轉換成物理地址,為了完成這個映射過程,軟件和硬件共同來維護一個多級映射的頁表。當處理器發現頁表中無法映射到對應的物理地址時,會觸發一個缺頁異常,掛起出錯的進程,操作系統軟件需要處理這個缺頁異常。我們之前有提到過二級頁表的查詢過程,為了完成虛擬地址到物理地址的轉換,查詢頁表需要兩次訪問內存,即一級頁表和二級頁表都是存放在內存中的。
TLB( Translation Look- aside buffer)專門用於緩存內存中的頁表項,一般在MMU單元內部。TLB是一個很小的 cache,TLB表項( TLB entry)數量比較少,每個TLB表項包含一個頁面的相關信息,例如有效位、虛擬頁號、修改位、物理頁幀號等。當處理器要訪問一個虛擬地址時,首先會在TLB中查詢。如果TLB表項中沒有相應的表項,稱為TLB Miss,那么就需要訪問頁表來計算出相應的物理地址。如果TLB表項中有相應的表項,那么直接從TLB表項中獲取物理地址,稱為TLB命中。
TLB內部存放的基本單位是TLB表項,TLB容量越大,所能存放的TLB表項就越多,TLB命中率就越高,但是TLB的容量是有限的。目前 Linux內核默認采用4KB大小的小頁面,如果一個程序使用512個小頁面,即2MB大小,那么至少需要512個TLB表項才能保證不會出現 TLB Miss的情況。但是如果使用2MB大小的大頁,那么只需要一個TLB表項就可以保證不會出現 TLB Miss的情況。對於消耗內存以GB為單位的大型應用程序,還可以使用以1GB為單位的大頁,從而減少 TLB Miss的情況。