所以malloc不会调用任何系统调用?

时间:2011-06-13 03:44:54

标签: malloc system-calls

相关代码:

  write(-1, "test", sizeof("test"));
  void * p = malloc(1024);
  void * p2 = malloc(510);
  write(-1, "hi", sizeof("hi"));

相关的strace输出:

write(4294967295, "test\0", 5)          = -1 EBADF (Bad file descriptor)
brk(0)                                  = 0x601000
brk(0x622000)                           = 0x622000
write(4294967295, "hi\0", 3)            = -1 EBADF (Bad file descriptor)

我很惊讶这种低级操作不涉及系统调用?

3 个答案:

答案 0 :(得分:19)

并非每次调用malloc都会调用一个系统调用。在我的linux桌面上,malloc在128KB块中分配一个空间,然后分配空间。所以每100-200个malloc调用我会看到一个系统调用。在freebsd上,malloc按2MB块分配。在您的机器上,数字可能会有所不同。

如果你想在每个malloc上看到syscall分配大量内存(malloc(10 * 1024 * 1024 * 1024))

答案 1 :(得分:3)

你觉得brk是什么? malloc绝对在这个例子中调用一个系统调用,系统调用只是不是“malloc”。

答案 2 :(得分:3)

malloc()调用系统brk()函数(在Linux / Unix中) - 但它只在本地堆耗尽时调用它。即大多数malloc实现管理通过brk()获得的内存堆,如果它太小或太碎片,他们要求更多来自brk()。