[英]Difference between brk() , sbrk() and realloc() functions
我知道函数brk(),sbrk()用于重新分配内存。但它们与realloc()函数有什么不同?。给我编码示例。
brk
和sbrk
是系统调用(在内核中实现),而malloc
, free
, realloc
是用户空间中的库函数。 因此malloc
等函数在内部使用brk
和sbrk
但提供了额外的功能(有关malloc
更多详细信息,请参阅man(2)以获取有关brk
和man(3)的更多详细信息。)。
brk
只通过向内核提供指向程序可能使用的最大虚拟内存位置的指针,告诉内核程序想要使用多少内存。 但是你只有一大块内存。
malloc
帮助您将这个巨大的内存块细分为更小的部分。
示例代码在这里没有多大意义,因为brk
和malloc
在不同的级别上工作。 但你可以想一想如何实现一个非常简单(和非线程安全)的malloc
和free
版本以及你在那里使用brk
地方:
brk
来增加我们从内核获得的可用内存 正如@BasileStarynkevitch在评论中所说,作为brk
的替代方法,您还可以使用mmap
(使用fd=-1
和flags=MAP_PRIVATE|MAP_ANONYMOUS
)来保留由交换文件支持的单个内存块。 有关mmap的详细信息,请参阅man(2) 。
在操作系统级别(至少在Unix模型中),程序文本,初始化和未初始化数据以及动态分配数据的“堆”都有一个很大的内存区域。 (堆栈是独立的。)您可以使用brk
和sbrk
调整该区域的大小,但不能重新排列它,它总是连续的。 绝大多数进行动态内存分配的程序需要更灵活的东西。
malloc
, free
和realloc
是C库函数,可以为您提供更灵活的功能。 在下面,他们通过调用brk
和/或sbrk
从操作系统获取内存,但随后他们做了额外的处理,让你分配(a)任意数量的(b)不同大小的块,你可以(c)单独返回到当你完成它们并且偶然地(d)重新调整大小时。
但是当你以free
将内存返回到池中时,它通常只会回到池中,以后您的程序将来自malloc
的调用将从中抽取; 内存通常不会返回给操作系统。
(很抱歉没有提供任何示例代码;我刚才没有时间。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.