linux記憶體管理--使用者空間和核心空間

FreeeLinux發表於2017-01-07

關於虛擬記憶體有三點需要注意:

  • 4G的程式地址空間被人為的分為兩個部分--使用者空間與核心空間。使用者空間從0到3G(0xc0000000),核心空間佔據3G到4G。使用者程式通常情況下只能訪問使用者空間的虛擬地址,不能訪問核心空間的虛擬地址。例外情況只有使用者程式進行系統呼叫(代表使用者程式在核心態執行)等時刻可以訪問到核心空間。
  • 使用者空間對應程式,所以每當程式切換,使用者空間就會跟著變化;而核心空間是由核心負責對映,它並不會跟著程式變化,是固定的。核心空間地址有自己對應的頁表,使用者程式各自有不同的頁表。
  • 每個程式的使用者空間都是完全獨立、互不相干的。

一、4G地址空間解析圖

    上圖展示了整個程式地址空間的分佈,其中4G的地址空間分為兩部分,在使用者空間內,對應了記憶體分佈的五個段:資料段、程式碼段、BSS段、堆、棧。在上篇文章中有詳細的介紹。

二、虛擬地址空間分配及其與實體記憶體對應圖

                                               這個圖示核心使用者空間的劃分,圖中最重要的就是高階記憶體的對映

   其中kmalloc和vmalloc函式申請的空間對應著不同的區域,同時又不同的含義。

三、實體記憶體分配圖

    這張圖中頁解釋了三者的不同關係,和上篇文章中的內容有相似之處。

夥伴演算法

    一種實體記憶體分配和回收的方法,實體記憶體所有空閒頁都記錄在BUDDY連結串列中。首選,系統建立一個連結串列,連結串列中的每個元素代表一類大小的實體記憶體,分別為2的0次方、1次方、2次方,個頁大小,對應4K、8K、16K的記憶體,沒一類大小的記憶體又有一個連結串列,表示目前可以分配的實體記憶體。例如現在僅存需要分配8K的實體記憶體,系統首先從8K那個連結串列中查詢有無可分配的記憶體,若有直接分配;否則查詢16K大小的連結串列,若有,首先將16K一分為二,將其中一個分配給程式,另一個插入8K的連結串列中,若無,繼續查詢32K,若有,首先把32K一分為二,其中一個16K大小的記憶體插入16K連結串列中,然後另一個16K繼續一分為二,將其中一個插入8K的連結串列中,另一個分配給程式........以此類推。當記憶體釋放時,檢視相鄰記憶體有無空閒,若存在兩個聯絡的8K的空閒記憶體,直接合併成一個16K的記憶體,插入16K連結串列中。(夥伴演算法用於實體記憶體分配方案)

SLAB演算法:

    是一種對夥伴算的一種補充,對於使用者程式的記憶體分配,夥伴演算法已經夠好了,但對於核心程式,還需要存在一類很小的資料(位元組大小,比如程式描述符、虛擬記憶體描述符等),若每次給幾個位元組的資料分配一個4KB的頁,實在太浪費,於是就有了SLBA演算法,SLAB演算法其實就是把一個頁用力劈成一小塊一小塊,然後再分配。



轉自:http://blog.csdn.net/yusiguyuan/article/details/12045255


相關文章