linux核心管理物理記憶體是通過分頁機制實現的,它將整個記憶體劃分成無數個4k(在i386體系結構中)大小的頁,從而分配和**記憶體的基本單位便是記憶體頁了。系統在分配記憶體時不再要求大塊的連續記憶體,但是實際上系統使用記憶體時還是傾向於分配連續的記憶體塊。為了儘量減少不連續情況,核心採用了「夥伴」關係來管理空閒頁面。
linux的夥伴演算法把所有的空閒頁面分為10個塊組,每組中塊的大小是2的冪次方個頁面,即第0組中塊的大小都為20(1個頁面),第9組中塊的大小都為29(512個頁面)。也就是說每一組中塊的大小是相同的,且這些同樣大小的快形成乙個鍊錶。以下例子展示該演算法的工作過程:
假設要求分配的塊大小為128個頁面。該演算法現在塊大小為128個頁面的鍊錶中查詢,看是否有這樣乙個空閒塊。如果有就直接分配,否則查詢下乙個更大的塊,也就是在塊大小為256個頁面的鍊錶中查詢乙個空閒塊。如果存在這樣的空閒塊,核心就把這256個頁面分為兩等份,乙份分配出去,另乙份插入到塊大小為128個頁面的鍊錶中。如果在塊大小為256個頁面的鍊錶中也沒有空閒頁塊,就繼續找更大的塊(512個頁面的塊)。如果存在,核心就從512個頁面的塊中分出128個頁面滿足請求,然後從384個頁面中取出256個頁面插入到塊大小為256個頁面的鍊錶中,把剩下的128個頁面插入到塊大小為128個頁面的鍊錶中。如果連512個頁面的鍊錶中也沒有空閒塊,則放棄分配,返回錯誤資訊。
以上過程的逆過程就是塊的釋放過程,滿足以下條件的兩個塊稱為夥伴:1.兩個塊大小相同;2.兩個塊實體地址連續。夥伴演算法把滿足以上條件的兩個快合併為乙個塊。而且該演算法是迭代的,如果合併後的塊還存在夥伴,則繼續合併。
核心中分配空閒頁面的基本函式時get_free_page/get_free_pages,用於分配單頁或者指定的頁面數。get_free_pages實在核心中分配記憶體,而malloc實在使用者空間中分配。malloc在使用者空間分配記憶體可以以位元組為單位分配,但核心在內部仍然以頁為單位分配。
slab
核心常常會使用到圓圓小於一頁的記憶體塊,而且這些小塊記憶體頻繁地生成和銷毀。為了滿足核心對小記憶體塊的需要,linux採用了一種稱為slab分配器的技術。核心思想是「儲存池」的運用。記憶體片段被看作物件,當被使用完後,並不直接釋放而是被快取到「儲存池」中,以供下次使用。slab並不是脫離夥伴關係而獨立存在的一種記憶體分配方式,仍然是建立在頁面基礎上,它將來自夥伴關係管理的頁面分割成眾多小記憶體塊以供使用。
kmalloc
kmalloc是slab分配器提供的藉口,用於完成核心程式中對小於一頁的小塊記憶體的請求。
vmalloc
夥伴關係只是減輕了外部分片(所謂外部分片是指系統雖然有足夠的記憶體,但卻是分散的碎片,無法滿足對大塊「連續記憶體」的需求)的危害,但並未徹底消除。
解決的思路時利用不連續的記憶體塊組成「看起來很大的記憶體塊」,類似於使用者空間分配虛擬記憶體,記憶體邏輯上連續,其實對映到並不一定連續的物理記憶體上。核心提供vmalloc函式分配核心虛擬記憶體。
記憶體管理 物理記憶體 虛擬記憶體
記憶體管理 物理記憶體 pc上有三條匯流排,分別是資料匯流排 位址匯流排和控制匯流排。32位的cpu的定址能力為4gb 2 32 個位元組。使用者最多 可以使用4gb的真實的物理記憶體。記憶體管理 虛擬記憶體 windows的所有程式 包括ring0層和ring3層的程式 可以操作的都是虛擬記憶體。...
作業系統 物理記憶體管理
說明 在系統初始化階段,記憶體被劃分為許多靜態分割槽,程序可以被裝入大於或等於自身的分割槽中。評價操作簡單,但缺乏靈活性,會產生大量內部碎片,並且當程式太大時,乙個分割槽不足以裝入。說明為把乙個程序裝入記憶體,按照一定的分配演算法 首次適應,最佳適應,最壞適應,夥伴系統等 從空閒分割槽中選出一分割槽...
Linux 記憶體管理 線性空間與物理記憶體
linux 記憶體管理 線性空間與物理記憶體 收藏 上圖反映了如下資訊 1 程序的4g 線性空間被劃分成三個部分 程序空間 0 3g 核心直接對映空間 3g high memory 核心動態對映空間 vmalloc start vmalloc end 2 三個空間使用同一張頁目錄表,通過 cr3 可...