存储器限制到32位进程运行在64位Linux OS存储器限制到32位进程运行在64位Linux OS

2019-05-12 02:34发布

多少虚拟内存可以在32位进程对64位Linux(即我多少内存可分配与使用malloc()开始之前,我得到一个NULL指针)?

我想在我的32位Linux和达到约3 GB的限制。 我将能够获得更多的64位Linux?

Answer 1:

在标准的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)。 内核本身使用了超过4GB的32位代码访问的地址空间的一部分,因此它不会降低用户的地址空间。 一个64位的过程可使用更多的地址空间(128TB在RHEL 6)。

请注意,某些地址空间将被程序代码,库和堆栈空间可以使用,所以你将不能够malloc()你的整个地址空间。 这些东西的大小由程序而异。 看看/proc/<pid>/maps怎么看的地址空间中的过程中使用; 你可以量malloc()将最大的未使用的地址范围的限制。



Answer 2:

如上所述,在32位内核32位过程将能够分配左右的内存或多或少3GB。 在64位内核的32位进程将能够分配的内存4GB左右。



Answer 3:

一个32位过程将只能够访问虚拟存储器的4GB无论OS的。 这是由于只能够到32位存储器地址映射的过程。 如果你做数学题,你会看到32位地址只能访问一个最高4GB的evenif正在运行的128位操作系统。



Answer 4:

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

参见维基百科了解更多信息。



文章来源: Memory limit to a 32-bit process running on a 64-bit Linux OS