动态内存分配小结

本文详细介绍了C语言中动态内存分配的实现原理,包括malloc、calloc、free的内部工作机制,以及brk、sbrk、mmap、munmap等系统调用的作用。文章提到了内存分配区的管理方式,如主分配区与非主分配区的线程安全策略,以及bins、fast bins和unsorted bin等内存块组织结构。还讨论了ptmalloc的分配策略,如small bins、large bins、fast bins的使用,以及top chunk和mmaped chunk在分配过程中的角色。此外,文章还提及了一些关键参数,如M_MXFAST、M_TRIM_THRESHOLD和M_MMAP_THRESHOLD,用于调整内存分配的行为。
摘要由CSDN通过智能技术生成
  • malloc/calloc/free是库函数,在底层使用系统调用进行内存申请,自己添加了中间层进行管理,brk,sbrk,mmap,munmap是系统调用。申请的是虚存
  • mmap 映射匿名页, 当发生缺页异常时, linux 内核为缺页分配一个新物理页,并将该物理页清 0
  • 对空闲的小内存块只会在 malloc 和 free 的时候进行合并
  • 主分配区与非主分配区用环形链表进行管理。 每一个分配区利用互斥锁( mutex)使线程对于该分配区的访问互斥。
  • 每个进程只有一个主分配区,但可能存在多个非主分配区, 主分配区可以访问进程的 heap 区域和 mmap 映射区域, 非主分配区每次使用 mmap()向操作系统“批发” HEAP_MAX_SIZE
  • 当某一线程需要调用 malloc()分配内存空间时, 该线程先查看线程私有变量中是否已经存在一个分配区,如果存在, 尝试对该分配区加锁,如果加锁成功,使用该分配区分配内存,如果失败, 该线程搜索循环链表试图获得一个没有加锁的分配区。如果所有的分配区都已经加锁,那么 malloc()会开辟一个新的分配区,把该分配区加入到全局分配区循环链表并加锁,然后使用该分配区进行分配内存操作。在释放操作中,线程同样试图获得待释放内存块所在分配区的锁,如果该分配区正在被别的线程使用,则需要等待直到其他线程释放该分配区的互斥锁之后才可以进行释放操作

  • Bins
  • ptmalloc将相似大小的 chunk 用双向链表链接起来,这样的一个链表被称为一个 bin。 Ptmalloc 一共维护了 128 个 bin,并使用一个数组来存储这些 bin。数组中的第一个为 unsorted bin,
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值