返回「计算机、信息技术与工程」

关于32位进程最多能分配1.5GB,64位进程最多能分配8TB的问题

更多
Markdown 结构化数据
本文目录 3 个章节

关于32位进程最多能分配1.5GB,64位进程最多能分配8TB的问题

note · 我的 UWA 问答 本文收录我在 UWA 问答发表的公开回答。问题内容归原提问者;回答保留当时语境,技术结论可能受 Unity 版本、平台和项目条件限制。

问题

有大佬能解释一下这是什么意思,最多可分配的怎么算的,怎么感觉这句话不太对

  • 提问者:程序猿小Y
  • 提问时间:2021-06-28 05:47:38

我的回答

从硬件的层面讲,CPU可用的内存范围受到寻址方式以及地址线的数量的影响,例如32位地址线,按字节寻址,则地址空间大小为2^32B = 4GB。程序可用的内存空间由于类似的原因受到限制,有如下结论:

  • 操作系统能使用的物理内存受CPU、主板等的硬件的限制,以及操作系统本身的限制。
  • 应用程序的内存受进程的虚拟地址空间限制
  • 虚拟地址空间取决于虚拟地址的位数

首先讲物理内存,一般情况下32位的CPU的地址总线是32位,32位的操作系统中,理论上最大支持的物理内存为4G,实际上只有3.2G左右(显卡等设备占用一部分)。

而进程可分配内存大小其实取决于虚拟内存,而虚拟地址空间一部分用于用户模式,一部分用于内核模式(一般各分一半)。

32位系统的虚拟内存大小为4GB,用户模式的虚拟地址空间大小为2GB,这个应该可以解释 CLR在32位进程上只能分配1.5GB内存。64位系统不同的版本有不同的虚拟地址空间限制。笔者的Win10虚拟地址位数为48,支持的地址空间大小为256TB,而User-mode的地址空间大小则为128TB。一部分Windows系统的User-mode地址空间大小为8 TB,如下图:

image.png

推测CLR在64位进程上能分配8TB内存的限制与此有关。

继答主回复后更新:

题主求真务实的精神很值得肯定。首先纠正一点错误,物理内存不受限于虚拟内存,虚拟内存也不直接受限于物理内存。再看一看《现代操作系统》 第8章就明白了。

有两点建议:

  • 书是一种帮助我们理解事物的工具,建议任何一种书都不要当作教科书去看,更不要当作真理去看。要追求前后贯通,理解本质,有时候不用太咬文嚼字。
  • 读英文书的中文译本,如果遇到解释不通的地方,就去读英文原版。

中文版的这句话翻译是极其不准确的,看英文版如下:

image.png

“在32位进程中,你能分配的空间接近1.5GB。”与“32位进程最多能分配1.5GB。”简直是天壤之别。原书这段话的题目是 Allocating Resources from the Managed Heap,那么这句话讲的可分配的内存特指堆内存。进程的内存当然不止有托管堆,还包括代码区,全局区,栈区等。

至于说是受限于2GB还是3GB,这本书其实没有讨论我们把用户模式的地址空间调整成3GB的情况。

  • 回答时间:2021-06-28 09:06:36
  • 最后更新:2021-06-29 00:44:57
  • 采纳状态:已采纳

来源与关系