简而言之,是的。
为了让您能够读取或写入内存,虚拟地址必须映射到物理内存。因此,对变量的写入将始终由物理内存支持(由于缓存可能会有延迟,但这与物理与虚拟无关)。如果在执行写入时内存当前未映射,则会发生页面错误,这将允许操作系统介入并映射物理内存。
如果它需要映射内存,它可以来自“备用”列表,这意味着内存已经在物理内存中,操作系统只需要连接它(soft fault)。或者它可能必须从磁盘读取内存(又名hard fault);它可以来自页面文件、内存映射文件或二进制文件的内容。
编辑 - 对内存列表和页面错误的说明:
零列表
这些是空闲且已清零的物理内存页面。当应用程序分配更多内存时,操作系统首先从该内存池中提取(如果可用)。将这些映射到进程的地址空间是一个软错误。
免费列表
这些是操作系统正在清理的物理内存页面,即将粘贴到零列表中。
待机列表
Windows 将定期从您的虚拟内存中取消映射内存,以防其他人可能需要更多内存。相反,如果零列表中有一堆内存,它会找到您的应用程序可能再次需要的内存页面并将其预加载到内存中。所有这些页面都存储在Standby 列表中。它们不会分配给任何一个应用程序,如果有一个应用程序突然需要更多内存,它们很容易被清理和重新分配。
运行perfmon.exe /res 并单击“内存”选项卡以查看与各种列表相关联的数量。您会经常观察到 Windows 喜欢在待机列表中保留相当数量的内存。
软故障
如果您的应用程序分配内存或读取或写入操作系统窃取或预加载(并放置在备用列表中)的内存,那么操作系统将其分配回您的进程是一件非常简单的事情。软故障很便宜。
硬故障
如果您需要的内存不在物理内存中的任何位置,则会遇到硬故障,操作系统需要从某种类型的存储设备“分页”它。这通常很慢,并且是开发人员在性能调整时可能关心的问题。
回答您的评论
分配内存通常会导致软故障,因为操作系统从零列表中提取然后从备用列表中窃取以完成请求。不需要从任何物理媒体读取任何内容,因此不会遇到硬故障。
分配内存后,操作系统可能会稍后将该内存推送到备用列表。如果您再次引用它,则将其放回您的地址空间会出现软故障。如果其他人需要内存,那么操作系统可以将该内存刷新到页面文件(写出数据不是“错误”)。一旦您再次引用该内存地址,就会发生硬故障,并且该页面被读取并映射回您的地址空间。