jemalloc,mmap和共享内存?

时间:2015-06-15 01:45:11

标签: c memory memory-management shared-memory

可以修改jemalloc以从共享内存分配吗? FreeBSD函数dallocx()意味着你可以提供一个用于分配的指针,但是我没有看到明显的方法告诉jemalloc限制所有分配来自该内存(也没有设定尺寸等。)

  

dallocx()函数使ptr引用的内存可用于将来的分配。

如果没有,这种功能的努力程度是多少?我很难找到一个可以从我提供的共享内存部分分配的现成分配方案。

同样,可以将jemalloc配置为从锁定的内存区域进行分配以防止交换吗?

请随意向我指出需要修改的相关代码部分,并提供任何想法或建议。

我正在探索的想法是 - 因为您可以创建用于在线程环境中分配的竞技场/堆,正如jemalloc所做的那样可以最小化争用,这个概念似乎可以在多处理环境中分配共享内存区域,即我使用mmap()创建N个共享内存区域,我想利用jemalloc(或任何分配方案)的功能尽可能有效地分配,最小的线程争用,来自那些这些共享区域,即如果线程/进程没有访问相同的共享区域和竞技场,则争用的可能性很小,malloc操作的速度也会提高。

这与使用malloc() API的全局池alloc不同,因为通常这些需要全局锁有效地序列化用户空间。我想避免这种情况。

编辑2:

理想情况下是这样的api:

// init the alloc context to two shmem pools
ctx1 = alloc_init(shm_region1_ptr);
ctx2 = alloc_init(shm_region2_ptr);

(... bunch of code determines pool 2 should be used, based on some method
of pool selection which can minimize possibility of lock contention
with other processes allocating shmem buffers)

// allocate from pool2
ptr = malloc(ctx2, size)

1 个答案:

答案 0 :(得分:4)

是。但是当你问这个问题时,情况并非如此。

Jemalloc 4(2015年8月发布)有几个mallctl名称空间,可用于此目的;它们允许您指定每个竞技场,特定于应用程序的块分配挂钩。特别是,arena.<i>.chunk_hooks命名空间和arenas.extend mallctl选项是有用的。存在integration test,演示如何使用此API。

关于基本原理,我希望理解任何特定内存段上的争用所需的有效“消息传递”开销类似于仅仅竞争的开销,因为您将降级为在缓存上竞争准确更新特定领域的“争用”值。

由于jemalloc已经采用了许多技术来减少争用,因此您可以通过使用opt.narenas创建其他竞技场,在高度线程化的环境中获得类似的行为。这会减少争用,因为更少的线程将被映射到竞技场,但由于线程实际上是循环的,所以无论如何你都可以进入热点。

要解决此问题,您可以进行争用计数和热点检测,只需使用thread.arena mallctl界面将一个线程切换到竞争较少的竞技场。