c - OSX 内存分配缓慢

标签 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),它将随机地运行得快(30 毫秒)或非常慢(18秒)。

请注意,我什至没有使用库,只是链接。我还注意到这似乎不会发生在任何图书馆。

我运行的是 OSX 10.10.3。有什么想法吗?

最佳答案

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

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

我鼓励您就此向 Apple 提交错误,特别是因为您有一个很好的简单测试用例。 (它可能会因为重复而被关闭,因为我相信你不会是第一个提交它的人。尽管如此,每一个新的错误报告都可以帮助隔离它并提高它在 Apple 中的优先级。)

关于c - OSX 内存分配缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30956242/

相关文章:

objective-c - NSBezierPath:创建一个 "curved"正方形

macos - 自动调整 NSCollectionViewItem 大小以适合屏幕

c++ - 从另一个进程访问 mmap 内存

c - kprintf 打印出正楷

c++ - 使用 c++11 时指向不完整类型 'const std::complex<float> 的指针的下标

c - Putchar、getchar、while 循环中缺少字符

c - mman.h 确实导入了 mmap 函数但未能导入 mremap

memory - 我可以将映射内存提供给 malloc 吗?

objective-c - 使用 Objective-C 以编程方式释放系统内存

c - C fopen 是否将整个文件读入内存?