内存分配器设计

本文探讨了在多线程环境下设计内存分配器的挑战,如线程竞争和内存碎片,并介绍了借鉴Hoard设计理念的解决方案。设计包括全局堆和本地堆,通过延迟回收和动态内存迁移减少冲突。此外,还利用OpenMP实现多线程编程,并计划进一步优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

设计一个在多线程环境下可以进行高效堆分配的内存分配器。

在多线程环境下,线程共享code, data, heap。因此,在从堆中获取数据时往往需要加锁等操作,从而降低性能。

内存分配需要考虑内容:

  • thread contention
  • memory fragmentation, heap 被分割成了不连续的小块
  • false sharing, 多个线程修改位于同一缓存行的数据

设计思路

借鉴 Hoard 设计思路,设计多层结构,包括:

  • 全局堆:管理所有内存资源,为各个处理器的本地堆提供内存。
  • 本地堆:为每个线程分配自己的本地堆,本地堆管理其分配和释放的内存,减少了不同线程间的内存访问冲突

idea

  • lazy reclaim:free()时不直接将内存返回给system,而是加入一个free list链表中
  • 动态内存迁移:全局堆和本地堆之间的内存可以进行迁移。例如:如果一个本地堆的内存需求长期得不到满足,可以从全局堆迁移内存块给本地堆。当本地堆内存需求小时,可以将本地堆内存迁移至全局堆以便其他线程使用
  • background thread for deallocation:一个线程专门定期将长期不用的block从本地堆转移至全局堆(动态内存迁移),或者释放回系统
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值