如何在没有系统调用的情况下在堆上分配内存?

我想知道,如果堆上所需的空间不够大,以至于不需要所有brk / sbrk系统(要移动数据段的中断指针(brk)),库函数(如malloc )在堆上分配空间。 我不是在问关于堆管理的数据结构和算法。 我只是问,如果malloc不调用系统调用,malloc如何获取堆的第一个位置的地址。 我这样问是因为我听说,调用系统调用(brk / sbrk)并不总是必要的,因为这些只是扩展空间所必需的。请纠正我,如果我错了。


基本的想法是,当你的程序启动时,堆是非常小的,但不一定是零。 如果您只分配(malloc)少量的内存,则该库可以在其加载的少量空间内处理它。 但是,当malloc耗尽该空间时,它需要进行系统调用以获取更多内存。

该系统调用通常是sbrk(),它会将堆内存区域的顶部移动一定量。 通常,malloc库例程会使堆增加大于当前分配所需的堆量,希望未来的分配可以在不进行系统调用的情况下执行。

malloc的其他实现使用mmap()代替 - 这允许程序创建稀疏的虚拟内存映射。 但是,基于mmap()的malloc实现与基于sbrk()的实现完全相同:每次系统调用都会保留比当前调用所需内存更多的内存。

看这个的一种方法是跟踪一个使用malloc的程序:你会看到,对N个malloc调用,你会看到M个系统调用(其中M比N小得多)。


简单的答案是,它使用sbrk()来分配一个大块,在那一点上属于你的应用程序进程。 然后,它可以进一步将这些小部分作为独立的malloc调用分区,而不需要向系统询问任何内容,直到耗尽该空间并需要再次使用sbrk()。

你说过你不需要数据结构的细节,但可以说,malloc(即你自己的进程,而不是操作系统内核)的实现跟踪它从系统获得的区域中的哪个空间是发言,并仍然可以作为独立的mallocs去做。 这就像买了一大片土地,然后把它分成许多房子。


使用sbrk()或mmap() - http://linux.die.net/man/2/sbrk,http://linux.die.net/man/2/mmap

链接地址: http://www.djcxy.com/p/86507.html

上一篇: How is memory allocated on heap without a system call?

下一篇: Heap size limitation in C