【问题标题】:Can a process running a 32-bit compiled binary use more than 4GB of memory?运行 32 位编译二进制文件的进程可以使用超过 4GB 的内存吗?
【发布时间】:2010-07-25 19:16:23
【问题描述】:

如 top 命令所见,在 Snow Leopard(64 位机器)中运行 32 位编译版 python 的单个进程是否可能消耗 > 4GB(例如 5.4GB)的虚拟内存?

我做了一个file ...python 来查看二进制文件不是 x86,但它似乎消耗了超过 5GB 的内存。

我的猜测是,使用的库 (RPy) 正在“映射”数据块,并且内存缓存出现在我的进程的内存占用下。

或者也许我还没有验证 Python 二进制文件是 32 位的。或者也许有一些 32 位/64 位混合(libffi?)。

完全糊涂了。

【问题讨论】:

  • "查看二进制文件不是 x86" - 那是什么? x86 == 32 位,x64= 64 位。
  • @Henk:实际上,现在大多数消费者 cpu 都是 x86_64 -- 支持 64 位 而不支持 32 位(即 x64)的 cpus 相当少见
  • @Daen,我说的是二进制文件,以及它们最常见的名称。
  • 啊,对。我有点搞混了
  • 哪些 x86_64 CPU 不支持 32 位执行?

标签: python osx-snow-leopard memory-management x86-64 i386


【解决方案1】:

不,这在物理上是不可能的。由于对齐和碎片化,这并不会阻止操作系统分配超过它可以使用的内容,例如,它可能有一个完整的页面,但实际上并没有映射到所有页面。但是,实际上任何进程都不可能使用超过 4GB 的空间,而且很可能远远少于内核空间。

【讨论】:

  • 限制在大多数情况下略高于 3GB,程序的作者需要特别要求能够使用这么多内存(默认限制为 2GB)。这适用于Windows,不知道Linux。
  • @peterK:确切的限制并不重要。重要的是它远在 5.4 GB 以南。
  • 我知道,只是想补充一些信息。
  • 嗯...我似乎在使用 PAE 的 ubuntu 12.04 上达到了这个限制... doh!
【解决方案2】:

如果进程使用某种疯狂的长/远/扩展指针并根据需要将数据进出 32 位地址空间,则可能,但此时它无论如何,几乎没有资格作为 32 位。 (Python 绝对不会 这样做,所以@DeadMG 的答案几乎可以肯定是实际发生的事情。)

【讨论】:

  • Premiere CS4 使用了另一种方法,即每4GB内存加载另一个进程,这样整个程序可以访问现有物理内存一样多
  • @LưuVĩnhPhúc,如果你这样做了,你会有一个 2.6gb 的进程和另一个 2.8gb(或类似的东西)的进程,而不是一个 5.4gb 的进程。 (这是处理地址空间约束的好方法,但在这里并不适用。)
  • 当然这是 2 个(或更多)独立的进程,但它们使用一些进程互连来相互传输日期。无论如何,Premiere cs5 及更高版本不再支持 32 位环境
  • 请注意,硬件分段对 x86 没有帮助。 seg_base + off 产生线性 32 位 虚拟地址(然后由硬件映射到物理地址)。您描述的映射输入/输出方案必须由软件完成。例如mmap(MAP_FIXED|MAP_SHARED) 针对一个大文件可以将你的大型工作集保存在页面缓存中,并将其中的一部分映射到你的虚拟地址空间中。
猜你喜欢
  • 2011-08-28
  • 2010-09-08
  • 2021-09-01
  • 2012-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-28
相关资源
最近更新 更多