記憶體管理,是指軟體執行時對計算機記憶體資源的分配和使用的技術。其最主要的目的是如何高效,快速的分配,並且在適當的時候釋放和**記憶體資源。
說到linux記憶體管理,就不得不借用乙個程序記憶體分布圖來進行說明。
上圖是程序的使用者空間記憶體分布說明。關於這個圖,我們重點注意兩點。第一,虛擬位址;第二,堆的brk位置和start_brk位置。
32位的機器為例,虛位址空間最大4gb,3gb為使用者空間,1gb為核心空間。
虛擬位址和實體地址的對映需要硬體mmu支援。虛擬位址的引入可以使得使用者程序安全的操作記憶體,不會導致核心崩潰。
缺頁中斷發生時,會對映虛擬位址到實體地址上。
malloc 時,有幾種場景。
第一,已無空間。修改brk的位置,往後移,返回虛擬位址vp1。使用vp1時,發生缺頁中斷,對映虛擬位址與實體地址。
第二,有之前釋放過的空間。找出乙個best fit,返回虛擬位址vp2。
free 時,記錄釋放的虛擬位址及塊大小,並不返還作業系統,留給上面第二步使用。
關於第一步,缺頁中斷時,會向核心申請n pages的記憶體,這是核心會使用buddy(夥伴)演算法來進行分配。
另外,核心使用slab等分配器來分配較小的記憶體塊。
在已分配的虛擬位址空間中查詢合適大小的記憶體塊(malloc 緩衝,glibc 管理)
修改brk,返回虛擬位址。待後續缺頁中斷發生時,再進行對映。
核心缺頁發生時,對映虛擬位址vp1到實體地址pp1上。vp1後面釋放後,會加入malloc 緩衝當中,有glibc管理。
這個過程中有幾個值得關注的點,malloc 記憶體管理,linux 核心夥伴演算法, linux 核心slab 分配器。
內部碎片,slab。malloc 或 核心均會涉及。
外部碎片,特指核心多頁相關,僅核心涉及,比較著名的是夥伴buddy演算法。
void test2()
sleep(10);
}
測試程式不關心記憶體洩漏,只為說明edata的增長速度,每次132pages,即4k*132。 static在記憶體層面的作用 C 記憶體管理筆記
1.記憶體分配層次 c 申請記憶體分配 1.crt malloc free 2.c primitives new new new operator new 3.c library std allocator 分配釋放 類別能否過載 malloc free c函式不能 newdelete c 表示式 ...
Linux邏輯卷管理
因為之前安裝系統的時候沒考慮使用邏輯卷管理 logical volume management,lvm 現在要用xen安裝多台虛擬機器導致分割槽混亂,所以現在才想到使用邏輯卷管理的好處。本文基本上是參照ibm中國社群的邏輯卷管理這篇文章。邏輯卷管理 lvm 指系統將物理卷管理抽象到更高的層次,常常會...
linux 邏輯卷管理
pv 物理卷 被lv命令組過的物理分割槽 vg 物理捲組 被u組裝到一起的物理卷 pe 物理擴充套件 lvm裝置的最小單元,lvm是pe的整數倍 lvm 邏輯卷 直接使用的裝置,可以增大縮減並保持原有資料 lvm的建立 1.分割槽並指定標籤為8e lvm拉伸 1.針對xfs檔案系統 xfs檔案系統只...