【问题标题】:How/where is sbrk used within malloc.c?在 malloc.c 中如何/在哪里使用 sbrk?
【发布时间】:2014-01-18 17:49:51
【问题描述】:

我在 Advanced Unix Programming(以及其他几本书)中读到 Linux malloc() 使用 Linux 系统调用 sbrk() 从操作系统请求内存。

我正在查看 glibc malloc.c 代码,我可以在 cmets 中看到很多提及 sbrk(),但在代码中没有直接提及。

malloc() 从操作系统请求内存时,sbrk() 是如何/在哪里引用/使用的?

(这可能是我对如何从 C 运行时库进行系统调用的普遍误解。如果是这样,我很想知道它们是如何进行的??)

【问题讨论】:

  • 虽然我不确定 sbrk 的实际位置,但 C 中的系统调用和函数之间没有什么不同,只是控制完全由操作系统管理,直到系统调用完成。
  • sbrk(2) 往往会变得生锈和过时。仅使用 mmap(2) 有充分的理由(多线程)。
  • @BasileStarynkevitch 您能否简要说明这些原因?
  • 阅读手册页。 sbrk 已从最新的 Posix 标准中删除。

标签: c linux memory-management malloc sbrk


【解决方案1】:

Glibc 的malloc.c 通过调用存储在__morecore 全局函数指针中的函数来请求更多内存(该调用实际上使用了扩展为__morecore 的宏MORECORE)。默认情况下,它保存函数__default_morecore 的地址,该地址在morecore.c 中定义。该函数调用sbrk

请注意,某些malloc 实现可能使用mmap 而不是sbrk 来获取更多内存。

【讨论】:

  • 酷 - 找到了。 morecore.c 中的注释说:“分配 INCREMENT 更多字节的数据空间,并返回数据空间的开始”。因此,如果我想要 100 字节的数据,我调用 malloc() 最终调用 morecore.c 中的函数,该函数调用 sbrk() 并且该函数返回指向 100 字节开头的指针?还是在调用 main() 为进程分配整个堆之前使用 sbrk()?
  • @user997112 事先不知道堆大小,所以sbrk会被malloc调用。但它不会将 1 转换为 1,因为 malloc 可能会从 sbrk 请求更大的内存块然后将它们划分,并且它还可以将先前释放的内存返回给调用者而不需要 sbrk
  • 所以 sbrk 所做的就是接受一个内存请求,给定一个大小并提供一个指向它的指针。这与 malloc 的作用()不是很相似吗?换句话说,如果 sbrk 这样做, malloc() 的目的是什么?只是为了进行大量的错误处理?
  • sbrk() 不知道内存的哪些部分仍在使用中,因为没有相当于 free 的; malloc 处理已被malloc()ed 和free()d 的内存块的回收。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-24
  • 1970-01-01
  • 2016-09-24
  • 2011-01-05
相关资源
最近更新 更多