heap - 2 - chunk的分类

堆块最小分配的单位 —— malloc_chunk !

1. chunk的结构体

1
2
3
4
5
6
7
8
9
10
11
12
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;
};
  • 结构成员
    • 通用结构成员
      • struct malloc_chunk是每次分配堆块的基本单位
      • prev_size 为上一个 空闲 相邻堆块(虚拟 内存中相邻, bin链中相邻,下同)的chunk大小
        • 如果上一个相邻堆块 不空闲 ,则该变量无用
        • 那么,该变量的空间可以给上一个堆块使用,即 空间复用
      • size为当前chunk的大小(该变量可 & 上各种标志位以记录数据,例如PREV_INUSE标志位)
      • 指针fd指向下一个chunk(当该chunk位于链尾时指向arena
      • 指针bk指向上一个chunk(当该chunk位于链头时指向arena,fast chunks除外)
    • 当这个chunk为 large chunk 时,才会使用以下结构成员
      • fd_nextsize指向大于当前chunk大小、且位于相同large bin链的chunk
      • bk_nextsize指向小于当前chunk大小、且位于相同large bin链的chunk

2. allocated chunk

  • 为便于称呼,我们称,已被分配给用户的chunk为allocated chunk

  • 当free chunk被分配时,返回给用户的指针为 该chunk首地址 + 2 x SIZE_SZ
    即该chunk的成员fd指针的地址

    • SIZE_SZsize_t的大小
      在32位程序中SIZE_SE为4字节、64位程序中为8字节
      • 其代码为

        1
        2
        3
        4
        5
        6
        #ifndef INTERNAL_SIZE_T
        #define INTERNAL_SIZE_T size_t
        #endif

        /* The corresponding word size */
        #define SIZE_SZ (sizeof(INTERNAL_SIZE_T))
  • 当chunk被分配时,指针fd、bk、fd_nextsize、bk_nextsize 无用,故该部分空间被分配给用户使用,用户所得到内存空间从指针fd的内存地址开始

2. free chunk

  • free chunk, 指的是已经被操作系统释放的空闲chunk
  • 不同于allocated chunk,此时该free chunk的指针fd、bk等有作用,不可被随意覆盖、

3. top chunk

  • 地址最高、位于堆顶的的free chunk,称为top chunk
  • 该 chunk 不属于 任何bin,只由arena直接管理
  • 当所有free chunk都无法满足用户需求时,如果top chunk够大,则top chunk将会被切割为两部分,第一部分分配给用户,第二部分会成为新的top chunk

4. last remainder chunk

  • 当用户请求的是一个small chunk,并且该请求无法被small bin和unsorted bin满足
  • 此时查找最合适的chunk,并把该chunk切割,剩余部分放入unsorted bin里并成为新的last remainder
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2020-2021 Kiprey
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~