1. 程式人生 > >TLB與內存尋址,內存讀取,虛擬內存的相關原理

TLB與內存尋址,內存讀取,虛擬內存的相關原理

虛擬地址 style 很快 rdquo baidu 取數據 cache href win

TLB(Translation Lookaside Buffer)轉換檢測緩沖區是一個內存管理單元,用於改進虛擬地址到物理地址轉換速度的緩存。 TLB是一個小的,虛擬尋址的緩存,其中每一行都保存著一個由單個PTE(Page Table Entry,頁表項)組成的塊。如果沒有TLB,則每次取數據都需要兩次訪問內存,即查頁表獲得物理地址和取數據。

關於TLB與cache-CPU緩存的關系,TLB介於CPU與cache之間,是內存的管理單元,用於程序從邏輯地址訪問實際內存地址的頁表緩存。

當程序或cpu要讀取數據,CPU會根據程序提供的邏輯地址的前20位映射碼到TLB中查詢,TLB中保存所有已運行程序的前20位邏輯地址的映射碼,查到(命中)根據前20位映射碼直接訪問實際內存地址。查不到(不命中)CPU會到CPU緩存(cache)中查詢,沒有CPU會重新加載(實際內存)所有邏輯地址的映射碼(一些程序停止響應後過一會又響應),後直接讀取硬盤上數據,同時將邏輯地址映射信息保存回TLB(刷新TLB)。TLB歸系統(OS)在內存中創建、管理,也算是一種緩存,軟緩存。CPU cache是加快CPU與內存之間數據交換的緩存,歸CPU管理,是一種硬件緩存。


當CPU訪問程序時,內存讀取速度很快,將CPU需要的數據塊(實際內存地址)讀取保存在內存中,內存空間有限,符合軟件編寫規則的程序都只能保存很小的數據塊在內存中,並且內存中這些數據塊只有被CPU全部處理完,內存才會加載下一個數據塊。CPU要一點一點的處理這些內存中的數據塊,當CPU處理完這個數據塊需等待內存加載下一個數據塊。(也可以說內存停止慢慢等CPU處理完。)這就造成了數據處理的停頓(雖然這點時間可能就是幾毫秒),為了保持數據處理的連貫性、持續性,CPU cache應運而生。內存中要處理或優先處理的數據塊先被CPU cache加載,不再影響內存的運作,CPU優先從CPU cache中加載處理數據。CPU cache起了緩沖、緩存作用。(這只是CPU運行的大方向的理論,實際IU與AU對緩存還有不同的處理,並且像IU酷睿與新的I系列CPU在緩存、內置內存控制器等多有改進,但無論怎樣這大方向的理論沒變!同頻率不同價的CPU多是砍CPU cache大小或指令來區分,資金不是太緊張的同學還是選同頻大緩存的CPU為好。同類型相比I3與I3,別拿I3與I5比。。。。)


如上,CPU、CPU cache或內存都會分優先級來加載處理數據,一些暫時不用的數據,內存會自動卸載數據到虛擬內存中,同時映射地址供以後直接調用。沒有啟用虛擬內存,內存會直接卸載暫時不用的數據,用時再從硬盤上讀取。大家註意到,直接以後從硬盤上讀取還是卸載數據到虛擬內存中,好像都一樣,都要從硬盤上讀取。實際使用時是不一樣的,調用虛擬內存,實際內存只要通過映射碼直接讀取。調用硬盤上數據有一個加載、選擇需要數據塊的時間(雖然這點時間可能還是幾毫秒)。到此其實虛擬內存更像實際內存的緩存(但不是必須的),虛擬內存的作用更像TLB。所以偶一直建議大家啟用虛擬內存。對於一些大容量內存的同學,也要盡量啟用虛擬內存。不是關閉虛擬內存,系統就會運行更快。這是一個網路上流傳甚廣的歧義解讀。


關閉虛擬內存讓程序在實際內存中運行,需要幾個前提條件,需要x64系統,只有x64系統才能更有效的管理、分配更多的內存地址。像一些x86系統開啟或支持4G以上內存都是障眼法的過眼癮,x86系統本身的內核出於穩定性的要求已經屏蔽了內存地址的擴展。(無論微軟還是Linux都一樣,不要聽一些神人的通靈神釋,如果Linux等x86內核本身支持Linux還出什麽x64系統。)x86伺服器系統也是如此,只能看到更多的內存存在,(針對x86伺服器系統以前有幾個專門優化的程序可以使用3g內存,現在基本已經絕種了)如我們都知道銀行有許多毛爺爺,但你能把銀行的錢拿來就用嗎!第二個先決條件就是軟件本身要支持、啟用內存地址擴展,也就是x64位程序並編譯到了可以啟用更多的內存地址擴展,有些程序(偶就不說軟件名了)只是包了x64皮的x86程序。。。。。
x86程序以Windows系統下為例為了最大兼容性先天就限制了內存地址的調用(“符合軟件編寫規則的程序都只能保存很小的數據塊在內存中”),如xxx不能讀、xxx不能寫的報錯就是內存地址不能供軟件調用,x64程序內存地址還是有限制但通過內存地址擴展可使用更多內存,如PS x64版軟件可以使用128G以上內存容量。


內存無論有多大,都會在開機時被系統初始化,分配好數據空間(實際內存地址)。內存像一棟樓,樓中有許多房間,x86程序無論怎樣只能住小房間,x64程序可以住大房間,像PS等x64程序可以包下整個單元。無論x86還是x64程序房間住滿了可以將一些暫時不用的放到下房(或叫小倉房)虛擬內存中,如沒有多出的只能先丟掉了

TLB與內存尋址,內存讀取,虛擬內存的相關原理