解惑之所谓的最大2GB可用虚拟地址空间

咱们先来一个陈述:虚拟内存和虚拟地址空间不是一回事儿 。 可能有些人容易将这两个概念弄混 , 今天来说说 。 虚拟地址空间描述了地址是如何被解析 , 每一个进程都有它自己独立的虚拟地址空间 。 一个进程使用了多少虚存空间不会对影响其他进程 。
假设 , 我们有一个应用程序进程分配了1GB的虚存空间 。 然后我们运行这个应用程序的3个实例 , 这个时候 , 我们将总共分配3GB的虚存空间 。
用户模式的虚拟地址空间通常为2GB , 但是它并限制你使用2GB虚拟内存 。 你可以在未映射到虚存空间的情况下分配足够大的内存 。 (那些使用过扩展内存或其他形式的内存交换的人非常熟悉这种技术 。 )
下面这个API创建了一个文件映射:
解惑之所谓的最大2GB可用虚拟地址空间
文章图片
如果你拥有足够的物理内存 , 或者交换空间足够大 , 则一个多达4GB的内存分配操作也能成功 。
当然了 , 对于一台32位的系统 , 你不能将所有的虚拟内存都一次性地映射到物理内存中 。 但是 , 我们可以通过分成一个一个的片段来间接实现 , 下面的代码演示了如何从内存中读取一个字节 。
解惑之所谓的最大2GB可用虚拟地址空间
文章图片
当然 , 在一个真实的程序中 , 你会进行错误检查 , 可能还有一个缓存层 , 以避免花费你所有的时间来映射和取消映射 。
关键点在于 , 虚拟地址空间并不是虚拟内存 。 如我们之前所看到的 , 你可以将同样的内存映射到多个地址空间中 , 所以已经违反了虚拟内存和虚拟地址空间之间的一对一映射 。 在上面的例子中我们得到这样一个结论 , 即:仅仅分配了内存 , 并不意味着它必须占用进程虚拟地址空间中的任何空间 。
总结
64位的年代 , 妈妈再也不用担心我的虚拟内存不够用了 。
旺旺赞!
最后
RaymondChen的《TheOldNewThing》是我非常喜欢的博客之一 , 里面有很多关于Windows的小知识 , 对于广大Windows平台开发者来说 , 确实十分有帮助 。
本文来自:《Myth:Without/3GBasingleprogramcan’tallocatemorethan2GBofvirtualmemory》
最近我写了个东西
正如你们所知道的 , 拓扑梅尔智慧办公平台(TopomelBox)是一款绿色软件 , 主要面向经常使用电脑的朋友 。 它提供了各种提升办公效率的小功能 , 同时操作上尽可能地简单方便 。
解惑之所谓的最大2GB可用虚拟地址空间】我想:你值得拥有 。
解惑之所谓的最大2GB可用虚拟地址空间
文章图片