6.7.1 Linux使用的緩存linux
無論在硬件設計仍是軟件設計中,高速緩存是得到高性能的經常使用手段。Linux 使用了多種和內存管理相關的高速緩存。web
1. 緩衝區高速緩存:緩存
緩衝區高速緩存中包含了由塊設備使用的數據緩衝區。這些緩衝區中包含了從設備中讀取的數據塊或寫入設備的數據塊。緩衝區高速緩存由設備標識號和塊標號索引,所以能夠快速找出數據塊。若是數據可以在緩衝區高速緩存中找到,則系統就沒有必要在物理塊設備上進行實際的讀操做。數據結構
內核爲每一個緩衝區維護不少信息以有助於緩和寫操做,這些信息包括一個「髒(dirty)」位,表示內存中的緩衝區已被修改,必須寫到磁盤;還包括一個時間標誌,表示緩衝區被刷新到磁盤以前已經在內存中停留了多長時間。由於緩衝區的有關信息被保存在緩衝區首部,因此,這些數據結構連同用戶數據自己的緩衝區都須要維護。函數
緩衝區高速緩存的大小能夠變化。當須要新緩衝區而如今又沒有可用的緩衝區時,就按需分配頁面。當空閒內存變得不足時,例如上一節看到的狀況,就釋放緩衝區並反覆使用相應的頁面。性能
2. 頁面高速緩存spa
頁面高速緩存是頁面I/O操做訪問數據所使用的磁盤高速緩存。咱們在文件系統會看到,read( )、write( )和mmap( )系統調用對常規文件的訪問都是經過頁面高速緩存來完成的。由於頁面I/O操做要傳輸整頁數據,所以高速緩存中所保留的信息單元是一個整頁面。一個頁面包含的數據未必是物理上相鄰的磁盤塊,所以就不能使用設備號和塊號來標識頁面。相反,頁面高速緩存中一個頁面的標識是經過文件的索引節點和文件中的偏移量達到的。設計
與頁面高速緩存有關的操做主要有三種:當訪問的文件部分不在高速緩存中時增長一頁面,當高速緩存變得太大時刪除一頁面,以及查找一個給定文件偏移量所在的頁面。orm
3.交換高速緩存繼承
只有修改後的(髒)頁面才保存在交換文件中。修改後的頁面寫入交換文件後,若是該頁面再次被交換但未被修改時,就沒有必要寫入交換文件,相反,只需丟棄該頁面。交換高速緩存實際包含了一個頁面表項鍊表,系統的每一個物理頁面對應一個頁面表項。對交換出的頁面,該頁面表項包含保存該頁面的交換文件信息,以及該頁面在交換文件中的位置信息。若是某個交換頁面表項非零,則代表保存在交換文件中的對應物理頁面沒有被修改。若是這一頁面在後續的操做中被修改,則處於交換緩存中的頁面表項被清零。 Linux 須要從物理內存中交換出某個頁面時,它首先分析交換緩存中的信息,若是緩存中包含該物理頁面的一個非零頁面表項,則說明該頁面交換出內存後尚未被修改過,這時,系統只需丟棄該頁面。
這裏給出有關交換緩存的部分函數及功能:位於/ linux/mm/swap_state.c 中。
初始化交換緩衝,設定大小,位置的函數:
extern unsigned long init_swap_cache(unsigned long, unsigned long);
顯示交換緩衝信息的函數:
extern void show_swap_cache_info(void);
加入交換緩衝的函數:
int add_to_swap_cache(unsigned long index, unsigned long entry)
參數index是進入緩衝區的索引(index是索引表中的某一項),entry是‘頁面表項’(即此頁面在交換文件中的位置記錄,這個記錄相似頁面表項,參見交換機制)
複製被換出的頁面:
extern void swap_duplicate(unsigned long);
當使用copy_page_tables()調用,來實現子進程在fork()時繼承被換出的頁面,可參閱交換機制一節。
從緩衝區中移去某頁面
delete_from_swap_cache(page_nr);
4 硬件高速緩存
常見的硬件緩存是對頁面表項的緩存,這一工做實際由處理器完成,其操做和具體的處理器硬件有關(但管理要由軟件完成),對這一緩存接下來要進一步描述。