glibc堆概述(笔记2)

目录

1.各类bin介绍

(1)fast bin

(2)unsorted bin

(3)small bin

(4)large bin


1.各类bin介绍

     chunk被释放时,glibc会将它们重新组织起来,构成不同的bin链表,当用户再次申请时,就从中寻找合适的chunk返回给用户。bin的种类一共有四种:

      fastbinsY:这是一个bin数组,里面有NFASTBINS个fast bins。

      bins:也是一个bin数组,一共有126个bin,分别是:

                 bin 1 为unsorted bin

                 bin 2 到bin 63 为small bin

                 bin 64 到 bin 126 为 large bin

(1)fast bin

             glibc对这类bin使用单链表结构,采用后进先出的分配策略。

             fast bin 里的chunk不会进行合并操作,所以下一个chunk不会进行合并操作,所以下一个chunk的PREV INUSE始终标记为1,使其处于使用状态。

             同一个fast bin里chunk大小相同,并且在fastbinsY数组里按照从小到大的顺序排列,序号为0的fast bin中容纳的chunk大小为4*SIZE_SZ字节,随着序号增加,所容纳的chunk递增2*SIZE_SZ字节。(图例见书:P230) 

(2)unsorted bin

             一定大小的chunk被释放时,在进入small bin 或者large bin之前,会先加入unsorted bin。

             unsorted bin 使用双链表结构,并采用先进先出的分配策略。

             unsorted bin 中的chunk大小可能是不同的,并且由于是双链表结构,一个bin会占用bins的两个元素。(图例见书:P230)

(3)small bin

            同一个small bin 里chunk的大小相同,采用双链表结构,small bin 在bins 里居第2到第63位,共62个。根据排序每个small bin的大小为2*SIZE_SZ*idx(idx表示bins数组的下标)。64位下,最小为2*8*2-=32字节,最大为2*8*63=1008字节。由于small bin 和fast bin 有重合的部分,所以这些chunk在某些情况下会被加入small bin 中。(图例见书:P230)

(4)large bin

             large bin 在bins 里居第64位到第126位,共63个,被分成了6组,每组bin所能容纳的chunk按顺序排成等差数列,公差是:

32 bins of size 64
16 bins of size512
 8 bins of size4096
 4 bins of size32768
 2 bins of size262144
 1 bins of sizewhat's left

        large bin 也是采用双链表结构,里面的chunk从头结点的fd指针开始,按大小顺序进行排列。为了加快检索速度,fd_nextsize和bk_nextsize用于指向第一个与自己大小不同的chunk,所以也只有在加入了大小不同的chunk时,这两个指针才会被修改。

   刚开始学堆,不清楚应该怎么学,先学基础知识来着,对于在书上看到的,觉得重要的做笔记记录一下。

    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值