歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux緩存機制之塊緩存

Linux緩存機制之塊緩存

日期:2017/2/28 15:55:32   编辑:Linux教程

在Linux內核中,並非總使用基於頁的方法來承擔緩存的任務。內核的早期版本只包含了塊緩存,來加速文件操作和提高系統性能。這是來自於其他具有相同結構的類UNIX操作系統的遺產。來自於底層塊設備的塊緩存在內存的緩沖區中,可以加速讀寫操作。

與內存頁相比,塊不僅比較小(大多數情況下),而且長度可變的,依賴於使用的塊設備(或文件系統)。隨著日漸傾向於使用基於頁操作實現的通用文件存取方法,塊緩存作為中樞系統緩存的重要性已經逐漸失去。主要的緩存任務現在由頁緩存承擔。另外,基於塊的I/O的標准數據結構,現在已經不再是緩沖區,而是struct bio結構。

緩沖區用作小型的數據傳輸,一般設計的數據量是與塊長度可比擬的。文件系統在處理元數據時,通常會使用此類方法。而裸數據的傳輸則按頁進行,而緩沖區的實現也基於也緩存。

塊緩存在結構上由兩個部分組成:

1) 緩沖頭(buffer head)包含了與緩沖區狀態相關的所有管理數據,包括快號、塊長度、訪問計數器等。這些數據不是直接存儲在緩沖頭之後,而是存儲在物理內存的一個獨立區域中,由緩沖頭結構中的一個對應的指針表示。

2) 有用數據保存在專門分配的頁中,這些頁也可能同時存在於頁緩存中。這進一步細分了頁緩存,如下圖所示,在我們的例子中,頁劃分為4個長度相同的部分,每一部分由其自身的緩沖頭描述。緩沖頭存儲的內存區域與有用數據存儲的區域是有關的。

這使得頁面可以細分為更小的部分,各顧各部分之間完全連續的(因為緩沖區數據和緩沖頭數據是分離的)。因為一個緩沖區由至少512字節組成,每頁最多可包括MAX_BUF_PER_PAGE個緩沖區。該常數定義為頁面長度的函數。

如果修改了某個緩沖區,則會立即印象到頁面的內容(反之也是),因而兩個緩存不需要顯示同步,畢竟二者的數據是共享的。

當然,有些應用程序在訪問塊設備時,使用的是塊而不是頁面,讀取文件系統的操作幾塊,就是一個例子。一個獨立的塊緩存用於加速此類訪問。該塊緩存的運作獨立於頁面緩存,而不是在其上建立的。為此,緩沖頭數據結構(對於塊緩存和頁面緩存是相同的)群聚在一個長度恆定的數組中,各個數組項按LUR方式管理。在一個三個數組項用過之後,將其置於索引位置0,其他數組項相應下移。這意味這最常使用的數組項位於數組的開頭,而不常用的數組項將被後退,如果很長時間不使用,則會“掉出”數組。

因為數組的長度,或者說LUR列表中的項數,是一個固定值,在內核運行期間不改變,內核無需運行獨立的線程來將緩存長度修正為合理值。相反,內核只需要在一項“掉出”數組時,將相關的緩沖區從緩存刪除,以釋放內存,用於其他目地。

Copyright © Linux教程網 All Rights Reserved