Linux快取記憶體概述

2021-06-11 20:27:15 字數 2172 閱讀 8021

[資料緩衝區快取記憶體]

核心通過儲存乙個稱為資料緩衝區快取記憶體的內部資料緩衝區池來試圖減小對磁碟的訪問頻率。高速緩衝含有最近被使用過的磁碟塊的資料

在linux核心0.11中,它預設最多支援16m的物理記憶體。對系統記憶體的分配情況如下:linux核心占用物理記憶體最前段的一部分。隨後是高速緩衝區,它的最高記憶體位址為4mb。高速緩衝區被顯示記憶體和rom bios分成兩段。剩餘的記憶體部分稱為主記憶體區,當然若系統中還存在ram虛擬盤,則主記憶體區前段還要扣除虛擬盤所佔的記憶體空間。示意圖如下。

[高速緩衝區的工作原理為]

當核心從磁碟中讀取資料時,核心試圖先從高速緩衝中讀。如果資料已經在該高速緩衝中,則核心可以不必從磁碟上讀。如果資料不在該高速緩衝中,則核心從磁碟上讀資料,並將其緩衝起來。

寫操作與之類似,要往磁碟上寫的資料也被暫存於高速緩衝中,以便如果核心隨後又試圖讀它時,它能在高速緩衝中。核心也通過判定是否資料必須真的需要儲存到磁碟上,或資料是否是將要很快被重寫的暫時性資料,來減少磁碟寫操作的頻率。

[快取記憶體的資料結構]

整個快取記憶體由很多快取塊組成,在linux 0.11版本中,整個快取記憶體由307塊快取記憶體塊組成。每個快取塊主要由兩部分組成:1、被快取的資料部分;2、標識該快取塊資訊的部分。將標識該快取塊資訊的部分稱為快取頭,buffer_head。在buffer_head中由指標指向被快取的資料buffer_data。每個快取記憶體塊的組成示意圖如下

buffer_data指向的快取資料大小是與檔案系統上乙個邏輯塊的大小相對應的。也就是說,在對資料進行快取的時候,是以邏輯塊為單位的。linux 0.11中快取記憶體相關的資料結構如下所示(**來自於fs.h)

struct

buffer_head ;

b_dev和b_blocknr的意思很容易理解。linux支援的塊裝置,每個裝置都有乙個裝置號。每個裝置號在邏輯上可以看成是連續的許多大小相同的塊組成,每個塊都有乙個編號。由於乙個快取塊對應乙個邏輯塊資料,所以這裡b_dev和b_blocknr表示此快取塊所快取的資料說在的裝置號和邏輯塊號。

b_uptodate和b_dirt的含義不是那麼明顯,要理解它們之間的區別。

b_dirt是乙個標誌位,用來表示快取塊中的資料有沒有被修改過,這個修改是針對它所對應的物理裝置上的資料而言的,即將裝置資料快取到快取區之後,資料在快取中有沒有被修改,從而造成了快取中的資料和裝置上資料的不一致。

b_uptodate也是乙個標誌位,用來表示快取塊中的資料是不是最新的。這個更新標誌也是對物理上的裝置而言的,即快取中的資料是不是最新的,或者說它標誌著快取中的資料是不是有效的,可能裝置中的資料被修改,但快取中資料沒有被相應的同步時,這個標誌就表明,快取中的資料與裝置中資料不一致。

b_count表示這個快取塊目前被引用的次數,b_count為0時表示這個快取塊目前是空閒的。

管理告訴快取的的四個指標:b_prev、b_next、b_prev_free和b_next_free。要理解這四個指標的作用,必須要先說明下整個快取記憶體的結構。

在前面說過,快取記憶體由許多的快取塊組成,這些快取塊之間使用b_prev_free和b_next_free構成乙個迴圈的雙向鍊錶,由乙個核心變數free_list作為整個雙向鍊錶的頭。free_list指向的迴圈的雙向鍊錶中,包含了所有的快取塊,空閒的和非空閒的都在這個鍊錶中。只不過當乙個快取塊由空閒變為非空閒之後,會將其移動到鍊錶的最後面去。

對於空閒的快取塊,b_prev和b_next指標都是空。對於非空閒的快取塊,它同時存在另乙個結構中。這個結構是有資料快取的部分。這是乙個hash雜湊陣列,陣列大小是nr_hash(307)。雜湊值的計算使用的是(b_dev^b_blocknr)%nr_hash,使用雜湊值作為索引儲存。但出現雜湊值衝突時,使用雙向鍊錶解決衝突,這就是b_prev和b_next的作用了。

整個結構可以用如下示意圖進行說明

圖中的黑色箭頭部分代表b_prev和b_next,藍色箭頭部分代表b_prev_free和b_next_free

Linux快取記憶體詳解(二)

快取記憶體的寫操作 對快取記憶體的寫操作,主要來自於其它函式對快取記憶體的使用。寫操作的使用方式很多,例如在inode.c的write node函式。write node函式在呼叫是需要傳遞乙個指向inode節點的指標,並且設定好這個i節點的對應的裝置號和節點號。write node函式的作用是將乙...

Linux的快取記憶體 Cache Memory詳解

ps 前天有童鞋問我,為啥我的linux系統沒執行多少程式,顯示的可用記憶體這麼少?其實linux與win的記憶體管理不同,會盡量快取記憶體以提高讀寫效能,通常叫做cache memory。有時候你會發現沒有什麼程式在執行,但是使用top或free命令看到可用記憶體free項會很少,此時檢視系統的 ...

Linux的快取記憶體 Cache Memory詳解

ps 前天有童鞋問我,為啥我的linux系統沒執行多少程式,顯示的可用記憶體這麼少?其實linux與win的記憶體管理不同,會盡量快取記憶體以提高讀寫效能,通常叫做cache memory。有時候你會發現沒有什麼程式在執行,但是使用top或free命令看到可用記憶體free項會很少,此時檢視系統的 ...