1. 堆的申請
1.1 過程介紹
關於堆的描述,已經簡單的在上面一篇文章中作過簡單的介紹。具體能夠參考 chunk 和 binshtml
下面咱們來回溯下堆的申請過程segmentfault


申請的順序:學習
- 若是申請40B大小的chunk,首先去 fast bins 查看鏈表中是否有合適的,若是有直接返回地址。若是沒有,進行下一步
- small chunk 裏面查找是否有匹配的chunk,若是查找到,直接返回指針地址。 若是沒有,進行下一步
- 在 unsorted bins 查找,若是沒有找到,把 fast bins 裏面的bins 放入 unsorted bins,進行合併,看看是否有知足的,進行切割或者重組,從新分配到 small bins 或者 large bins
- 若是申請的 > 512B,則去large bins 裏面去查找。 若是找到進入下一步,大小相似的能夠進行切換,好比有個 568b 的,切割 512b 返回指針供用戶態使用,剩下的56b,從新放入到unsorted bins。等待下次申請的時候,再次從新分配。
- top chunk。 top chunk 經過移動brk,向內核空間申請
- 對於大於 128k,使用mmap 申請內存。(申請以後的free 會直接釋放,返還給內核空間)
1.2 例子演示
示例:申請大小不一樣的內存塊spa

下圖是:經過堆申請內存空間的時候,在heap中的形象表示。3d

輸出結果,打印地址指針

前面三個是連續的(緊挨着的),後面一個相差比較大,是從 mmap 分配的code
若是申請8K的不夠用了,P6是從 P3後面從新申請的視頻
2. 堆的釋放
示例代碼:



能夠看出 P5的地址和P1是同樣的
根據結果倒推理論:htm
釋放的 unsorted bins 對 32k 的進行切割,分給 24 k ,剩下的8k 放到本身上blog
再次申請6k的chunk

P6 申請了6k,unsorted bins 的 8k 進行再分配
申請8k
若是申請了8k,就不行了 ,由於bins 的 chunk 有頭部大小,因此不能簡單的 24 + 8
須要從尾部從新分配地址空間

3. 堆的合併

地址是連續的

過程推演
- 釋放 32k ,會放到 unsorted bins
- 申請 12k,先從 fast bins 中查找,沒有找到,而後去 small bins 沒有。 而後去 unsorted bins ,有一個 32k的
進行切割,12k 返回,剩下的20k 放到 unsorted bins
- 申請 80k k,先從 fast bins 中查找,沒有找到,而後去 small bins 沒有。 而後去 unsorted bins
沒有,而後就去把 small bins 的拿過來放到 unsorted bins ,合併 。 可進行84k 的切割,80k 的返回
剩下的 4k 放到 unsorted bins
100. 致敬
若有不詳,請參考王老師的精彩講解 堆棧管理
學習過程當中,得到了極大的知足感,把以前的一些東西串聯了起來。十分感謝 王利濤老師。
在此表示感謝。
PS:本文中全部的資源和圖片均來自視頻中
另外十分推薦一本書 深刻理解計算機系統