首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linux内核中的realloc()有以下限制吗?

问Linux内核中的realloc()有以下限制吗?
EN

Stack Overflow用户
提问于 2012-07-25 16:25:19
回答 2查看 1.3K关注 0票数 1

当你尝试用realloc()扩展你的内存分配时,Linux是否会安排一部分内存,复制并销毁旧的内存?如果是这样的话,realloc()的最大大小被限制为不到总非内核内存的一半。

我说的对吗,或者当前应用的是什么算法?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-25 16:34:28

glibc realloc实现利用内核的mremap接口来扩展或重新定位进程的虚拟地址空间中的已分配区域,而无需在物理内存中进行额外的复制。当glibc认为分配“很大”时,这个行为就开始起作用了,我最后一次检查的时候,分配超过了128K。对于较小的分配,它将创建一个副本。

如果进程的虚拟内存映射在其当前地址或任何其他未使用的区域中没有足够的连续空间可用于新分配,则mremap可能会失败,但它不需要足够的空间来同时保存旧分配和新分配。

票数 2
EN

Stack Overflow用户

发布于 2012-07-25 16:33:27

通常,堆段从较低地址增长到较高地址。一定数量的堆空间被分配给进程,并且只能由该进程管理。

当您扩展内存空间时,如果有空间可以直接扩展它而不移动旧内容,它就会这样做。否则,它将旧内容复制到它找到的新空间,然后从该新空间扩展它。旧的内存区被“释放”,如果需要,可以在进一步的分配中使用。但是,旧的空间不会返回给内核。

因此,realloc()可以分配的空间量仅受分配给进程的堆空间量(堆段的大小)的限制。

此外,许多Linux实现使用sbrk()系统调用来更改进程的段大小。您可能希望查看此链接以更好地了解- How are sbrk/brk implemented in Linux?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11645557

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档