OSX

时间:2015-06-20 16:19:24

标签: c macos mmap

我正在尝试追踪我在OSX中遇到的内存分配问题。 如果我正常编译并运行以下代码,它将运行得非常快。

#include <sys/mman.h>
#define SIZE 8 * 1024 * 1024

int main(int argc, char const *argv[]) {
  for (int i = 0; i < 50000; ++i) {
    mmap(0, SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0);
  }
  return 0;
}

但是,如果我编译相同的代码但链接到某个库(即:clang -o test test.c -lpcre),它将随机快速运行(30ms)或非常慢(18秒)。

请注意,我甚至没有使用该库,只是链接。我也注意到这似乎不会发生在任何库中。

我正在运行OSX 10.10.3。有什么想法吗?

3 个答案:

答案 0 :(得分:4)

这只是其他人遇到的内核中的一个错误。内核中用于查找未分配的地址空间块的代码使用低效的搜索算法。

我怀疑它似乎取决于你是否链接一个库的原因是动态加载器(dyld)必须映射这样一个库,并且有时会将内核的VM管理数据转换为触发它的状态搜索效率低下。它在每次运行中都不会发生的原因可能与地址空间布局随机化(ASLR)有关。

我鼓励您向Apple提交一个关于此问题的错误,特别是因为您有一个简单的测试用例。 (它可能会被重复关闭,因为我确信你不会成为第一个提交它的人。但是,每个新的错误报告都可以帮助隔离它并提高其在Apple内的优先级。)< / p>

答案 1 :(得分:0)

如果你不需要初始化内存,那么使用malloc()会更有效率,因为mmap()的使用不仅要为你的进程分配8兆字节的内存,还要初始化它。

在OS X上,malloc()和mmap()都在内部使用 mmap()系统调用(系统调用号197 - http://www.opensource.apple.com/source/xnu/xnu-1456.1.26/bsd/kern/syscalls.master),它要求内核映射虚拟内存物理记忆。

答案 2 :(得分:-3)

不确定。这是一个想法。每个人和他的狗通过调用malloc来分配内存。在MacOS X的历史中,没有人曾经使用过mmap来分配内存。考虑到这一点,猜测哪个功能已经优化到最大值,而MacOS X的设计者对速度的关注程度不高。使用已优化的那个。