Linux下的記憶體分配

2021-09-12 01:52:04 字數 607 閱讀 6697

1.夥伴演算法

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

2.slab演算法

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

堅持✊

Linux下的記憶體分配

在空間中的記憶體分配如圖所示 通過以下程式可以更加清晰的看出位址之間的聯絡 include int add int a,int const e int main void char str2 10 printf allover eval a p n a printf allover null b p...

windos下的記憶體分配

最近封裝dll庫,發現程式推出的時候總是會有一些log,顯示部分記憶體沒有 除錯發現,這些沒有 的記憶體不是我的 的邏輯造成,而是和dll的一些特性相關。然後研究了一下,windows下的記憶體分配的相關知識。crtd malloc dbg 是debug模式下,new操作實際呼叫的函式,這個函式會分...

Linux系統的記憶體分配

bss block started by symbol 通常是指用來存放程式中未初始化的全域性變數和靜態變數的一塊記憶體區域。特點是 可讀寫的,在程式執行之前bss段會自動清0。所以,未初始的全域性變數在程式執行之前已經成0了。資料段 資料段 data segment 通常是指用來存放程式中已初始化...