内存限制为在64位Linux OS上运行的32位进程

时间:2011-02-22 14:40:58

标签: linux 64-bit memory-management

32位进程在64位Linux上有多少虚拟内存 (即在开始获取malloc()指针之前,我可以分配多少内存并与NULL一起使用)?

我在32位Linux上尝试过,达到了约3 GB的限制。我能在64位Linux上获得更多吗?

4 个答案:

答案 0 :(得分:26)

在标准的32位x86 smp内核中,每个进程可以使用3GB的4GB地址空间,内核使用1GB(在每个进程的地址空间中共享)。

随着4G / 4G拆分“hugemem”32位x86内核,每个进程可以使用(几乎)整个4GB的地址空间,并且内核具有单独的4GB地址空间。 Red Hat在RHEL 3和4中支持这个内核,但他们在RHEL 5中删除了它,因为补丁没有被主线内核接受,现在大多数人都使用64位内核。

对于64位x86_64内核,32位进程可以使用整个4GB地址空间,除了由内核管理的4GB地址空间末尾的几页(8KB)。内核本身使用的地址空间的一部分超出了32位代码可访问的4GB,因此它不会减少用户地址空间。 64位进程可以使用更多的地址空间(RHEL 6中为128TB)。

请注意,程序代码,库和堆栈空间将使用某些地址空间,因此您将无法malloc()整个地址空间。这些东西的大小因程序而异。请查看/proc/<pid>/maps,了解您的流程中地址空间的使用方式;您可以malloc()的金额将受到最大的未使用地址范围的限制。

答案 1 :(得分:2)

如上所述,32位内核上的32位进程可以分配大约3GB或更少的3GB内存。 64位内核上的32位进程将能够分配大约4GB的内存。

答案 2 :(得分:1)

无论操作系统如何,32位进程只能访问4GB的虚拟内存。这是因为该过程只能映射32位的内存地址。如果你进行数学计算,你会发现即使你在128位操作系统上运行,32位地址也只能访问最大4GB。

答案 3 :(得分:0)

在64位Linux上,单个进程的最大内存空间为2 ^ 48字节。 (理论上,更多是可能的,但是当前的芯片不允许使用2 ^ 64字节的整个虚拟地址空间。)

有关详细信息,请参阅Wikipedia