歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux高速緩存概述

Linux高速緩存概述

日期:2017/2/28 14:54:59   编辑:Linux教程

[數據緩沖區高速緩存]

內核通過保存一個稱為數據緩沖區高速緩存的內部數據緩沖區池來試圖減小對磁盤的存取頻率。高速緩沖含有最近被使用過的磁盤塊的數據

在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 {
char * b_data; //指向緩存的數據塊的指針
unsigned long b_blocknr; //緩存的邏輯塊號
unsigned short b_dev; //緩存的設備號
unsigned char b_uptodate; //緩存中的數據是否是最新的
unsigned char b_dirt; //緩存中數據是否為髒數據
unsigned char b_count; //這個緩存塊被引用的次數
unsigned char b_lock; //b_lock表示這個緩存塊是否被加鎖
struct task_struct * b_wait; //等待在這個緩存塊上的進程


struct buffer_head * b_prev; //指向緩存中下一個緩存塊
struct buffer_head * b_next; //指向緩存中上一個緩存塊
struct buffer_head * b_prev_free; //緩存塊空閒鏈表中指向下一個緩存塊
struct buffer_head * b_next_free; //緩存塊空閒鏈表中指向上一個緩存塊
};
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。要理解這四個指針的作用,必須要先說明下整個高速緩存的結構。

Copyright © Linux教程網 All Rights Reserved