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

leo*_*idp 13 linux 64-bit memory-management

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

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

mar*_*k4o 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()使用的最大未使用地址范围限制您的金额.

  • 使用64位内核,每个32位进程可以拥有自己独立的4GB虚拟内存.这不一定对应于所需的物理RAM总量; 一些非活动的虚拟内存可能会被分页到磁盘. (2认同)
  • 如果同一共享库(或其他文件)的相同部分以只读方式映射到不同进程的虚拟地址空间,则它们都可以在物理内存中共享一个副本,即使该文件映射到每个虚拟地址的不同虚拟地址中也是如此.处理.写入的初始化数据部分将为每个进程分别具有一个副本. (2认同)

enn*_*ler 1

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

  • @leonidp:使用本机 64 位程序为您的用户空间程序使用超过 2GB / 3GBytes 的虚拟内存。 (2认同)