Linux堆管理基础知识(二)- 数据结构

本文介绍了Linux堆管理中的关键数据结构,包括Arena、Bins(Fast Bin、Unsorted Bin、Small Bin、Large Bin)及其作用。每个线程都有一个Arena,多个线程可能共享。Fast Bin用于快速分配小块内存,采用LIFO策略;Unsorted Bin在分配和释放时提供临时存储;Small Bin管理小于512字节的chunk,Large Bin则管理大于512字节的chunk。内存分配和释放涉及到各种Bin及Top Chunk的交互操作。
摘要由CSDN通过智能技术生成

Arena

glibc的malloc源码中涉及三种数据结构:Arena、Heap、Chunk ,分别对应结构体malloc_state、heap_info、malloc_chunk。具体的对应关系如下图所示

在这里插入图片描述

  • Thread - Arena : 一个Arena对应多个线程Thread。即每个线程都有一个Arena,但是有可能多个线程共用一个Arena。每个Arena都包含一个malloc_state结构体,保存bins, top chunk, Last reminder chunk等信息。
  • Arena - Heap:一个Arena可能拥有多个heap。Arena开始的时候只有一个heap,但是当这个heap的空间用尽时,就需要获取新的heap。
  • Heap - Chunk:一个Heap根据用户的请求会划分为多个chunk,每个chunk拥有自己的header - malloc_chunk。

需要注意的是,Main Arena只有一个heap,因此没有heap_info结构。当main arena用尽空间后,会扩展当前的heap空间。此外,Main Arean的Arena header并不是heap segment的一部分,而作为全局变量储存在libc.so的数据段中。

下图是只有一个heap时,主线程和线程的堆结构示意图,左图是Main Arena,右图是Threa Arena。堆是从低地址向高地址增长的,可以看到每一个malloc_chunk上面都跟着一个chunk。同时Main Arena没有heap_info和malloc_state的结构。

在这里插入图片描述

下图是存在多个heap的thread Arena的情况。可以看到每一个heap都一个heap header(heap_info),但是只有最初的heap拥有arena header

在这里插入图片描述

当线程申请内存时,就创建一个Arena。主线程有自己独立的Arena,叫做main arena,但不是每一个线程都有独立的Arena。

Arena的个数取决于cpu核的个数

For 32 bit systems:
     Number of arena = 2 * number of cores + main arena
For 64 bit systems:
     Number of arena = 8 * number of cores + main arena

Q: 多线程时,Arena是怎样分配的呢?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Morphy_Amo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值