【问题标题】:calling malloc function does't always call sbrk function internally?调用 malloc 函数并不总是在内部调用 sbrk 函数?
【发布时间】:2021-01-09 11:08:10
【问题描述】:

我是C和堆内存的新手,以下是我对动态内存分配的理解,如果我错了,请纠正我:

事实1-当第一次调用malloc时,malloc会在内部调用sbrk来移动/增长brk指针(程序中断)。

事实 2-在调用 mallocfree 几次之后,两个分配的块之间可能有空闲块,所以如果我们再次调用 malloc 所需的大小小于空闲块的大小,那么这一次malloc不会在内部调用sbrk,而是malloc 只需修改一个现有空闲块的结构(设置分配位...等)并返回该块的地址。

【问题讨论】:

  • 简单的回答:是的。更复杂的答案:您的malloc 实现可能根本不使用brk/sbrk,至少有时可能会使用mmap
  • @StaceyGirl 感谢您的回答。但是mmap 不一定将对象映射到堆区,不是吗?我可以使用mmap 将对象映射到任何合法区域。
  • mmap 可用作sbrk 的替代品,以从操作系统获取新内存。所谓的“堆区域”可以通过多种方式组织。
  • @StaceyGirl 是否在 mmap 内部移动/增长 brk?
  • @amjad mmap 不一定将对象映射到堆区域“堆区域”是您的实现定义的任何内容。它可以是来自brk()/sbrk() 的内存,也可以是来自mmap() 的内存,甚至可以是 POSIX 或 SysV 共享内存或实现可用于为您的进程提供内存的任何其他机制。

标签: c linux heap-memory dynamic-memory-allocation


【解决方案1】:

标准中没有任何内容表明malloc() 必须移动/增长 brk 指针以分配内存。其实现在malloc()内部经常会使用mmap(..., MAP_ANONYMOUS, ...)来获取内存。

如果在重复malloc()free() 调用后存在间隙,则下一个malloc() 可能能够在间隙中分配内存,这样就不会调用sbrk() 或@987654328 @是必要的。但同样,不能保证这真的会发生。

【讨论】:

  • 感谢您的回答。所以当我们调用malloc如果没有可用的空闲块可以使用,而malloc内部使用mmap获取内存,所以在这种情况下,brk指针不能保持不变,它需要递增,不是吗? mmap 会在内部移动 brk 指针吗?
  • mmap() 据我所知并没有移动 brk 指针。内核将跟踪分配给进程的(虚拟)页面的数量,无论是通过 brk 指针还是通过其他方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-12
  • 1970-01-01
  • 2017-12-06
  • 1970-01-01
  • 1970-01-01
  • 2019-11-13
相关资源
最近更新 更多