buffer與cache的區別

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 cacheatom

而若是繞過文件系統,則操做磁盤塊時就緩存在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)當訪問一個單獨的磁盤塊時(例如,當讀超級塊或索引節點塊時)。

相關文章
相關標籤/搜索