歡迎關注我的博客Zhuhao's Blog獲取最新文章
glibc的malloc實現(xiàn),會按照分配內存大小的不同而使用不用的方法,小空間的分配會直接使用堆,大空間的分配使用的就是匿名內存映射。(目前是以128KB的空間為大小的界限)
堆實現(xiàn)

簡單的說,就是把數(shù)據段切分為一系列2的整數(shù)冪大小的塊,然后相鄰的分區(qū),哪里有位置,就使用哪里的內存;不用了就標記一個"不使用"。一般堆的頂端都有一個端點,如果當前堆頂是空的,可以調用 brk(),降低斷點的位置,將空間返還給系統(tǒng)。

我理解的內部碎片和外部碎片
堆實現(xiàn)的這個"伙伴內存分配算法",雖然高速簡單,但是會產生"內部碎片"和"外部碎片"。內部碎片降低空間的利用率。外部碎片則是有內存空間卻由于被分成不同塊而無法使用。
內存映射實現(xiàn)

匿名內存映射和基于文件的映射很像,匿名內存映射使用 mmap() 時,start 參數(shù)使用NULL,也就是說不管映射在什么地方,所以叫匿名。
使用匿名內存映射后,媽媽再也不用擔心我的內存碎片問題了,不用直接取消映射就好,想用再映射回來。但是凡事有優(yōu)點就有缺點,每個內存映射都是頁的大小的整數(shù)倍,也就是說,需要分配的空間越小,對空間的浪費就越多;所以只有在對大量空間分配時才使用內存映射。