heap - 4 - _int_malloc的相关操作

_int_malloc的一系列操作

注意! 以下步骤若未明确标明退出函数,则表示在执行完当前操作后,继续执行剩余操作

1. 判断arena是否为空

  • 如果是,则调用sysmalloc分配所需内存,返回并退出

2. 判断所申请的chunk大小是否小于fast chunk的最大值

  • 如果是,则尝试取出fast bin里的第一个chunk(fastbin->fd)
  • 如果该chunk不为空,则检查该chunk是否出错、 返回该chunk用户地址并退出

3. 判断所申请的chunk大小是否小于small chunk的最大值

  • 如果是,并且指向small bin最后一个chunk的指针(smallbin->bk)不指向small bin自己,则判断该指针是否为NULL
    • 如果是,则说明此时是第一次执行该部分代码,则执行malloc_consolidate函数
    • 否则,则说明small bin上存在可用chunk,检查该chunk是否出错、将该chunk取出, 返回该chunk用户地址并退出

4. 取出largebin的索引,并判断是否有空闲的fastchunk

  • 如果有,则执行malloc_consolidate函数

5. 进入大型循环——for循环

1. 遍历unsortedbin里的chunk最多10000次,并执行以下操作

  1. 检测该chunk的大小是否非常小或非常大
    • 如果是,输出错误信息并 退出
  2. 判断用户申请的大小是否同时满足以下3个条件
    1. 在smallchunk的范围内
    2. unsorted bin里只有一个chunk
    3. 并且该chunk是last_remainder
    • 如果是,则切割last_remainder,并将剩余remainder放回unsortedbin里、重设last_remainder、检查chunk,最后 返回该chunk的用户地址并退出
  3. 如果这块chunk刚好与所申请的chunk大小相等,则取出该chunk、检查chunk、 返回该chunk的用户地址并退出
  4. 将遍历到的chunk根据大小放置进small bin或large bin里

2. 尝试在large bin里搜索可用的chunk

  • 如果large bin里,size最大的chunk,其size小于所申请的内存大小
    1. 取出large bin里,size最接近所申请chunk的chunk
    2. 判断该chunk和所申请内存大小相差是否小于MINSIZE
      • 如果是,则多出的这块内存一并附赠给用户
      • 否则,分割这块chunk,将剩余的chunk放入unsorted bin里、检查目标chunk、返回该chunk的用户地址并退出

3. 在其他free chunks大小更大的bin里找更大的内存

  • 由于fastbin、smallbin、largebin上的freechunk是分组的,所以可能出现目标组别上的freechunk无法满足大小,此时使用binmap,去其他更大的bins里查找freechunk

4. 如果执行到了这里,那就真是什么freechunk都找不到了,则判断top chunk是否够用

  1. 如果够用,切割top chunk并使用
  2. 否则,则判断是否有fast chunk空闲
    • 如果有,则执行malloc_consolidate函数,然后 返回for循环起点,重新执行相关代码
    • 否则,调用sysmalloc申请内存,返回该chunk的用户地址并退出
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2020-2024 Kiprey
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~