天天看點

【存儲管理】實體頁面的使用和周轉

除CPU之外,實體存儲頁面對于linux來說是最基本,最重要的資源了。虛拟頁面指的是在虛拟位址空間中一個固定大小,邊界與頁面大小4kb對齊及其内容,它最終要映射到某種實體存儲媒體上(實體頁面)。根據具體的媒體不同,實體頁面可以在記憶體中,也可以在磁盤上,分别稱為記憶體頁面和盤上頁面,此外,外部裝置(如網絡接口)用來存儲一個頁面内容的那部分媒體也稱為實體頁面;每一個程序的虛存空間是很大的(使用者空間有3GB),但是每一個程序實際上使用的空間要小的多,不會超過幾個MB,但是當有成千個程序同時存在時,對存儲空間的需求總量就很大了,這時,系統配備足夠的記憶體就很難了。

(1)記憶體頁面都對應一個page結構,并且有全局的mem_map指向,zone是将實體位址連續的許多頁面組成的塊;類似,交換裝置(通常是磁盤或檔案)的每一個實體頁面也在記憶體中有結構swap_info_struct,用以描述和管理頁面交換或裝置;其中swap指向一個數組,數組中的每一個無符号數即代表盤上的一個實體頁面,而數組的下标決定了該頁面在盤上或檔案中位置;pages決定數組的大小,表示頁面交換裝置或檔案的大小;swap_map[0]所代表的頁面不是用于頁面交換的,它包含裝置或檔案的自身資訊和哪些頁面可供使用的位圖;lowest_bit,highest_bit用于表示檔案從什麼地方開始到結束為止提供的頁面;max表示裝置或檔案最大頁面号,也就是裝置和檔案的大小。

(2)swap_on()指定将一個檔案用于頁面交換時,将該檔案的swap_info_struct結構鍊入到隊列swap_list_t中;pte_t将實體記憶體頁面和虛存頁面建立聯系。盤山頁面有一個swap_entry_t,7位type表示頁面在哪一個檔案或裝置中,24位表示頁面在一個磁盤裝置或檔案的位置,最低位永遠為0。當頁面在記憶體時,頁面表中的相應項确定了位址的映射關系,頁面不在記憶體時,則指明了實體頁面的去向和所在。

(3)__get_swap_page()用來配置設定磁盤頁面;__swap_free()用來釋放一個磁盤頁面,通過swap_info(type)得到具體檔案的swap_info_struct,具體頁面通過swap_map(offest)得到,然後判别。不是所有的頁面都可以被交換出去,隻有映射到使用者空間的頁面(普通的使用者空間頁面,含代碼段,資料段,堆棧段;mmap映射的,程序間的共享記憶體區)才會被換出。核心所使用的記憶體頁面也是動态配置設定的,但是常駐記憶體,不會被換出,包括使用外便無價值的(kmalloc,vmalloc,vma_area_struct,alloc_pages),使用完仍有價值的(inode結構,dentry結構,讀寫buffer等),釋放之後要放入LRU隊列中去。

(4)linux采用在系統相對空閑時,挑選一些頁面預先騰出一些頁面記憶體,進而保持一定的供應量;挑選的準則一般是LRU,但是還是避免不了“抖動”;linux為了進一步減小抖動,設定全局性的active_list,inactive_dirty_list兩個隊列,并且在每一個頁面管理區設定一個inactive_clean_list,根據page結構在上述LRU隊列中的位置,就可為回收頁面提供參考。

(5)通過一個全局的address_space資料結構swapper_space把所有可交換的記憶體頁面管理起來,每一個可交換的頁面通過隊列頭list鍊入到其中的一個一個隊列,為加快搜尋,建立了一個雜湊表page_hash_table;核心為每一個剛換入的頁面配置設定一個空白記憶體頁面以後,通過add_to_swap_cache()鍊入到clean_pages隊列中去;其實每一個inode資料結構都有一個成分i_data即address_space;然後還要鍊入到某個雜湊隊列和LRU隊列中的全局的active_list中去。

【存儲管理】實體頁面的使用和周轉