是mmap使用已经分配的块,如果下一个请求适合它?

时间:2014-01-06 10:18:44

标签: linux memory-management malloc mmap

假设我想像这样分配3000个字节

的malloc(1000);
的malloc(1000);
的malloc(1000);

我的 malloc实现使用 mmap()。 所以我想知道: -

  1. 是malloc,被称为3次mmap()。
  2. 是mmap分配3个单独的页面(总分配内存为3 * 4096)或者它从一个页面为所有三个请求者提供内存(总分配内存为4096)。
  3. 如果它分配了三个不同的页面,那么我如何使我的alloc只用一个页面来完成它。

1 个答案:

答案 0 :(得分:1)

联机帮助页malloc中描述了Linux(即GNU libc)mallopt(3)的映射行为。 malloc使用以“128kB”开头的“动态mmap阈值”,但可以根据流程的分配模式自动向上调整。使用旧式免费列表提供较小的分配,可以使用环境变量或mallopt函数设置初始阈值。

因此,malloc几乎肯定不会mmap三个4kB页面,但无论是否将分配保留在单个页面中都无法保证。您可以执行手动mmap,或者,如果两个页面没问题,请执行一次malloc

char *a = malloc(3000);
// check for errors
char *b = a + 1000;
char *c = b + 1000;
// don't forget that you must free a, and only a, to free b and c