1

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

我是对的,还是目前正在应用什么算法?

4

2 回答 2

2

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

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

于 2012-07-25T08:34:27.983 回答
0

一般来说,堆段是从低地址向高地址增长的。一定量的堆空间被分配给进程,并且只能由进程管理。

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

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

此外,许多 Linux 实现使用 sbrk() 系统调用来更改进程的段大小。您可能想查看此链接以更好地理解 - 如何在 Linux 中实现 sbrk/brk?

于 2012-07-25T08:33:27.190 回答