【學習筆記】4. 堆的申請和釋放

1. 堆的申請

1.1 過程介紹

關於堆的描述,已經簡單的在上面一篇文章中作過簡單的介紹。具體能夠參考 chunk 和 binshtml

下面咱們來回溯下堆的申請過程segmentfault

clipboard.png

clipboard.png

申請的順序:學習

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

1.2 例子演示

示例:申請大小不一樣的內存塊spa

clipboard.png

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

clipboard.png

輸出結果,打印地址指針

clipboard.png

前面三個是連續的(緊挨着的),後面一個相差比較大,是從 mmap 分配的code

若是申請8K的不夠用了,P6是從 P3後面從新申請的視頻

2. 堆的釋放

示例代碼:

clipboard.png

clipboard.png

clipboard.png

能夠看出 P5的地址和P1是同樣的

根據結果倒推理論:htm

釋放的 unsorted bins 對 32k 的進行切割,分給 24 k ,剩下的8k 放到本身上blog

再次申請6k的chunk

clipboard.png

P6 申請了6k,unsorted bins 的 8k 進行再分配

申請8k

若是申請了8k,就不行了 ,由於bins 的 chunk 有頭部大小,因此不能簡單的 24 + 8

須要從尾部從新分配地址空間

clipboard.png

3. 堆的合併

clipboard.png

地址是連續的

clipboard.png

過程推演

  1. 釋放 32k ,會放到 unsorted bins
  2. 申請 12k,先從 fast bins 中查找,沒有找到,而後去 small bins 沒有。 而後去 unsorted bins ,有一個 32k的
    進行切割,12k 返回,剩下的20k 放到 unsorted bins
  3. 申請 80k k,先從 fast bins 中查找,沒有找到,而後去 small bins 沒有。 而後去 unsorted bins
    沒有,而後就去把 small bins 的拿過來放到 unsorted bins ,合併 。 可進行84k 的切割,80k 的返回
    剩下的 4k 放到 unsorted bins

100. 致敬

若有不詳,請參考王老師的精彩講解 堆棧管理
學習過程當中,得到了極大的知足感,把以前的一些東西串聯了起來。十分感謝 王利濤老師
在此表示感謝。
PS:本文中全部的資源和圖片均來自視頻中
另外十分推薦一本書 深刻理解計算機系統

相關文章
相關標籤/搜索