如果一个进程使用 6GB 内存并且指针是 32 位的,那么由于指针在 linux 中保存虚拟地址,如何对 4GB 以上的 2GB 进行寻址?
仅在 64 位解决方案上运行?对不起,天真的问题
如果一个进程使用 6GB 内存并且指针是 32 位的,那么由于指针在 linux 中保存虚拟地址,如何对 4GB 以上的 2GB 进行寻址?
仅在 64 位解决方案上运行?对不起,天真的问题
完成Basile 的回答后,大多数架构已将物理地址空间扩展到 36 位(参见 Intel 的 PSE、PowerPC 的扩展实数页码……)。因此,尽管任何进程只能通过 32 位指针寻址 4GB 的内存,但两个不同的进程实际上可以寻址 64GB 物理内存地址空间中的不同 4GB。这是 32 位操作系统寻址高达 64GB 内存(例如,Windows 2003 Server 为 32GB)的一种方式。
正如我在评论中所说,在 64 位上运行是实用的解决方案。您真的不想 munmap 然后再mmap临时文件上的大段。
您可以在运行时更改地址空间,但您不想这样做(分配内存时除外,例如 thru malloc
,这可能会增加可用空间 thru mmap
)。
更改地址空间以获得巨大内存的错觉是一场噩梦。避免这种情况(您将花费数月的时间进行调试以重现错误)。在 1960 年代,IBM 1130做了如此疯狂的把戏。
今天,计算机比开发人员的时间便宜。因此,只需购买具有 8Gb(千兆字节)RAM 的 64 位处理器。
几个具有PAE功能的32 位处理器能够使用超过 4Gb 的 RAM,但每个进程最多只能看到 4Gb(实际上是 3Gb)的虚拟内存。
它与虚拟内存有关,与英特尔特定的分段无关。当前的 Linux(和其他)操作系统即使在 Intel 处理器上也使用平面内存模型。