14 頁快取記憶體

2021-05-25 20:06:46 字數 1544 閱讀 7600

絕大多數情況,核心讀寫磁碟時都引用頁快取記憶體。因為核心的資料與**不從磁碟讀。所以頁快取記憶體一般為以下型別:普通檔案資料的頁、目錄的頁、直接從塊裝置檔案讀出的頁等。頁快取記憶體中每個頁包含的資料肯定屬於某個檔案,這個檔案叫做它的所有者。若非

o_direct

標誌被置位,所有檔案讀寫都依賴於快取記憶體。頁快取記憶體中資訊單位顯然是一完整資料頁,它通過所有者(檔案)及在其中的索引來標識。核心用

address_space

物件來描述頁快取記憶體。因為概念上頁快取記憶體屬於檔案,所以此資料結構嵌入在檔案

inode

物件的i_data

字段,且有

指向它,

address_space

物件的host

也指向所有者的

inode

物件。另一種情況是頁中資料**於塊裝置檔案,那麼

address_space

會嵌入在與裝置相關的特殊檔案系統

bdev

中檔案的主索引節點中。該物件的關鍵字段

a_ops

指向型別為

address_space_operation

的表,其中定義對頁處理的方法,就是這些方法把

inode

物件與低階驅動程式相聯絡。此物件既然描述檔案的頁快取記憶體,那麼檔案的快取頁肯定也可由它找到。直觀的想法是將頁描述符指標以一定資料結構在其中組織起來。考慮到大檔案的頁多,該資料結構必須設計精良以便快速操作。鍊錶顯然不行,引入基樹來存放,效率高。基樹必須有相關標記來指出髒頁號。

linux

老版中,磁碟快取記憶體有兩種,除了前述的頁快取記憶體,還有對付塊的快取區快取記憶體。新版中,後者沒了,引入緩衝區頁,其中由塊快取區構成。緩衝區頁本身儲存在頁快取記憶體中。塊緩衝區由緩衝區首部

buffer_head

表示,其中有如塊緩衝區所在緩衝區頁的描述符指標,以及此塊在緩衝區頁

offset

。當然也有指標指向塊緩衝區。同一緩衝區頁的首部以煉錶鏈起來。緩衝區頁在兩種情況下被需要,

1是檔案頁在檔案系統中的塊不連續,這時就將緩衝區頁放入

inode

的address_space

的基樹中,並儲存相應的緩衝區首部,因為它存著塊裝置邏輯號。

2是訪問單獨磁碟塊(如讀

inode

或super_block

物件),它的所有者並非檔案,所以它的

address_space

位於與塊裝置相關的特殊檔案系統

bdev

中,緩衝區頁就存於它的基樹中。這種情況所有塊緩衝區涉及的塊必須在塊裝置上相鄰。在乙個緩衝區頁內的塊緩衝區大小要相同,

80x86

體系上,按塊大小,一緩衝區頁可包括

1~8緩衝區。

pdflush

核心執行緒負責週期性處理頁快取記憶體,重新整理髒頁。系統中這個核心執行緒的個數可以動態調整,最少

2個最多

8個。乙個空閒

1秒則刪除它,最近

1秒無空閒則建立乙個新的。頁快取記憶體可能有大量頁,

linux

用複雜的機制對它的掃瞄劃為幾個執行流。

頁快取記憶體 二

五 把塊放在頁快取記憶體中 在舊的linux核心版本中,有兩種不同的磁碟快取記憶體,分別是頁快取記憶體和緩衝區快取記憶體,前者用來存放訪問磁碟檔案內容時生成的磁碟資料頁,後者把通過vfs訪問的塊的內容保留在記憶體中。從2.4.10版本開始,緩衝區快取記憶體不存在了,把它們存放在叫做 緩衝區頁 的專門...

頁快取記憶體與頁回寫

訪問物理記憶體的速度遠快於訪問磁碟的速度 所以把經常使用的資料快取到物理記憶體 頁快取記憶體 訪問磁碟可直接變為訪問物理記憶體的方式 頁快取記憶體是由記憶體中的物理頁面組成的 內容對應磁碟上的物理塊 讀快取當核心開始乙個讀操作時 它首先會檢查需要的資料是否再頁快取記憶體中 如果在就放棄訪問磁碟 直接...

每CPU頁框快取記憶體

在 linux頁框級記憶體管理處理細節 一篇博文中,我們談到核心呼叫alloc pages等系列函式分配乙個或一片連續的頁框。這一系列函式本質上是使用夥伴演算法從指定zone t中取到乙個或一片連續的空閒的頁框。正如我們將在以後重點博文 slab分配器 所看到的,核心經常請求和釋放單個頁框。為了提公...