堆基礎知識小結

2021-08-19 21:10:50 字數 1816 閱讀 4157

1、chunk 結構

未分配的chunk

|   

prev_size                     |

|    size

|p=0|

|   fd

| |   bk                     |

| unused

|已分配chunk

|   

prev_size 

|<----|

|  size

|  p=1 |<----|header

|      |<----malloc返回的位址是這裡,注意與未分配的chunk比較,此處應該是fd的起始位置

|data                       |

|              |

---------------------------------------

相鄰的chunk

|prev_size     (上乙個chunk的data)|

此處pre_size可被用作儲存上乙個的data

|     size              

|   p=1   |

由於上乙個chunk被分配,這個chunk的p位為1|fd

| |bk 

|2、fastbin

單向鍊錶

大小x86:16~64 byte

x64:32~128 byte

不會合併

不會修改prev_inuse位,只要分配了後,一直為1

bk不使用

filo:先進後出(從fastbin插入,從fastbin取出)

main_arena.fastbiny: 

size16

size24

size32

......|a

||b|

||||

||-->a|

|size=16|p=1|

---->b|

|size=32|p=1|

|fd=0

|             |

------  |    fd=c||

||||--->c|

|size=32|p=1|

|fd=0         |

|smallbin 

一共63個small bin 

大小<512位元組

16,24...

雙向鍊錶

fifo:先進先出(從smallbin的fd插入,從small bin的bk指標取出)

unsorted bin

只有乙個

當乙個非fast chunk(即small bin或large bin)被free時會被放到unsorted bin中,可理解為small bin 和fastbin 的快取。

2、malloc過程

a 第一次malloc,main_arena是空,需要向系統申請一塊記憶體。

如果申請記憶體<128kb,使用brk。

如果申請記憶體》=128kb,使用mmap。

b 堆已經初始化

在fastbin中尋找合適大小的chunk。

在smallbin中尋找合適大小(of exact size)的chunk。

loop:

1)last_reminder中的last_reminder足夠大的話,從中分出,並把剩餘部分標為last_reminder

2)在unsorted bin中尋找合適大小(of exact size)的chunk,並整理到small/large bin中

3)搜尋small bin和large bin。

3、free過程

堆的基礎知識

堆也可以說是乙個完全二叉樹,就是除了最底層的,其它層是滿的,既然我們可以用完全二叉樹來表示乙個堆,那麼我們這裡就採用陣列結構的二叉樹來闡述堆的性質。假設在這裡我們用陣列a表示堆,a i 表示堆裡面的第i個元素,於是我們通過二叉樹的性質可知 就如下圖表現所示 小優化 我們知道在計算機裡面做乘法和除法是...

Qt基礎知識小結

1 pro與.pri檔案 pri檔案跟pro檔案沒有本質區別,都是起到包含路徑等作用,區別在於pro檔案是主要檔案,pri是附屬檔案。下面是解釋 如果有幾個工程檔案需要共享相同的項,則可以把相同的項提取到單獨的檔案中,在各自的pro檔案中使用include 語句包含它們。通常,打算被別的工程檔案包含...

nginx基礎知識小結

配置檔案講解 user nobody 開啟程序數 cpu數 worker processes 1 錯誤日誌儲存位置 error log logs error.log error log logs error.log notice error log logs error.log info 程序號儲存...