malloc底層實現

2021-10-03 06:21:06 字數 880 閱讀 2065

linux維護乙個break指標,這個指標指向堆空間某個位置。從堆起始位址到break之間的位址空間為對映好的,可以供程序訪問

而從break往上,是未對映的位址空間,如果訪問這段空間則程式會報錯。我們使用malloc進行記憶體分配就是從break往上進行的

而rlimit則是限制程序堆記憶體容量的指標,即可分配堆空間的「極限指標」

獲取了break位址,也就是記憶體申請的初始位址

linux通過brk和sbrk系統呼叫操作break指標

在作業系統角度來看,分配記憶體有兩種方式

malloc基本的實現原理就是維護乙個記憶體空閒鍊錶,當申請記憶體空間時,搜尋記憶體空閒鍊錶,找到適合的空閒記憶體空間,然後將空間分割成兩個記憶體塊,乙個變成分配塊,乙個變成新的空間塊

如果沒有找到,那麼就會用sbrk()推進break指標來申請記憶體空間

所要申請的記憶體是由多個記憶體塊構成的鍊錶

記憶體塊的大致結構如下:

typedef

struct s_block *t_block;

struct s_block

;

搜尋空閒塊最常見的演算法有:首次適配,下一次適配,最佳適配。

首次適配:第一次找到足夠大的記憶體塊就分配,這種方法會產生很多的記憶體碎片

下一次適配:也就是說等第二次找到足夠大的記憶體塊就分配,這樣會產生比較少的記憶體碎片

最佳適配:對堆進行徹底的搜尋,從頭開始,遍歷所有塊,使用資料區大小大於size且差值最小的塊作為此次分配的塊

首次適配(first fit)更好的執行效率

最佳適配(best fit)較高的記憶體使用率

如果現有block都不能滿足待申請size的要求,則需要在鍊錶最後開闢乙個新的block,使用sbrk()進行建立新的block

malloc底層實現

1.結論 2.背景 3.分配原理 4.具體情況 1 malloc 小於128k的記憶體時,使用brk系統呼叫在堆上申請記憶體 2 malloc 大於128k的記憶體時,使用mmap系統呼叫在棧與堆之間的對映區分配記憶體 1.結論 1 當開闢的空間小於 128k 時,呼叫 brk 函式,malloc ...

malloc的底層實現

每個程序都有乙個虛擬記憶體空間,虛擬記憶體空間通過mmu 儲存器管理單元 對映到真正的物理空間,mmu是乙個硬體,利用儲存在主存中的查詢表翻譯虛擬位址,查詢表由作業系統管理,使用者無法獲取。虛擬位址空間給每個程序乙個假象,就像每個進城擁有4g的執行空間一樣,但是實際在使用記憶體的時候,虛擬位址空間通...

malloc 底層原理實現

使用過c語言的都知道malloc是乙個動態分配記憶體的函式,還可以通過free釋放記憶體空間。如果我們想分析一下malloc的原始碼,這其實不是一會就能看懂的,但是我們可以討論一下malloc的簡單實現。在這之前,我們先來看一下虛擬記憶體空間。虛擬記憶體空間時作業系統實現記憶體管理的一種機制。作業系...