我想知道是不是堆上需要的空间不够大 这样就不需要brk/sbrk系统all(移动数据段的中断指针(brk)),库函数(如malloc)如何在堆上分配空间。 我不是在问堆管理的数据结构和算法。我只是问如果 malloc 不调用系统调用,它如何获取堆的第一个位置的地址。我问这个是因为我听说并不总是需要调用系统调用 (brk/sbrk),因为这些只需要扩展空间。如果我错了请纠正我。
最佳答案
基本思想是当你的程序启动时,堆很小,但不一定为零。如果您只分配 (malloc) 少量内存,则库能够在加载时拥有的少量空间内处理它。然而,当 malloc 用完该空间时,它需要进行系统调用以获取更多内存。
该系统调用通常是 sbrk(),它将堆内存区域的顶部向上移动一定量。通常,malloc 库例程会将堆增加大于当前分配所需的大小,希望以后的分配可以在不进行系统调用的情况下执行。
malloc 的其他实现使用 mmap() 代替——这允许程序创建稀疏虚拟内存映射。然而,基于 mmap() 的 malloc 实现与基于 sbrk() 的实现做同样的事情:每个系统调用都保留比当前调用所需更多的内存。
查看此问题的一种方法是跟踪使用 malloc 的程序:您会看到,对于对 malloc 的 N 次调用,您将看到 M 次系统调用(其中 M 远小于 N)。
关于linux - 如何在没有系统调用的情况下在堆上分配内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9137394/