你在这里看到的是
虚拟内存 的效果。内存管理很难,当操作系统和成百上千的进程必须共享内存时,情况变得更加复杂。为了解决这个巨大的复杂性,使用了
虚拟内存 的概念。我将在此简要介绍基础知识;这个话题非常复杂,你也应该在其他地方阅读相关内容。
在大多数现代计算机上,每个进程都认为它(几乎)拥有完整的内存空间。但进程从不处理
物理地址,而是处理
虚拟地址。这些虚拟地址每次进程实际从内存中读取数据时都会被映射到物理地址上。这种地址转换由所谓的 MMU(内存管理单元)完成。如何映射地址的规则由操作系统设置。
当你启动计算机时,操作系统会创建一个初始映射。每次启动一个进程时,操作系统都会向该进程添加一些物理内存,并相应地修改映射。这样,进程就有可以运行的内存。
在 x86_64 上,地址空间最宽为64位,因此每个进程都认为自己拥有所有这 2^64 个地址。当然,这不是真的:
- 世界上没有一台计算机能够拥有那么多内存。(事实上,大多数 CPU 今天只能使用 280 TB 的 RAM,因为它们在寻址物理内存时只能使用 48 位。即使这 280TB 对现在来说也足够了。)
- 即使你拥有那么多内存,还有其他进程也会使用其中的一部分。
那么当你尝试读取未映射的地址(在64位系统中,这是大多数地址)时会发生什么?MMU 触发了一个页面错误。这使 CPU 通知操作系统进行处理。
我的意思是,在x86中,通常第一个位置从0开始,然后是1、2等等,所以你可以拥有的最高数字约为40亿。
虽然如此,如果您的x86系统内存少于4GB,这也是正确的。虚拟内存已经存在了相当长的时间。
这就是为什么您会看到如此大的地址的简短总结。请注意,我在这里忽略了许多细节。