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 程序號儲存...