看了好几天大概是明白了每一个的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日堆的大致图像记录