linux - 虚拟连续与物理连续内存

标签 linux memory memory-management virtual-machine

实际上连续的内存在物理上也总是连续的吗?如果不是,如何在物理上不连续的 RAM block 上分配和映射虚拟连续内存?感谢详细的回答。

最佳答案

简短回答:您无需关心(除非您是内核/驱动程序开发人员)。对你来说都是一样的。

更长的答案:相反,实际上连续的内存通常不在物理上是连续的(只有非常小的数量)。除了巧合,或者在机器刚刚启动后不久。然而,这不是必需的。

分配大量物理上连续的 RAM 的唯一方法是使用大页面(因为一页中的内存需要是连续的)。然而,这是无用的尝试,因为无论您认为它是连续的内存实际上是连续的,对于您的进程来说都没有明显的区别,但是使用大页面也有缺点。

在物理上非连续 RAM 上的内存映射并没有特别“特殊”的方式。它遵循所有内存管理遵循的相同方法。

操作系统将虚拟内存划分为“页”,并为您的进程创建页表条目。当您访问某个位置的内存时,相应的页面根本不存在,或者它存在并且对应于 RAM 中的真实页面,或者它存在但 em> 对应于 RAM 中的真实页面。

如果页面存在于 RAM 中,则什么也不会发生1。否则会产生故障并运行某些操作系统代码。如果发现该页面根本不存在(或没有正确的访问权限),您的进程将因段错误而终止。

否则,操作系统会选择一个未使用的任意页面(或者换出它认为最不重要的页面),并将数据从磁盘加载到该页面。在内存映射的情况下,数据来自映射文件,否则来自交换(对于全新分配的内存,零页被复制)。操作系统然后将控制权返回给您的进程。你永远不知道这件事发生了。

如果您访问位于不同页面的“连续”(或者您认为如此!)内存区域中的另一个位置,则会运行完全相同的过程。


1 实际上,它有点复杂,因为一个页面可能存在于 RAM 中但不是“正式”存在的,是要回收的页面列表的一部分等等。但这太复杂了。

关于linux - 虚拟连续与物理连续内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22020868/

相关文章:

linux - 根据数据包类型拆分 TTY 设备

c++ - 删除基于堆的对象后,STL 容器会释放内存吗?

language-agnostic - 当需要极高的可靠性时,如何处理动态内存分配?

c - 这会产生什么输出?还请解释一下

Linux 内核内存泄漏目前已修复

linux - graphviz 输出 svg

linux - 执行期间的管道数据

c++ - opengl 程序在 glBegin(GL_QUADS) 上崩溃

c++ - 额外的函数/方法定义会增加程序的内存占用吗?

python - 我的列表使用了多少内存?