1

我在使用 FreeBSD 和大型 mmap 时遇到了一些麻烦。Linux 没有显示相同的问题。

在程序启动时,它总是可以获得 1 GB 的地图。但是,有一个重新加载操作,文件被替换和重新映射。新地图通常每次都会稍微大一点,因此它不能整齐地融入旧的 mmap 位置。这种重映射在 FreeBSD 上经常失败,但在 Linux 上几乎没有。(它在使用 ASLR 的 Linux 上更经常失败。FreeBSD 使用ASLR吗?)

认为这是因为库加载了其他库以及在程序运行期间完成的内存分配导致了虚拟内存空间的碎片化。FreeBSD 的 malloc 实现或库加载可能有一些特殊性导致了这种情况。

我正在寻找一些我可以做的事情,以使其更有可能发挥作用。

我正在考虑的一件事是总是映射一个完整的 1 GB 空间,即使文件大小实际上可能是 890 MB。如果我能完成这项工作,那么我将始终有一个 1 GB 的插槽来将新的 895 MB 文件重新映射到其中。

4

1 回答 1

3

该问题可能是由于没有足够大的连续地址空间块引起的。它很可能在具有 1Gb mmap 的 32 位系统上。

考虑专门使用 64 位系统(现在大多数公司都为生产服务器使用),或者使用 mmap() 代替几个较小的区域。

你不会解决这个问题。

于 2010-09-09T16:11:26.697 回答