堆學習--艱難之路
看了好幾天大概是明白了每一個的chunk,堆的結構構成
fast bin ;unsort bin;small bin ;large bin
今天剛明白了在chunk未使用的時候是在連結串列之中的。
-------------2018年9月25日
/* This struct declaration is misleading (but accurate and necessary). It declares a "view" into memory allowing access to necessary fields at known offsets from a given base. See explanation below. */ struct malloc_chunk { INTERNAL_SIZE_T prev_size; /* Size of previous chunk (if free). */ INTERNAL_SIZE_T size; /* Size in bytes, including overhead. */ struct malloc_chunk* fd; /* double links -- used only if free. */ struct malloc_chunk* bk; /* Only used for large blocks: pointer to next larger size. */ struct malloc_chunk* fd_nextsize; /* double links -- used only if free. */ struct malloc_chunk* bk_nextsize; };
這就是堆堆大概結構了
prev_size : 如果前一個chunk是空閒的那麼該位置儲存的是前一個chunk的大小,反之則可以儲存前一個chunk的資料。前一個chunk是指地址較低的chunk。
size:這是chunk的大小,chunk的大小必須滿足要求,也就是大小必須是2*SIZE_SZ的整數倍。如果不滿足要求則會讓其自動轉化為滿足大小的最小的chunk大小。在64位中SIZE_SZ是4,而在32位中則是8.該欄位的低三位和chunk的大小沒有關係。聽xman的講師說這在堆的題目中一般是用不到這裡就不細說了。
NON_MAIN_ARENA:是否屬於主執行緒,是是1,不是為0
IS_MAPPED:記錄是否有mmap分配而來
PREV_INUSE:用來記錄前一個chunk是否被分配,如果p位為0那麼我們就可以通過prev_size對前一個chunk的大小和地址進行訪問。
fd,bk:當chunk屬於分配情況下時,fd一段開始就是指向使用者的資料,當空閒是則會加入連結串列結構之中。
fd_nextsize, bk_nextsize:chunk空閒時才會有,一般用於large chunk
今天再看這些就已經蠻清楚了,對於chunk的一個完整結構有了比較好的理解。
上個圖大概的chunk的結構效果圖:
這裡可以看見這個完整的chunk結構,前面的3塊我們就叫做chunk header。
-----------------9月26日堆的大致影象記錄