linux堆管理相关

面试的时候被问道malloc的大致过程,以及多线程中,线程中的堆栈是否是私有的。这两个问题都答的比较含糊,盖因我本来就没搞明白……

现在的答案是——

1.malloc分配时,先拿到对应线程(非多线程情景下为main arena)的堆管理结构malloc_state(arena),在里面找合适的空闲chunk,找到了就返回给caller,没找到的话——

        a.caller为main thread。main thread的堆就在进程空间的heap区,此区的管理结构即为main arena(是一个malloc_state结构体),没有在free bin中找到合适的chunk的话,

           判断top chunk 空间是否满足caller要求,

                                                                           m.若满足,就从top chunk中分一部分返回给caller,此时top chunk 被分割,剩余部分成为新的top chunk。

                                                                            n.若不满足,则发起系统调用申请更多的堆空间。也就是扩展top chunk。然后再分割top chunk给caller(未读源码,猜测)。

         b.caller为thread x。普通线程的堆是调用mmap在内存映射区申请的空间。thread x首次malloc时,若进程arena总数不超过最大arena数(此数为32位:2*核心数+1;64位:8*核心数+1),则给thread x分配对应的arena,否则与其他arena共享一个arena,方法为依次给各个arena上锁(查看是否有其他线程正在使用该arena),如果上锁成功(没有其他线程正在使用),则使用该arena,之后一直使用这个arena,如果无法使用则阻塞等待。

            寻找空闲chunk及没有合适的空闲chunk时的处理与main arena类似。

            当thread arena的top chunk也没有足够的空间时,malloc会再次调用mmap为此thread arena再分配一个heap_info。其关系如下图所示。


2.同一个进程的子孙线程共享一个进程空间。但是每一个线程都有为其专配的栈。堆就不一定是专用的了。如上所述。

关于堆管理的更多细节——https://zhuanlan.zhihu.com/p/24753861

________________________________________________________________________________________________________

又get到一点:线程栈的空间开辟在所属进程的堆区

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值