没有任何交换分区的虚拟内存

时间:2016-08-04 16:55:22

标签: linux memory paging virtual-memory

关于这个问题还有其他几个主题,但我找不到明确的答案。

在Linux上,当没有交换分区来执行寻呼时,虚拟内存如何工作,甚至没有辅助I / O设备(HDD,SSD等)?

如果我举个例子:我正在一个没有任何交换分区或二级存储的嵌入式目标上运行自定义发行版(来自initramfs)。 在top中,我可以清楚地看到正在运行的进程比物理进程(RSS)消耗了更多的虚拟地址(VIRT),例如, 500MB对20MB。

VIRT和RSS之间的差异只是分配的内存但从未被访问过(因此从未映射过操作系统)? (记忆过度承诺)

我认为虚拟内存需要Paging(不是谈论交换)才能工作,但我开始相信我错了(并且网上有很多关于Linux内存管理的废话)。

是否意味着此类配置中的Page Fault会系统地调用oom-killer?

干杯

2 个答案:

答案 0 :(得分:4)

虚拟内存正是进程在其内存空间中看到的内容。这包括很多事情:

  • 实际使用的RAM
  • 交换内存
  • 内存映射的真实文件
  • 内存映射设备
  • 用于大型mallocs的写时复制匿名mmaps
  • 分叉进程中的写时复制内存
  • 共享内存
  • 流程之间共享的已加载库

只有在真实文件中交换页面和mmapped页面才需要在页面错误时点击磁盘。

如果两个进程共享libc,它们将立即具有VIRT>没有任何过度承诺的RSS。

答案 1 :(得分:0)

听起来你正在遭受两个截然不同的概念的混淆:虚拟内存和逻辑地址转换。

在逻辑地址转换(逻辑存储器)中,CPU向每个进程呈现唯一的线性地址空间。操作系统管理一组将逻辑地址转换为物理内存的页表。

虚拟内存是使用辅助存储设备模拟物理内存的过程。虚拟内存处理逻辑地址没有相应物理地址的情况。

可悲的是,大多数处理器文档都将这两个术语混为一谈。

实际上,内存需要二级存储。逻辑内存没有。因此,当没有辅助存储时,您可以进行逻辑内存转换。这样的翻译最终可能被称为“虚拟”和“#34;当它们在技术上是合乎逻辑的时候。"