【问题标题】:Does realloc() in Linux kernel have the following limitation?Linux内核中的realloc()是否有以下限制?
【发布时间】:2012-07-23 15:19:09
【问题描述】:

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

我说得对吗,或者目前正在应用什么算法?

【问题讨论】:

  • realloc() 是一个 libc 函数,而不是内核函数。

标签: linux memory-management


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-12
      • 2015-08-12
      • 1970-01-01
      • 2012-06-04
      • 1970-01-01
      • 2013-04-09
      • 2010-10-25
      • 2022-07-18
      相关资源
      最近更新 更多