不管在硬件設計還是軟件設計中,高速緩存是獲得高性能的常用手段。Linux 使用了多種和內存管理相關的高速緩存。
1. 緩沖區高速緩存:
緩沖區高速緩存中包含了由塊設備使用的數據緩沖區。這些緩沖區中包含了從設備中讀取的數據塊或寫入設備的數據塊。緩沖區高速緩存由設備標識號和塊標號索引,因此可以快速找出數據塊。如果數據能夠在緩沖區高速緩存中找到,則系統就沒有必要在物理塊設備上進行實際的讀操作。
內核為每個緩沖區維護很多信息以有助於緩和寫操作,這些信息包括一個“髒(dirty)”位,表示內存中的緩沖區已被修改,必須寫到磁盤;還包括一個時間標志,表示緩沖區被刷新到磁盤之前已經在內存中停留了多長時間。因為緩沖區的有關信息被保存在緩沖區首部,所以,這些數據結構連同用戶數據本身的緩沖區都需要維護。
緩沖區高速緩存的大小可以變化。當需要新緩沖區而現在又沒有可用的緩沖區時,就按需分配頁面。當空閒內存變得不足時,例如上一節看到的情況,就釋放緩沖區並反復使用相應的頁面。
2. 頁面高速緩存
頁面高速緩存是頁面I/O操作訪問數據所使用的磁盤高速緩存。我們在文件系統會看到,read( )、write( )和mmap( )系統調用對常規文件的訪問都是通過頁面高速緩存來完成的。因為頁面I/O操作要傳輸整頁數據,因此高速緩存中所保留的信息單元是一個整頁面。一個頁面包含的數據未必是物理上相鄰的磁盤塊,因此就不能使用設備號和塊號來標識頁面。相反,頁面高速緩存中一個頁面的標識是通過文件的索引節點和文件中的偏移量達到的。
與頁面高速緩存有關的操作主要有三種:當訪問的文件部分不在高速緩存中時增加一頁面,當高速緩存變得太大時刪除一頁面,以及查找一個給定文件偏移量所在的頁面。
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 硬件高速緩存
常見的硬件緩存是對頁面表項的緩存,這一工作實際由處理器完成,其操作和具體的處理器硬件有關(但管理要由軟件完成),對這一緩存接下來要進一步描述。