jemalloc、mmap和共享内存?

jemalloc、mmap和共享内存?,c,memory,memory-management,shared-memory,C,Memory,Memory Management,Shared Memory,可以修改为从共享内存分配吗?FreeBSD函数意味着您可以提供一个用于分配的指针,但我看不到一种明显的方法来告诉jemalloc限制该内存中的所有分配(也不设置大小等) dallocx()函数使ptr引用的内存可用于将来的分配 如果没有,这类功能的工作水平如何?我正在努力寻找一个现成的分配方案,可以从我提供的共享内存部分进行分配 类似地,jemalloc是否可以配置为从内存的锁定区域进行分配以防止交换 请随时向我指出需要修改的相关代码部分,并提供任何想法或建议 我正在探索的想法是-由于您可以创建

可以修改为从共享内存分配吗?FreeBSD函数意味着您可以提供一个用于分配的指针,但我看不到一种明显的方法来告诉
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)

对。但当你问这个问题时,这不是真的

Jemalloc 4(于2015年8月发布)有两个
mallctl
名称空间可用于此目的;它们允许您指定每个竞技场、特定于应用程序的区块分配挂钩。特别是,名称空间和
mallctl
选项是有用的。存在一个演示如何使用此API的

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

由于jemalloc已经采用了许多技术来减少争用,因此通过使用创建其他竞技场,您可以在高度线程化的环境中获得类似的行为。这将减少争用,因为映射到竞技场的线程会更少,但由于线程实际上是圆形的,所以您还是有可能到达热点


要解决这个问题,您可以进行争用计数和热点检测,只需使用
mallctl
接口将线程切换到争用较少的竞技场上。

这让我觉得是个XY问题。您是否特别想要共享内存分配器的jemalloc属性?jemalloc的全部要点是,它试图避免在同一进程中的线程之间共享(在内存使用方面付出了巨大代价),以优化性能。如果您只是想要一个带有类似malloc的API的共享内存分配器,这是一个简单得多的主题,并且不涉及jemalloc.AFAICT,
dallocx()
相当于
free()
,所以可能不是您想要的。@Hasturkun-是的,我想我过于乐观了,因为我所追求的东西被提供了一些钩子。@R..我澄清了这个问题。我意识到我在寻找一些广泛的东西,不太可能由malloc的dropin提供,而更可能是某种框架。但是,我可以看到分配器需要返回与内存池关联的上下文,以便用于目标分配。如果您只需要一个类似malloc的替换,它可以从共享内存进行分配,并且适合于多进程/多线程任务,那么您可以使用