什么是虚拟内存?

What is virtual memory?

什么是虚拟内存,它与物理内存 (RAM) 有何不同?它说物理内存存储在主板上,而虚拟内存存储在磁盘上。

某处还说虚拟空间只有当物理内存被填满时才使用,这让我很困惑。

那么,为什么Windows使用虚拟内存?是不是因为内存空间小,不是为大存储而设计的,所以使用虚拟来存储更大的东西?

接下来是关于地址的事情。由于虚拟机在磁盘上,因此它们不应共享物理机的地址。 所以他们有独立的地址。是吗?

而且,

写其他进程的内存时,为什么推荐使用VirtualAlloc而不是HeapAlloc?

虚拟内存依赖于进程而物理内存通过进程共享是真的吗?

虚拟内存本质上可以被认为是映射到物理地址的每个进程的虚拟地址。在 x86 的情况下,有一个寄存器 CR3 指向该进程的翻译 table。当分配新内存时,OS 将分配物理内存,它甚至可能不是连续的,然后设置一个空闲的连续虚拟区域以指向该物理内存。每当 CPU 访问任何虚拟内存时,它都会使用 CR3 中的此转换 table 将其转换为实际物理地址。

更多信息 https://en.m.wikipedia.org/wiki/Control_register#CR3
https://en.m.wikipedia.org/wiki/Page_table

引用Wikipedia:

In computing, virtual memory (also virtual storage) is a memory management technique that provides an "idealized abstraction of the storage resources that are actually available on a given machine" which "creates the illusion to users of a very large (main) memory."

因为虚拟内存是一种虚幻的内存(所以,不存在),所以使用了一些其他计算机资源而不是RAM。在这种情况下,使用的资源是磁盘,因为它有很多 space,比 RAM 多,其中 OS 可以 运行 它的 VM 东西。

Somewhere it also says that virtual spaces are used only when the physical memory is filled, which confused me a lot.

不应该。 VM 使用磁盘,磁盘 I/O 比 RAM I/O 慢得多。这就是为什么现在首选物理内存,物理内存不够就用VM的原因。

Then, why Windows uses virtual memory? Is it because the RAMs are small-spaced and not designed for big storage, so use the virtual to store more bigger-sized things?

这是主要原因之一,是的。在过去(70 年代),计算机内存非常昂贵,因此必须考虑变通方法。

"Virtual memory" 表示有一个有效地址 space,它不映射到任何特定的物理内存或存储,因此 虚拟 。在现代通用操作系统的上下文中,每个进程都有自己的虚拟内存 space,具有重叠的虚拟内存地址。

此地址 space 分为页面以便于管理(示例大小 4 KB)。每个有效页面可以处于 3 种不同的状态:

  • 没有物理存储(假设全0)。如果进程写入此类页面,则需要为其提供物理内存页面(通过 OS,见下文)以便存储值。
  • 映射到物理内存,意思是计算机RAM中的一些页面大小的区域存储内容,它们可以直接被进程使用。
  • 换出到磁盘(可能是交换文件),以释放物理 RAM 页面(由操作系统自动完成)。如果进程访问页面(读取或写入),则需要先将其加载到 RAM 中的页面(见上文)。

只有当虚拟内存页映射到物理RAM页时,那里才有东西。在其他情况下,如果进程访问该页面,则会出现 CPU 异常,从而将控制权转移给操作系统。 OS 然后需要将该虚拟内存页面映射到 RAM(可能需要先通过将当前数据换出到交换文件来释放一些 RAM,或者如果内存不足则终止某些应用程序)并将正确的数据加载到其中,或者它可以终止应用程序(地址不在有效范围内,或者是只读的但进程尝试写入)。

同一个内存页也可以同时映射到多个地方,例如共享内存,所以同一个数据可以同时被多个进程访问(虚拟地址可能不同,所以不能共享指针变量).

虚拟内存使用的另一个特殊情况是将磁盘上的常规文件映射到虚拟内存(与交换文件发生的情况相同,但现在由正常的应用程序进程控制)。然后 OS 负责实际从磁盘读取字节(以页面大小的块)并将更改写回,进程可以像访问任何内存一样访问内存。


每个现代多任务通用操作​​系统都使用虚拟内存,因为 CPU 它们 运行 支持它,并且因为它解决了一大堆问题,例如内存碎片,透明地使用交换到磁盘,内存保护......它们可以用不同的方式解决,但虚拟内存是今天的方式。


物理内存在进程之间共享,就像共享计算机电源一样,或者说 CPU 是共享的。它是物理计算机的一部分。一个正常的进程从不处理实际的物理内存地址,它看到的只是虚拟内存,它可能映射到不同的物理位置。

虚拟内存的内容通常不共享,除非共享(例如使用共享内存时)。


不确定 "When collecting memory for other process" 的意思,所以无法回答。