1. 程式人生 > >TLB與cache的深入分析(May, 14)

TLB與cache的深入分析(May, 14)

一)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.