嵌入式100題(017) malloc的底層實現

2021-10-19 23:33:36 字數 793 閱讀 8611

使用過c語言的都知道malloc是乙個動態分配記憶體的函式,還可以通過free釋放記憶體空間。

如果我們想分析一下malloc的原始碼,這其實不是一會就能看懂的,但是我們可以討論一下malloc的簡單實現。

在這之前,我們先來看一下虛擬記憶體空間。

虛擬記憶體空間是作業系統實現記憶體管理的一種機制。作業系統為每個程序維護乙個虛擬記憶體空間。作業系統會將虛擬記憶體和實際的物理記憶體進行對映,cpu晶元上叫做儲存器管理單元(memory management unit,mmu)的專用硬體,利用存放在主存中的查詢表來動態翻譯虛擬位址,該錶的內容是由作業系統管理。虛擬記憶體使得使用者感覺記憶體空間時連續的,同時給程序提供獨佔記憶體的假象。

我們可以看到虛擬記憶體空間的頂部是核心管理的記憶體空間,下面則是使用者的記憶體空間,使用者空間無權訪問核心的記憶體空間。

我們可以看到乙個區域,執行時堆。我們可以看到執行時堆上面還有一塊黑色部分,這就是還未對映的記憶體。

在已經對映的記憶體空間結尾有乙個break指標,這個指標下面是對映好的記憶體,可以訪問,上面則是未對映的訪問,不能訪問。可以通過系統呼叫sbrk(位移量)移動brk指標的位置,同時返回brk指標的位置,達到申請記憶體的目。brk(void *addr)系統呼叫可以直接將brk設定為某個位址,成功返回0,不成功返回-1。而rlimit則是限制程序堆記憶體容量的指標。

在操

嵌入式100題(017) malloc的底層實現

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

嵌入式100題(48) 氣泡排序

氣泡排序 氣泡排序就是把小的元素往前調或者把大的元素往後調。比較是相鄰的兩個元素比較,交換也發生在這兩個元素之間。所以,如果兩個元素相等,我想你是不會再無聊地把他們倆交換一下的 如果兩個相等的元素沒有相鄰,那麼即使通過前面的兩兩交換把兩個相鄰起來,這時候也不會交換,所以相同元素的前後順序並沒有改變,...

嵌入式100題(51) 歸併排序

歸併排序 歸併排序是把序列遞迴地分成短序列,遞迴出口是短序列只有1個元素 認為直接有序 或者2個序列 1次比較和交換 然後把各個有序的段序列合併成乙個有序的長序列,不斷合併直到原序列全部排好序。可以發現,在1個或2個元素時,1個元素不會交換,2個元素如果大小相等也沒有人故意交換,這不會破壞穩定性。那...