Macos 如何确保malloc和mmap协作,即在不重叠的内存区域上工作?

Macos 如何确保malloc和mmap协作,即在不重叠的内存区域上工作?,macos,malloc,mmap,Macos,Malloc,Mmap,我的主要问题是,我需要使多个OS进程能够通过一个大型共享内存堆进行通信,该内存堆映射到所有进程中相同的地址范围。(以确保指针值实际有意义。) 现在,我遇到了麻烦,程序/库的一部分正在使用标准的malloc/free,在我看来,底层实现不尊重我用mmap创建的映射。 或者,另一个选择是在malloc已经计划使用的区域中创建映射 不幸的是,在建立mmap映射之前,我无法保证所有进程中的malloc/free行为100%相同 这导致我将MAP_固定标志赋予mmap。第一个进程使用0x0作为基址,以确保

我的主要问题是,我需要使多个OS进程能够通过一个大型共享内存堆进行通信,该内存堆映射到所有进程中相同的地址范围。(以确保指针值实际有意义。)

现在,我遇到了麻烦,程序/库的一部分正在使用标准的malloc/free,在我看来,底层实现不尊重我用mmap创建的映射。 或者,另一个选择是在malloc已经计划使用的区域中创建映射

不幸的是,在建立mmap映射之前,我无法保证所有进程中的malloc/free行为100%相同

这导致我将MAP_固定标志赋予mmap。第一个进程使用0x0作为基址,以确保映射范围至少在某种程度上是合理的,但这似乎不会转移到其他进程。(二进制文件还与-Wl,-no_饼链接。)

我试图通过阅读了解是否可以查询系统,以了解它计划为malloc使用哪些页面,但该API似乎没有提供我所需要的

有没有办法确保malloc没有使用特定的内存页/地址范围

(它需要在OSX.Linux提示上工作,我们也非常感谢这些提示引导我走向正确的方向。)

我注意到以下几点:

如果指定了MAP_FIXED,则成功的mmap将删除分配地址范围内的所有以前的映射

但是,
malloc
不会使用map fixed,所以只要你在malloc之前进入,你就没事了:你可以先尝试在没有
map\u fixed
的情况下映射一个区域,然后测试该区域是否空闲,如果在同一地址成功(如果该地址空闲,就会这样做)然后,您可以使用
MAP\u FIXED
重新映射,知道您没有选择
malloc
已经占用的地址空间部分

保证同一逻辑内存块在两个进程中可用的唯一保证方法是使一个分支与另一个分支分开

但是,如果您使用64位指针进行编译,那么您可以选择一个(不寻常的)内存区域,并希望得到最好的结果,因为发生冲突的可能性很小

另请参阅有关有效地址空间的信息。

OpenBSD malloc()实现使用mmap()进行内存分配。我建议您先看看它是如何工作的,然后编写自己的malloc()自定义实现,并告诉您的程序及其使用的库使用自己的malloc()实现

以下是OpenBSD malloc():


RBA

我认为解决这个问题的方法比再滚一个马洛克要简单得多!不幸的是,我找到的最可靠的方法不是通用的:我能够稍微重新构造我的Smalltalk VM,并且能够在
fork()
之后摆脱典型的
exec()
。这会自然地保留mmappings。然而,它还有一系列其他的权衡。