【问题标题】:When a large block of memory is requested on the heap, if contiguous space is not available on the RAM, is it allocated on the disk(swap)?当在堆上请求大块内存时,如果 RAM 上没有可用的连续空间,是否在磁盘上分配(交换)?
【发布时间】:2015-08-02 15:33:06
【问题描述】:

在 Linux 中,当请求内存时(使用calloc / malloc),如果请求大小的连续块不可用,内核会将多个单独的内存块映射到一个虚拟块中并将其交给应用程序或它是在磁盘上分配的吗?

如果它是在磁盘上分配的,当一个足够大的块变得空闲时,它是自动移动到 RAM 还是在磁盘上终生存在?

【问题讨论】:

  • 当程序使用malloc() 调用大量分配时,不会分配物理内存。只有地址空间被保留,直到内存被实际使用。
  • “连续块不可用”是什么意思?没有这样的概念。内存由内核管理。
  • 为了您的理解,另请参阅sbrk:这是涉及内核的地方,更改程序映像大小。 mallocfree 是用户空间库,用于管理程序映像的最后一部分。
  • C 标签是干什么用的?

标签: c linux memory-management heap-memory


【解决方案1】:

在所有支持虚拟内存的操作系统中,现在所有的内核都使用一组不同的策略来管理内存。

处理器向程序保证内存的存在达到处理器的标称寻址能力,或者更少,具体取决于规格。所以您可以为该操作系统分配最大合法内存量的内存

使用的资源是系统中安装的物理内存和磁盘存储。

根据程序请求,MM(内存管理器)分配虚拟空间:操作系统创建描述所请求内存的数据结构(通常称为创建分页目录),但没有真实内存被分配。下一阶段称为commitment,当您尝试访问之前分配的内存时,您将进入此阶段。如果有任何可用的物理内存,MM,通过尝试访问内存产生的异常调用,提交实际内存页面,将它们的地址插入页面目录,然后控制流回用户代码。现在记忆存在了!

如果我们尝试访问未分配的内存呢?这是产生异常的无效内存访问的情况,在 Linux 中是 SegFault。

回到物理内存承诺,如果没有更多可用的物理内存怎么办? MM 使用不同的算法来查找长时间未访问、不再请求或可丢弃的物理内存。甚至还涉及其他事情,例如任务优先级、任务状态(暂停的任务是内存回收的良好候选者)等。所有这些物理内存都可以被回收,其内容保存在磁盘上的交换文件(页面文件)和物理存储中然后可以映射到新进程中。

当程序尝试访问其当前缓存在磁盘上的内存时,会执行相反的过程。 MM 从其他进程重新收集物理内存(使用上述相同的技术),将其提交到进程空间,从磁盘缓存复制数据,然后将控制权交还给用户代码。

所有这些过程对用户来说都是完全透明的,您不必担心。

如果您想阅读更多有关内存管理、分页文件、GDT(全局描述符表)和 LDT(本地描述符表)here 的 X86 架构的信息,其他处理器使用不同的结构和寄存器,但原理是一样的。

【讨论】:

    猜你喜欢
    • 2012-04-15
    • 2023-03-22
    • 2016-08-07
    • 2013-10-18
    • 2014-09-27
    • 1970-01-01
    • 2010-10-27
    • 2012-08-23
    • 2015-10-23
    相关资源
    最近更新 更多