微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

为什么我的二进制文件在Windows 8上运行,而不是在Windows 7上运行?

对于Windows 7上的64位安装,Python PIP有MS Visual Studio 2010 Express的path问题

winapi:CreateProcess但隐藏进程的窗口?

在C#中执行相同环境中的多个命令

如何从Windows服务作为不同的用户运行进程

在标准的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字节的整个虚拟地址空间。)

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐