作業系統頁高速緩存

什麼是頁高速緩存

頁高速緩存是Linux內核實現磁盤緩存,減少磁盤I/O操作的機制。通過把磁盤中的數據緩存在物理內存中,把對於磁盤的訪問變為對內存的訪問。

Linux頁高速緩存

頁高速緩存的普遍性

Linux頁高速緩存的目標是緩存任何基於頁的對象,包含各種類型的文件和內存映射

頁高速緩存和緩衝區高速緩存

2.4之前有兩個獨立的磁盤緩存:頁高速緩存和緩衝區高速緩存

頁高速緩存緩存頁面

緩衝區高速緩存緩衝緩衝區

目前的內核中在內存中仍然使用緩衝來表示磁盤塊,但是緩衝使用頁映射的磁盤塊,也就是說其實只是頁高速緩存

緩存回寫

回寫條件

  1. 當空閒內存低於一個特定閾值時,使用flusher線程進行回寫

  2. 髒頁在內存中的貯存時間超過一個特定的閾值時,使用flusher線程進行回寫

  3. 使用sync()以及fsync()系統調用

緩存回收

決定緩存中什麼內容將被清除,Linux實現的是個修改過的LRU(Least Recent Used),Linux將維護兩個鏈表:活躍鏈表和非活躍鏈表。

在活躍鏈表上的頁面將不被換出,而在非活躍鏈表上面的頁面則是可以被換出的。

頁緩存如何組織

address_space數據結構

struct address_space { struct inode *host; /* owner: inode, block_device */ struct radix_tree_root page_tree; /* radix tree of all pages */ spinlock_t tree_lock; /* and lock protecting it */ atomic_t i_mmap_writable;/* count VM_SHARED mappings */ struct rb_root i_mmap; /* tree of private and shared mappings */ struct list_head i_mmap_nonlinear;/*list VM_NONLINEAR mappings */ struct mutex i_mmap_mutex; /* protect tree, count, list */ /* Protected by tree_lock together with the radix tree */ unsigned long nrpages; /* number of total pages */ unsigned long nrshadows; /* number of shadow entries */ pgoff_t writeback_index;/* writeback starts here */ const struct address_space_operations *a_ops; /* methods */ unsigned long flags; /* error bits/gfp mask */ struct backing_dev_info *backing_dev_info; /* device readahead, etc */ spinlock_t private_lock; /* for use by the address_space */ struct list_head private_list; /* ditto */ void *private_data; /* ditto */} __attribute__((aligned(sizeof(long))));

i_mmap

i_mmap字段是一個優先搜索樹,包含address_space中所有的私有的映射頁面,即vm_area_struct的映射

一個文件可以被多個vm_area_struct標識,但是這個文件只能有一個address_space結構

也就是說這個文件可以有多個虛擬地址但是在物理內存中只有一份

a_ops

struct address_space_operations

address_space的組織

  1. 如果頁屬於一個文件,那麼也的所有者就是文件的索引節點

  2. 如果頁中包含的數據來自於塊設備,開設備文件對應索引節點的i_mapping字段指向主索引節點中的address_space對象,address_space對象的host字段指向主索引節點

基數樹

在任何頁進行I/O操作前都需要檢查該頁是否存在於頁高速緩存中,Linux中使用基數樹對頁緩存進行組織方便搜索

Linux內核利用radix樹在文件內偏移快速定位文件緩存頁,下圖是一個radix樹樣例,該radix樹的分叉為4,樹高為4,葉子節點存放指向頁描述符的指針,上層的節點存放其他孩子節點的指針,可以定位4x4x4x4=256頁,如:圖中虛線對應的兩個葉子結點的路徑組成值0x00000010和0x11111010,指向文件內相應偏移所對應的緩存頁。

操作系統頁高速緩存

Linux內核根用戶配置將樹的slot數定義為4或6,即每個結點有16或64個slot,如下圖所示,當樹高為1時,64個slot對應64個頁,當樹高為2時,對應64*64個頁。

操作系統頁高速緩存

2.4之前中使用散列表缺點

  1. 使用單個全局鎖保護散列表,所得競爭相當嚴重,造成性能損失

  2. 搜索面太大

  3. 搜索失敗必須遍歷指定的散列鍵值對應的整個鏈表

  4. 散列表內存消耗更大


分享到:


相關文章: