32位进程在64位Linux上有多少虚拟内存
(即在开始获取malloc()
指针之前,我可以分配多少内存并与NULL
一起使用)?
我在32位Linux上尝试过,达到了约3 GB的限制。我能在64位Linux上获得更多吗?
答案 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。