linux記憶體管理--使用者空間和核心空間
關於虛擬記憶體有三點需要注意:
- 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
相關文章
- Linux使用者空間記憶體管理Linux記憶體
- Linux 核心空間與使用者空間Linux
- Linux記憶體點滴:使用者程式記憶體空間Linux記憶體
- TimesTen臨時(記憶體)空間使用和調整臨時(記憶體)空間記憶體
- JavaScript之記憶體空間JavaScript記憶體
- Linux程式上下文和中斷上下文核心空間和使用者空間Linux
- 10-記憶體空間佈局記憶體
- JVM記憶體分為3個記憶體空間JVM記憶體
- 在 Linux 上如何清除記憶體的 Cache、Buffer 和交換空間Linux記憶體
- 使用者空間與核心的介面
- JVM元空間Metaspace的記憶體結構JVM記憶體
- 深入理解javascript系列(二):記憶體空間JavaScript記憶體
- 為App申請更多的記憶體空間APP記憶體
- JavaScript的記憶體空間、賦值和深淺拷貝JavaScript記憶體賦值
- liunx使用者空間和核心空間之間的通訊實現(在PPC下的實現)(轉)
- Linux 磁碟掛載和swap空間管理Linux
- 利用Kubernetes名稱空間來管理記憶體和CPU資源(二)記憶體
- 利用Kubernetes名稱空間來管理記憶體和CPU資源(一)記憶體
- Linux檢視磁碟目錄記憶體空間使用情況Linux記憶體
- Oracle 本地表空間管理與字典表空間管理Oracle
- 表空間查詢和管理
- PHP陣列到底佔用多少記憶體空間PHP陣列記憶體
- 程式執行時的記憶體空間分佈記憶體
- Java8記憶體模型—永久代(PermGen)和元空間(Metaspace)Java記憶體模型
- 11.管理物件空間(筆記)物件筆記
- Shell磁碟空間和表空間告警程式
- 查詢表空間已使用空間和空閒空間的簡單檢視
- 智慧辦公~空間管理軟體
- 將字典管理表空間轉換為本地管理表空間
- 管理表空間(表空間的屬性)轉貼
- 表空間管理之bigfile表空間設定
- 遷移SYSTEM表空間為本地管理表空間
- C++ 動態記憶體分配與名稱空間C++記憶體
- Oracle表空間管理Oracle
- Oracle 表空間管理Oracle
- ASM表空間管理ASM
- 硬碟空間的管理和分割槽硬碟
- Linux管理指令碼之清理空間Linux指令碼