当堆上请求大块内存时,如果RAM上没有连续空间,它是否在磁盘上分配(交换)?

MiJ*_*iJo 1 c linux heap memory-management

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

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

Fra*_*e_C 6

在所有支持虚拟内存的操作系统中,如今所有内核都使用不同策略池来管理内存.

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

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

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

如果我们尝试访问未分配的内存?这是在Linux中作为SegFault生成异常的无效内存访问的情况.

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

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

所有这些过程对用户完全透明,您不必担心.

如果您想在此处阅读更多搜索内存管理,分页文件,GDT(全局描述符表)和LDT(本地描述符表)的X86体系结构,其他处理器使用不同的结构和寄存器,但原理是相同的.