在Linux中,当请求内存时(使用calloc / malloc
),如果请求大小的连续块不可用,内核会将多个单独的内存块映射到一个虚拟块中并将其交给应用程序还是在磁盘上分配?
如果它是在磁盘上分配的,当一个足够大的块变为空闲时,它会自动移动到RAM还是它在磁盘上存活一段时间?
答案 0 :(得分:6)
在所有支持虚拟内存的操作系统中,如今所有内核都使用不同策略池来管理内存。
处理器向程序保证存储器存在达到处理器的标称寻址能力,或者根据规格减少的程度。因此允许您为该操作系统分配最大合法内存量的内存。
使用的资源是系统和磁盘存储中安装的物理内存。
根据程序请求,MM(内存管理器)分配虚拟空间:操作系统创建描述所请求内存的数据结构(通常称为创建分页目录),但没有真实内存分配。下一阶段称为承诺,当您尝试访问之前分配的内存时,您会进入此阶段。如果有任何物理内存可用,MM通过尝试访问内存生成的异常调用,提交实内存页面,将其地址插入页面目录,然后控制流回用户代码。现在存在记忆!
如果我们尝试访问内存未分配?这是在Linux中创建异常的无效内存访问的情况,即SegFault。
回到物理内存承诺,如果没有更多物理内存可用怎么办? MM使用不同的算法来查找长时间未访问的物理内存,不再需要或丢弃。甚至其他事情也会涉及,例如任务优先级,任务状态(暂停的任务是记忆重新收集的良好候选者)等等。所有这些物理内存都可以被重新收集,其内容保存在磁盘上的交换文件(页面文件)和物理存储中然后可以映射到新流程。
当程序试图访问当前缓存在磁盘上的内存时,会执行相反的过程。 MM从其他进程中重新收集物理内存(使用上述相同的技术),在进程空间中提交它,从磁盘缓存中复制数据,然后将控制权交还给用户代码。
所有这些流程对用户完全透明,您无需担心。
如果您想阅读更多搜索内存管理,分页文件, GDT (全局描述符表)和 LDT (本地描述符表)here X86架构,其他处理器使用不同的结构和寄存器,但原理是相同的。