一)TLB
1)TLB的概述
TLB是一個內存管理單元用於改進虛擬地址到物理地址轉換速度的緩存.
TLB是位於內存中的頁表的cache,如果沒有TLB,則每次取數據都需要兩次訪問內存,即查頁表獲得物理地址和取數據.
2)tlb的原理
當cpu對數據進行讀請求時,CPU根據虛擬地址(前20位)到TLB中查找.
TLB中保存着虛擬地址(前20位)和頁框號的對映關系,如果匹配到虛擬地址就可以迅速找到頁框號,通過頁框號與虛擬地址后12位的偏移組合得到最終的物理地址.
頁框號可以理解為頁表項
如果沒在TLB中匹配到虛擬地址,就出現TLB丟失,需要到頁表中查詢頁表項,如果不在頁表中,說明要讀取的內容不在內存,需要到磁盤讀取.
TLB是MMU中的一塊高速緩存,也是一種Cache.
在分頁機制中,TLB中的數據和頁表的數據關聯,不是由處理器維護,而是由OS來維護,TLB的刷新是通過裝入處理器中的CR3寄存器來完成.
如果MMU發現在TLB中沒有命中,它在常規的頁表查找后,用找到的頁表項替換TLB中的一個條目.
3)tlb的刷新原則
當進程進行上下文切換時重新設置cr3寄存器,並且刷新tlb.
有兩種情況可以避免刷tlb.
第一種情況是使用相同頁表的進程切換.
第二種情況是普通進程切換到內核線程.
lazy-tlb(懶惰模式)的技術是為了避免進程切換導致tlb被刷新.
當普通進程切換到內核線程時,系統進入lazy-tlb模式,切到普通進程時退出該模式.
二)cache
1)cache的概念:
cache是為了解決處理器與慢速DRAM設備之間巨大的速度差異而出現的.
cache屬於硬件系統,linux不能管理cache.但會提供flush整個cache的接口.
cache分為一級cache,二級cache,三級cache等等.一級cache與cpu處於同一個指令周期.
例如:查看當前系統的cache.
dmidecode -t cache
# dmidecode 2.9
SMBIOS 2.6 present.
Handle 0x0700, DMI type 7, 19 bytes
Cache Information
Socket Designation: Not Specified
Configuration: Enabled, Not Socketed, Level 1
Operational Mode: Write Back
Location: Internal
Installed Size: 128 KB
Maximum Size: 128 KB
Supported SRAM Types:
Unknown
Installed SRAM Type: Unknown
Speed: Unknown
Error Correction Type: Single-bit ECC
System Type: Data
Associativity: 8-way Set-associative
Handle 0x0701, DMI type 7, 19 bytes
Cache Information
Socket Designation: Not Specified
Configuration: Enabled, Not Socketed, Level 2
Operational Mode: Write Back
Location: Internal
Installed Size: 1024 KB
Maximum Size: 2048 KB
Supported SRAM Types:
Unknown
Installed SRAM Type: Unknown
Speed: Unknown
Error Correction Type: Single-bit ECC
System Type: Unified
Associativity: 8-way Set-associative
Handle 0x0702, DMI type 7, 19 bytes
Cache Information
Socket Designation: Not Specified
Configuration: Enabled, Not Socketed, Level 3
Operational Mode: Write Back
Location: Internal
Installed Size: 4096 KB
Maximum Size: 4096 KB
Supported SRAM Types:
Unknown
Installed SRAM Type: Unknown
Speed: Unknown
Error Correction Type: Single-bit ECC
System Type: Unified
Associativity: 16-way Set-associative
分別是:
1級cache:128KB
2級cache:1024KB
3級cache:4096KB
2)Cache的存取單位(Cache Line)
CPU從來不從DRAM直接讀/寫字節或字,從CPU到DRAM的每次讀或寫的第一步都要經過L1 cache,每次以整數行讀或寫到DRAM中.
Cache Line是cache與DRAM同步的最小單位.
典型的虛擬內存頁面大小為4KB,而典型的Cache line通常的大小為32或64字節.
CPU讀/寫內存都要通過Cache,如果數據不在Cache中,需要把數據以Cache Line為單位去填充到Cache,即使是讀/寫一個字節.
CPU不存在直接讀/寫內存的情況,每次讀/寫內存都要經過Cache.
3)Cache的工作模式
數據回寫(write-back):這是最高性能的模式,也是最典型的,在回寫模式下,cache內容更改不需要每次都寫回內存,直到一個新的cache要刷新或軟件要求刷新時,才寫回內存.
寫通過(write-through):這種模式比回寫模式效率低,因為它每次強制將內容寫回內存,以額外地保存cache的結果,在這種模式寫耗時,而讀和回寫模一樣快,這都為了內存與cache相一致而付出的代價.
預取(prefectching):一些cache允許處理器對cache line進行預取,以響應讀請求,這樣被讀取的相鄰內容也同時被讀出來,如果讀是隨機的,將會使CPU變慢,預取一般與軟件進行配合以達到最高性能.
注:
大部分的cache允許軟件在某個區域設置模式,一個區域可能是回寫,另一個可能是預取.用戶一般不能改變cache的模式,這些通常由設備驅動程序來控制.
預取通常由軟件通過所謂的cache隱函數madvise進行控制.
例如:查看當前系統的cache在哪種模式下工作
dmidecode -t cache
# dmidecode 2.9
SMBIOS 2.6 present.
Handle 0x0700, DMI type 7, 19 bytes
Cache Information
Socket Designation: Not Specified
Configuration: Enabled, Not Socketed, Level 1
Operational Mode: Write Back
Location: Internal
Installed Size: 128 KB
Maximum Size: 128 KB
Supported SRAM Types:
Unknown
Installed SRAM Type: Unknown
Speed: Unknown
Error Correction Type: Single-bit ECC
System Type: Data
Associativity: 8-way Set-associative
Handle 0x0701, DMI type 7, 19 bytes
Cache Information
Socket Designation: Not Specified
Configuration: Enabled, Not Socketed, Level 2
Operational Mode: Write Back
Location: Internal
Installed Size: 1024 KB
Maximum Size: 2048 KB
Supported SRAM Types:
Unknown
Installed SRAM Type: Unknown
Speed: Unknown
Error Correction Type: Single-bit ECC
System Type: Unified
Associativity: 8-way Set-associative
Handle 0x0702, DMI type 7, 19 bytes
Cache Information
Socket Designation: Not Specified
Configuration: Enabled, Not Socketed, Level 3
Operational Mode: Write Back
Location: Internal
Installed Size: 4096 KB
Maximum Size: 4096 KB
Supported SRAM Types:
Unknown
Installed SRAM Type: Unknown
Speed: Unknown
Error Correction Type: Single-bit ECC
System Type: Unified
Associativity: 16-way Set-associative
結果表明都是回寫,如下:
Operational Mode: Write Back
三)內存一致性
內存一致性涉有到一系列的問題:
1)多處理要系統更新cache時,一個處理器修改了cache的內容,第二個處理器將不能訪問這個cache,直到這個cache的內容被寫內存.
在現代處理器中硬件已經做了精心的設計,確保這種事情不會發生,硬件負責保持cache在各個CPU之間一致.
2)外圍硬件設備可以通過DMA(Direct Memory Access)訪問內存,而不讓處理器知道,也不會利用cache,這樣在內存和cache之間就會出現不同步的情況.
管理DMA的操作是操作系統的工作,比如設備驅動程序,它將保證內存與cache的一致性.
3)當在cache中的數據比內存中的數據老時,稱為stale.如果軟件初始化DMA,使設備和RAM之間傳遞數據,那么軟件必須告訴CPU,cache中的條目必須失效.
4)當在cache中的數據比內存中的數據新時,稱為dirty.在設備驅動程序允許一個設備經DMA從內存讀數據時,它必須確保所有的dirty條目寫進內存.也叫做flushing或sync cache.
四)總結
① 多處理器之間的cache問題,由硬件負責維護各個CPU之間的cache一致性。
② 外部設備通過DMA訪問內存,cache一致性由操作系統維護(設備驅動程序)。
轉:http://blog.chinaunix.net/uid-9012903-id-2011476.html