linux記憶體的使用與page buffer )

來源:互聯網
上載者:User

自:http://blog.csdn.net/eroswang/article/details/4131034

可以將linux看作一個用來管理資源的程式,而其他應用程式跑在其上,linux管理應用程式的記憶體配置,回收,等等。為了管理,它首先需要給自己分配靜態記憶體空間:程式碼片段空間,mem_map[]空間等等。然後它把剩餘的其他RAM用buddy系統進行動態管理。

linux核心的pagetable swapper_pg_dir將虛擬位址0xC0000000~0xC0000000+896M映射到物理地址0x0~0x896M。除去核心代碼佔用的ram外,其餘的物理ram都為空白閑。當核心需要時,直接分配了就可以使用,而不需要再對swapper_pg_dir進行修改。而當使用者空間需要的時候,核心為其分配page,並要修改應用進程的pagetable從而將剛分配的page映射到相應的應用進程地址空間。核心不需要再次映射,因為swapper_pg_dir已經將896M的地址映射到核心去了。除非核心使用HIGH_MEM,這時就要重新對應核心的高128M空間(修改swapper_pg_dir的高128項)。有上可知,只要應用進程分配的page小於896M(在核心地址空間之內),核心都可以直接存取(參見#define __copy_user(to,from,size)其中to為核心地址,使用使用者page_dir的768~896項(3G~3G+896M核心空間),from使用使用者地址:page_dir的0~767項(0~3G-1使用者地址空間))。要是應用進程的page大於896M時,核心就不能直接存取了,需要使用swapper_pg_dir的高128項來映射應用進程的地址空間,這也是HIGH_MEM存在的原因。

RAM的使用
1. 靜態使用:用於linux代碼,資料結構等所佔用的ram,此類ram不需要管理。
2. 動態使用:由buddy管理。通過buddy申請的頁面不使用的時候並不立即釋放給buddy,而是利用3的方式緩衝起來(1)由slab管理起來(2)由兩個雙向鏈表(active_list和inactive_list)管理的頁框(3)由icache和dcache緩衝起來inode和dentry。這樣當系統回收的時候,也是分別通過這三個方面來回收頁面,釋放到buddy中去的。之所以這樣,是由於通過buddy分配或釋放給buddy可能需要分裂大塊或者合并小塊到大的buddy中去,這樣比較費時間。因此盡量將分配來的頁面緩衝起來。(好像linux特別喜歡搞這些緩衝,這樣也就給系統帶來了非同步性。一般來說,非同步性效率更好吧:有緩衝就相當於有了流水,這樣當然可以提高效率)

        之所以要這樣分,是因為:buddy管理會產生大量的內部片段,使用slab來減少片段。一般slab是基於對象的,因此不是以頁框為單位,不便於以頁為單位進行換入換出。而使用雙向鏈表是將系統中正在使用的頁框串聯起來,便於scan,以及頁框為單位的換入換出(回收)。因此,當系統需要回收頁框時,就要從slab和雙向鏈表,inode dentry三方面考慮回收。

      對於雙向鏈表中的頁框,又可以分為兩種使用方式:1. 有後備檔案的頁框(page buffer,mmap等);2. 無後備檔案的頁框(應用程式的程式碼片段,資料區段,堆棧段etc)。對於2,由於無後備檔案,因此需要在磁碟上開闢一個分頁檔,用於存放無後備檔案的頁框,這樣以來,1,2都有後備檔案了。有了後備檔案之後,接下來需要將這些屬於不同檔案的頁框用一個資料結構管理起來:address_space。對於有後備檔案的頁框,使用特定於每個檔案的address_space,對於無後備檔案的頁框,使用系統中公用的address_space:swapper_space.這樣就把1,2統一起來了。

       系統要於磁碟打交道,必須先分配一個page buffer:當需要讀入檔案時,首先要尋找address_space看是否已經存在page_buffer,沒有的話則分配一個page buffer頁框,插入address_space。當寫出磁碟時,也要檢查address_space中是否存在page buffer,沒有的話,分配一個page buffer頁框,並插入address_space然後,將要寫內容寫入該page buffer並返回(該page buffer最終會被頁面回收守護線程重新整理到磁碟上去)。以上的操作過程同樣適用無後備檔案的情況(只是它們使用的address_space是swapper_space)。

page buffer是vfs看見(使用的)設施,而cache buffer是塊驅動程式使用的設施,一個page buffer包含多個cache buffer(當然塊裝置也要使用cache buffer)。也就是說,vfs等上層之能“看見”頁面,而下層的塊裝置驅動程式只能看見塊。所以當vfs要將一個頁寫入塊裝置時候,必須先將頁劃分成幾個buffer,每個buffer用buffer_head描述,一個頁中的buffer_head使用單連表相連,只有才能被底層的裝置識別。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

Tags Index: