堆学习--艰难之路

看了好几天大概是明白了每一个的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一段开始就是指向用户的数据,当空闲是则会加入链表结构之中。

扫描二维码关注公众号,回复: 3637040 查看本文章

fd_nextsize, bk_nextsize:chunk空闲时才会有,一般用于large chunk

今天再看这些就已经蛮清楚了,对于chunk的一个完整结构有了比较好的理解。

上个图大概的chunk的结构效果图:

这里可以看见这个完整的chunk结构,前面的3块我们就叫做chunk header。

-----------------9月26日堆的大致图像记录

猜你喜欢

转载自blog.csdn.net/w12315q/article/details/82846268