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

Virtual memory without any swap partition

关于这个主题的其他话题很少,但我找不到明确的答案。

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

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

VIRT 和 RSS 之间的区别是否只是内存分配但从未访问过(因此从未被 OS 映射)? (内存过度使用)

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

这是否意味着 Page Fault 这种配置会系统地调用 oom-killer?

干杯

虚拟内存就是进程在其内存中看到的内容 space。这包括很多东西:

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

只有来自实际文件的交换页面和映射页面需要在页面错误时命中磁盘。

如果两个进程共享 libc,它们将立即拥有 VIRT > RSS,而不会出现任何过度使用。

听起来您正在为两个不同概念的混淆而苦恼:虚拟内存和逻辑地址转换。

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

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

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

虚拟内存需要辅助存储。逻辑内存没有。因此,当没有辅助存储时,您可以进行逻辑内存转换。这样的翻译在技术上是 "logical."

时最终会被称为 "virtual"