1. 程式人生 > >記憶體空間分配

記憶體空間分配

glibc的malloc實現,會按照分配記憶體大小的不同而使用不用的方法,小空間的分配會直接使用堆,大空間的分配使用的就是匿名記憶體對映。(目前是以128KB的空間為大小的界限)

堆實現

簡單的說,就是把資料段切分為一系列2的整數冪大小的塊,然後相鄰的分割槽,哪裡有位置,就使用哪裡的記憶體;不用了就標記一個"不使用"。一般堆的頂端都有一個端點,如果當前堆頂是空的,可以呼叫 brk(),降低斷點的位置,將空間返還給系統。

我理解的內部碎片和外部碎片

堆實現的這個"夥伴記憶體分配演算法",雖然高速簡單,但是會產生"內部碎片"和"外部碎片"。內部碎片降低空間的利用率。外部碎片則是有記憶體空間卻由於被分成不同塊而無法使用。

記憶體對映實現

匿名記憶體對映和基於檔案的對映很像,匿名記憶體對映使用 mmap() 時,start 引數使用NULL,也就是說不管對映在什麼地方,所以叫匿名。

使用匿名記憶體對映後,媽媽再也不用擔心我的記憶體碎片問題了,不用直接取消對映就好,想用再映射回來。但是凡事有優點就有缺點,每個記憶體對映都是頁的大小的整數倍,也就是說,需要分配的空間越小,對空間的浪費就越多;所以只有在對大量空間分配時才使用記憶體對映。

參考源