当你尝试用realloc()扩展你的内存分配时,Linux是否会安排一部分内存,复制并销毁旧的内存?如果是这样的话,realloc()的最大大小被限制为不到总非内核内存的一半。
我说的对吗,或者当前应用的是什么算法?
发布于 2012-07-25 16:34:28
glibc realloc实现利用内核的mremap接口来扩展或重新定位进程的虚拟地址空间中的已分配区域,而无需在物理内存中进行额外的复制。当glibc认为分配“很大”时,这个行为就开始起作用了,我最后一次检查的时候,分配超过了128K。对于较小的分配,它将创建一个副本。
如果进程的虚拟内存映射在其当前地址或任何其他未使用的区域中没有足够的连续空间可用于新分配,则mremap可能会失败,但它不需要足够的空间来同时保存旧分配和新分配。
发布于 2012-07-25 16:33:27
通常,堆段从较低地址增长到较高地址。一定数量的堆空间被分配给进程,并且只能由该进程管理。
当您扩展内存空间时,如果有空间可以直接扩展它而不移动旧内容,它就会这样做。否则,它将旧内容复制到它找到的新空间,然后从该新空间扩展它。旧的内存区被“释放”,如果需要,可以在进一步的分配中使用。但是,旧的空间不会返回给内核。
因此,realloc()可以分配的空间量仅受分配给进程的堆空间量(堆段的大小)的限制。
此外,许多Linux实现使用sbrk()系统调用来更改进程的段大小。您可能希望查看此链接以更好地了解- How are sbrk/brk implemented in Linux?
https://stackoverflow.com/questions/11645557
复制相似问题