什么是虚拟地址空间 (使用虚拟内存可以扩大地址空间)

咱们先来一个陈述:虚拟内存和虚拟地址空间不是一回事儿。可能有些人容易将这两个概念弄混,今天来说说。虚拟地址空间描述了地址是如何被解析,每一个进程都有它自己独立的虚拟地址空间。一个进程使用了多少虚存空间不会对影响其他进程。

假设,我们有一个应用程序进程分配了1GB的虚存空间。然后我们运行这个应用程序的3个实例,这个时候,我们将总共分配3GB的虚存空间。

用户模式的虚拟地址空间通常为2GB,但是它并限制你使用2GB虚拟内存。你可以在未映射到虚存空间的情况下分配足够大的内存。(那些使用过扩展内存或其他形式的内存交换的人非常熟悉这种技术。)

下面这个API创建了一个文件映射:

解惑之道2,解惑之道

如果你拥有足够的物理内存,或者交换空间足够大,则一个多达4GB的内存分配操作也能成功。

当然了,对于一台32位的系统,你不能将所有的虚拟内存都一次性地映射到物理内存中。但是,我们可以通过分成一个一个的片段来间接实现,下面的代码演示了如何从内存中读取一个字节。

解惑之道2,解惑之道

当然,在一个真实的程序中,你会进行错误检查,可能还有一个缓存层,以避免花费你所有的时间来映射和取消映射。

关键点在于,虚拟地址空间并不是虚拟内存。如我们之前所看到的,你可以将同样的内存映射到多个地址空间中,所以已经违反了虚拟内存和虚拟地址空间之间的一对一映射。在上面的例子中我们得到这样一个结论,即:仅仅分配了内存,并不意味着它必须占用进程虚拟地址空间中的任何空间。

总结

64位的年代,妈妈再也不用担心我的虚拟内存不够用了。旺旺赞!

最后

Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。本文来自:《Myth: Without /3GB a single program can’t allocate more than 2GB of virtual memory》

最近我写了个东西

正如你们所知道的,拓扑梅尔智慧办公平台(Topomel Box)是一款绿色软件,主要面向经常使用电脑的朋友。它提供了各种提升办公效率的小功能,同时操作上尽可能地简单方便。我想:你值得拥有。

解惑之道2,解惑之道