c - 什么是虚拟内存?

标签 c windows winapi memory virtual-memory

<分区>

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

某处它还说虚拟空间仅在物理内存已满时才使用,这让我很困惑。

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

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

还有,

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

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

最佳答案

“虚拟内存”意味着有一个有效的地址空间,它不映射到任何特定的物理内存或存储,因此虚拟。在现代通用操作系统的上下文中,每个进程都有自己的虚拟内存空间,具有重叠的虚拟内存地址。

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

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

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

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

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


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


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

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


不确定“为其他进程收集内存时”的意思,所以无法回答。

关于c - 什么是虚拟内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58386924/

相关文章:

java - JNA GetIfTable 错误

c++ - dlclose 并没有真正卸载共享对象,无论它被调用多少次

c# - 使用手机存储中的歌曲实现播放列表 [windows phone]

c++ - 无法读取代码页不匹配的 FileVersionInfo

windows - 如何在 Windows Phone 8 的透视表头中添加图像和按钮

c++ - 在命令行上使用 Visual Studio 进行编译时如何包含库?

c - 将变量中的数据放入数组中

c++ - 用户定义的堆栈和内置堆栈在内存使用方面有什么区别?

c++ - 如何在基于 MFC 对话框的应用程序中使用计时器?

windows - AutoIt ControlCommand 未按预期工作