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



相关代码:

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

相关strace输出:

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

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

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

如果您想在每个malloc上看到系统调用,请分配大量内存(malloc(10*1024*1024*1024))

你认为brk是什么?malloc绝对是在调用系统调用,在这个例子中,系统调用不是"malloc"。

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

相关内容

  • 没有找到相关文章

最新更新