glibc-malloc申请堆空间流程分析
创始人
2025-05-28 20:57:00
0

文章目录

    • malloc
      • _int_malloc
    • free 释放堆空间
      • _int_free

malloc

最简单的一个申请堆空间:

void *malloc(size_t bytes) //分配所需的内存空间,并返回一个指向它的指针//参数必须是2*SIZE_SZ的整数倍,如果不是系统会优化为整数倍
//32bit中SIZE_SE为4,也就是堆大小为8的倍数。
//64bit中SIZE_SZ为8,那么就是16的倍数。
  • 第一次调用malloc的时候会先初始化一个叫main_arena(libc中)的东西,并向kernel申请一大块内存区域(top tunck)作为堆
  • 再从这一大块内存区域分割出一个chunk,让malloc回传给程序(这个回传值是一个指针,这个指针指向这个chunk头,tcache前是指向presize,tcache后是指向tcache的数据体)。此时使用的这块内存叫chunk

源码角度:

  • 首先会进入到__libc_malloc(size_t bytes)函数
  • 然后会寻找合适的arena来分配内存
  • 如果没找到就来到 _int_malloc()函数分配内存

_int_malloc

  • 首先将用户请求的bytes(参数一)转换为chunk单位nb
  • 如果没有合适的arena则调用sysmalloc(),用mmap()分配chunk并返回,也就是区分是main线程还是子线程

mmap():为了更快的找到最合适的堆块搜索顺序为如下

fasg binsmall binunsorted binlarge binbins(是否有最小能满足的)top chunk(切分chunk)

sysmalloc():当申请的大小(nb):

  • 大于mp_.mmap_threshold(128 * 1024 byte)时,通过mmap()函数分配
  • 小于时用brk()扩展内存形成新的top chunk,从而旧的 top chunk将被释放掉。从新的top chunk中切分nb大小的chunk给用户

free 释放堆空间

void free(void *mem)//指针指向一个要释放内存的chunk地址
//该内存块之前是通过调用 malloc、calloc 或 realloc 进行分配内存的
//如果传递的参数是一个空指针,则不会执行任何动作。

调用free函数释放指定堆空间时:

  1. 先进入到__libc_free()函数,将指向user data的指针转换为指向chunk的指针
  2. 如果是mmap()函数返回的chunk则通过munmap_chunk()函数释放
  3. 反之获取指向arena的指针,调用 _int_free()函数进行释放

_int_free

调用流程:

  1. 首先获得要释放chunk的大小
  2. 对其进行检查size是否过小或对齐
  3. 判断该chunk是否再fast bin范围内
  4. 如果是则插入fast bin -> 判断chunk是否由mmap()函数生成
  5. 如果不是则进行合并(先向后合并再前合并)
  6. 合并之后的chunk超过了FASTBIN_CONSOLIDATION_THRESHOLD则整理fast bin并返回给系统

释放内存流程如下:

fast chunk就直接进入fast bin先进后出,其他bin则先进入unsort bin充当缓存作用

当在之后申请内存时流程如下:(满足一个条件即退出流程)

小于fast bin大小时在fast bin中查找大于fast bin后进入unsort bin查找合适大小free chunk进行unsort bin遍历进行free chunk合并、归类在对应的bin区域查找top chunk划分

划分)

%%--------------------------------------------------------------------

相关内容

热门资讯

文秘工作内容 文秘工作内容  文秘分为行政文员、办公室文员、秘书等,不同的职业也不同的工作内容,本文主要为您介绍有...
网络安全教育方案 网络安全教育方案(精选9篇)  为保障事情或工作顺利开展,常常需要提前进行细致的方案准备工作,方案是...
XX公司人事管理制度(2) XX公司人事管理制度(2)pan> 关键词: 评论 文章“XX公司人事管理制度(2)” 1、...
公司应急值班管理制度 公司应急值班管理制度(精选10篇)  在社会发展不断提速的今天,人们运用到制度的场合不断增多,制度一...
通知的格式、写法 通知的格式、写法通知是一种使用范围较广的文体。凡需要特定机关和人员知道、办理的事宜,都可以用通知。但...
陕西省建筑职工大学分类考试招... 陕西省建筑职工大学2016年分类考试招生章程  根据国家教育部和陕西省教育厅有关规定,陕西省建筑职工...
大学生寒假就业实践报告 大学生寒假就业实践报告(精选25篇)  转眼难忘的社会实践生活就已结束了,这段经历,相信你有很多感悟...
责任状 责任状范本  责任状作为一种公共管理手段,上下级就某项工作签订责任状,上级将工作任务布置给下级,下级...
工地施工现场管理制度 工地施工现场管理制度(精选17篇)  在当今社会生活中,大家逐渐认识到制度的重要性,制度一经制定颁布...
创意提案改善制度 创意提案改善制度□ 目 的 ?第一条 为启发全体员工的想像力,集结个人的智慧与经验,提出有利于本公司...
工会财务管理制度 工会财务管理制度范本  在生活中,很多地方都会使用到制度,制度是各种行政法规、章程、制度、公约的总称...
文明的倡议书 关于文明的倡议书15篇  在日常生活和工作中,接触并使用倡议书的人越来越多,倡议书是一种号召性的专用...
生产管理制度 生产管理制度(精选18篇)  制度指一定的规格或法令礼俗。用社会科学的角度来理解,制度泛指以规则或运...
计算机软件管理制度 计算机软件管理制度  在当今社会生活中,很多地方都会使用到制度,制度具有合理性和合法性分配功能。那么...
学校学生考勤的管理制度 学校学生考勤的管理制度(通用5篇)  在快速变化和不断变革的今天,越来越多地方需要用到制度,制度一经...
厨房管理规章制度 厨房管理规章制度  在日新月异的现代社会中,制度使用的情况越来越多,制度是各种行政法规、章程、制度、...
监控录像管理制度 关于监控录像管理制度(通用13篇)  在现在的社会生活中,越来越多人会去使用制度,制度是指在特定社会...
服务管理制度 服务管理制度(精选18篇)  在日新月异的现代社会中,越来越多地方需要用到制度,制度是维护公平、公正...
会议纪要的序号格式 会议纪要的序号格式  会议纪要的编号方法在有关公文规范中都有较明确的规定,但也不是绝对死板的。一般来...
搬迁通知 精选搬迁通知模板(通用15篇)  在充满活力,日益开放的今天,我们都不可避免地要接触到通知,通知是机...