多少虚拟内存可以在32位进程对64位Linux(即我多少内存可分配与使用malloc()
开始之前,我得到一个NULL
指针)?
我想在我的32位Linux和达到约3 GB的限制。 我将能够获得更多的64位Linux?
多少虚拟内存可以在32位进程对64位Linux(即我多少内存可分配与使用malloc()
开始之前,我得到一个NULL
指针)?
我想在我的32位Linux和达到约3 GB的限制。 我将能够获得更多的64位Linux?
在标准的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()
将最大的未使用的地址范围的限制。
如上所述,在32位内核32位过程将能够分配左右的内存或多或少3GB。 在64位内核的32位进程将能够分配的内存4GB左右。
一个32位过程将只能够访问虚拟存储器的4GB无论OS的。 这是由于只能够到32位存储器地址映射的过程。 如果你做数学题,你会看到32位地址只能访问一个最高4GB的evenif正在运行的128位操作系统。
在64位Linux,对于单个过程的最大存储空间为2 ^ 48字节。 (理论上,更是可能的,但目前的芯片不允许使用2 ^ 64个字节的整个虚拟地址空间。)
参见维基百科了解更多信息。