【问题标题】:Malloc invoking system callMalloc 调用系统调用
【发布时间】:2021-11-08 16:14:03
【问题描述】:

我在一次测验中被问到 malloc() 库调用将始终调用 mmap() 或 brk()。答案是假的。我无法理解这怎么可能?

参考:https://stackoverflow.com/a/5716525/14311234

【问题讨论】:

  • 假设您致电malloc(1024)malloc 调用 mmapbrk 来获取它需要的内存。稍后,您使用该内存调用free,内存分配例程会更新其数据库以显示内存再次可用。然后你再次拨打malloc(1024)。这一次,内存分配例程已经有了内存,所以不需要调用mmapsbrk;他们只是给你已经可用的内存。
  • 作为一个简单的反例,想象一个 malloc 实现调用例如mmap 在第一次调用时获得一块巨大的内存,分发其中的一部分,然后只使用剩下的部分。
  • 您链接的答案中没有回答您的问题吗?
  • 您的问题是,为什么malloc 并不总是使用mmapbrk 来实现?
  • @sepp2k 不,链接的答案解释了 malloc() 的内部工作,因此我得出结论,总是调用 mmap() 或 brk() 但 Eric Postpischil 消除了混乱

标签: c


【解决方案1】:

第一次调用malloc(1) 时,它会向内核请求一大堆内存,因为内核可以提供给您的内存量是最低限度的。然后它会给你一个字节的内存。下次您调用malloc(1) 时,它将从它分配的那个大块中为您提供另一个字节。以此类推,直到该块用完为止。然后它会从内核分配更多的内存。

【讨论】:

    猜你喜欢
    • 2020-08-12
    • 2011-09-13
    • 1970-01-01
    • 2014-12-25
    • 2016-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-04
    相关资源
    最近更新 更多