top命令中有兩項與內存相關的東西:buffer和cache。這兩項與頁高速緩存相關。磁盤的操做有邏輯級(文件系統)和物理級(磁盤塊),這兩種Cache就是分別緩存邏輯和物理級數據的。linux
在linux內核的舊版本中,主要有兩種不一樣的磁盤高速緩存:頁高速緩存(page cache)和緩衝區高速緩存(buffer cache),前者用來存放訪問磁盤文件內容時生成的磁盤數據頁,後者把經過VFS(管理磁盤文件系統)訪問的塊的內容保留在內存中。緩存
從2.4.10的穩定版本開始,緩衝區高速緩存其實就不存在了。事實上,因爲效率的緣由,再也不單獨分配塊緩衝區;相反,把它們存放在叫作「buffer page」的專門頁中,而buffer page保存在頁page cache中。this
綜上所述,經過vfs訪問時,無論是磁盤文件的數據頁,仍是由vfs發起的對磁盤數據塊進行訪問時相關的buffer,都是放在page cache。atom
而若是繞過文件系統,則操做磁盤塊時就緩存在buffer cache中。指針
好比說,dd of=/dev/null if=/dev/sde1 bs=1024k count=10240,產生的數據就緩存在buffer cache中。blog
============================================================================索引
Buffer page形式上就是與「緩衝區首部」的附加描述符相關的數據頁,其主要目的是快速肯定頁中的一個塊在磁盤中的地址。實際上,頁高速緩存內的頁中的一大塊數據在磁盤上的地址不必定是相鄰的。內存
緩衝區首部包含這樣的信息:io
struct buffer_head {效率
unsigned longb_state; /* 緩衝區狀態標誌 */
struct buffer_head*b_this_page; /* 指向緩衝區頁的鏈表中的下一個元素的指針 */
struct page*b_page; /* 指向擁有該塊的緩衝區頁的描述符的指針 */
sector_t b_blocknr; /* 與塊設備相關的塊號(起始邏輯塊號) */
size_t b_size; /* 塊大小 */
char *b_data; /* 塊在緩衝區頁內的位置 */
struct block_device*b_bdev; /* 指向塊設備描述符的指針 */
bh_end_io_t*b_end_io; /* I/O完成方法 */
void *b_private; /* 指向I/O完成方法數據的指針 */
struct list_headb_assoc_buffers; /* 爲與某個索引節點相關的間接塊的鏈表提供的指針 */
atomic_t b_count; /* 塊使用計數器 */
};
只要內核必須單獨地訪問一個塊,就要涉及存放塊緩衝區的緩衝區頁,並檢查相應的緩衝區首部。下面是內核建立緩衝區頁的兩種普通狀況:
(1)當讀或寫的文件頁在磁盤塊中不相鄰時。發生這種狀況是由於文件系統爲文件分配了非連續的塊,或由於文件有「洞」。
(2)當訪問一個單獨的磁盤塊時(例如,當讀超級塊或索引節點塊時)。