我在使用 FreeBSD 和大型 mmap 时遇到了一些麻烦。Linux 没有显示相同的问题。
在程序启动时,它总是可以获得 1 GB 的地图。但是,有一个重新加载操作,文件被替换和重新映射。新地图通常每次都会稍微大一点,因此它不能整齐地融入旧的 mmap 位置。这种重映射在 FreeBSD 上经常失败,但在 Linux 上几乎没有。(它在使用 ASLR 的 Linux 上更经常失败。FreeBSD 使用ASLR吗?)
我认为这是因为库加载了其他库以及在程序运行期间完成的内存分配导致了虚拟内存空间的碎片化。FreeBSD 的 malloc 实现或库加载可能有一些特殊性导致了这种情况。
我正在寻找一些我可以做的事情,以使其更有可能发挥作用。
我正在考虑的一件事是总是映射一个完整的 1 GB 空间,即使文件大小实际上可能是 890 MB。如果我能完成这项工作,那么我将始终有一个 1 GB 的插槽来将新的 895 MB 文件重新映射到其中。