我有一个应用程序,我必须在 Windows 上分配(使用运算符 new)相当大的内存空间(数百 MB)。该应用程序是 32 位(我们现在不使用 64 位,即使在 64 位系统上也是如此),我启用了/LARGEADDRESSAWARE 链接器选项,以便能够使用 4 GB 的用户空间内存。
问题如果我需要分配,比如说450 MB的连续内存,进程的虚拟地址空间是否需要有足够大的连续空间和另外还有物理地址系统上的内存不必是碎片化的吗?我问这个问题是因为我可以这样做,以便我的应用程序保留足够大的连续空间,但不知道系统上的其他应用程序是否会以这种方式影响我。操作系统页表是否需要将应用程序看到的连续虚拟地址转换为连续物理地址?
最佳答案
如果内存只是在你的软件中使用,那么你的450MB分配只需要在虚拟空间中留出450MB的空间。它可以满足内存系统各个角落的页面[只要系统中某处至少有 450MB 可用 - 包括交换空间]。
如果操作系统能够以 2MB 的连续 block 来分配页面 [一次使用 2MB 的“大页面”],您的系统将获得更好的性能。但如果需要,系统将回退到单独的 4KB 页面。
分页内存架构的几个好处之一是任何物理页面都可以放置在任何虚拟地址处。在某些系统中,例如 Debug模式下的 Xen 虚拟化管理器,页面有意不按顺序分配,以便更容易检测系统何时假设内存页面是连续的。
关于linux - 虚拟内存澄清——大连续内存的分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14772556/