关键词:
内存分配
阻塞式同步
异构系统
操作系统
函数式编程
摘要:
动态内存分配器是现代应用程序重要组成部分,它负责管理空闲内存并处理用户内存请求.现代通用动态内存分配器能够提供较为平衡的性能与内存利用率,但考虑到不同应用场景的内存使用情况和优化目标不同,使用通用内存分配器并非最优解.针对应用场景定制的专用内存分配器通常能够更好地满足系统需要,然而编写专用内存分配器较为费时,也容易出错.开发者通常使用内存分配框架搭建专用动态内存分配器.然而,现有的内存分配框架存在抽象能力较差,组合性与定制性不足的问题.为此,从函数式编程视角审视动态内存分配过程,基于函数可组合性提出了一种可组合的定制化动态内存分配器框架榫卯.榫卯框架将系统内存分配抽象为多个互不耦合的内存分配层级函数的组合,这些层级函数能够扩展出策略槽,以提供更高的定制性和组合性.榫卯框架基于标准C实现,依赖C预处理器的元编程特性实现层级函数组合的零性能开销.开发者能够通过组合与定制分配器的层级函数,快速构建出适合应用场景的内存分配器.为了证明榫卯框架的有效性,使用榫卯框架构建了3种不同的内存分配器实例:tlsfcc,hslab与wfslab,其中tlsfcc针对多核嵌入式应用场景,通过替换同步策略优化并发吞吐率;hslab是核心感知的slab式分配器,通过定制线程缓存优化在异构硬件的性能;wfslab是低延迟的无等待/无锁分配器.为了评估这3种内存分配器实例,通过运行基准测试对比现有内存分配器.实验分别在8核x86/64平台和8核异构aarch64嵌入式平台进行.实验表明tlsfcc与原始tlsf分配器相比,在上述两个平台上分别取得了平均1.76和1.59的加速比;对比hslab与类似架构的tcmalloc,它在两个平台的平均执行时间仅为tcmalloc的69.6%和85.0%;wfslab则取得了参与实验对比的内存分配器中最小的最差情况内存请求延迟,其中包括目前最先进的无锁内存分配器mimalloc和snmalloc.