内存限制在64位Linux操作系统上运行的32位进程

一个32位进程在64位Linux上有多less虚拟内存(也就是说,在开始获取NULL指针之前,我可以分配多less内存并使用malloc() )?

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

Solutions Collecting From Web of "内存限制在64位Linux操作系统上运行的32位进程"

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

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

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

请注意,一些地址空间将被程序代码,库和堆栈空间使用,所以你将无法malloc()你的整个地址空间。 这些东西的大小因程序而异。 看看/proc/<pid>/maps来看看地址空间是如何在你的进程中使用的。 你可以malloc()将受到最大的未使用的地址范围的限制。

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

不管操作系统如何,32位进程只能访问4GB的虚拟内存。 这是由于进程只能映射32位的内存地址。 如果你做数学,你会发现32位地址只能访问最大4GB,即使你在128位操作系统上运行。

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

请参阅维基百科获取更多信息。