【问题标题】:So malloc doesn't invoke any syscall?所以 malloc 不调用任何系统调用?
【发布时间】:2011-09-13 15:57:05
【问题描述】:

相关代码:

  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)

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

【问题讨论】:

  • 我不明白你在问什么。 malloc 调用调用 brk 系统调用。
  • 通过测试我发现brk不是由malloc生成的,因为如果我增加malloc的数量,brk不会增加。
  • 您是说如果您删除了malloc 调用,那么brk 调用就会从跟踪中消失?
  • malloc 实现将预先从操作系统分配更多内存(虚拟地址空间),随后的调用将从这个预分配的池中提取。

标签: malloc system-calls


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    malloc() 调用系统 brk() 函数(在 Linux/Unix 中) - 但它仅在本地堆耗尽时调用它。 IE。大多数 malloc 实现管理通过 brk() 获得的内存堆,如果它太小或太分散,它们会通过 brk() 请求更多。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2021-11-08
        • 2020-08-12
        • 1970-01-01
        • 2012-09-27
        • 2014-12-25
        • 1970-01-01
        • 1970-01-01
        • 2016-02-09
        • 1970-01-01
        相关资源
        最近更新 更多