为什么 32 位操作系统只能用 4G 内存空间

字节与比特

比特是计算机存储的最小存储单元。我们认知到的数字 3,在计算机的存储里(硬盘或者内存)的结构是这样的:00000011,也就是我们理解的二进制。
所以这个数字 3 是由 8 位组成的。每位有 01 两种变化。
比特存储,是计算机的基石。我们在互联网上通行的一切,如图片、音视频、文字,甚至各位的博客、App、电子书等等,能想到的能通过互联网传输的一切,都是比特存储。
举个例子,我们看的一张图片,在磁盘上的存储,或许就是这样子:0101011101010101010111101011110101010101100***(省略100000000个)***1010100111010101

1 字节 (byte)=8 比特 (bit)
我们刚才说到的数字 3,就是一个字节,在磁盘上就是 00000011。(为了便于理解,实际可能是 00000000 00000011,或者 00000000 00000000 00000000 00000011)。

1KB = 1024B(2 的 10 次方)
1MB = 1024KB(2 的 10 次方)
1GB = 1024MB(2 的 10 次方)
这些大小的计算都是定死的规则。规则很重要,有了规则才能合作。

内存条

实实在在的东西,有 4GB、8GB、16GB 等大小,长条形的带黑边的玩意,实体店网店都能买到,笔记本的小一些,台式机的大一些,有各种型号。手机都是用的贴片系统 SOC,内存条都集成到了主板上。
如果电脑开机的时候出现滴滴滴的声音,就把内存条拔出来檫檫,有很大概率能好,这是台式机时候的老梗。
内存条根本性决定了我们可用的最大内存。如果内存只有一个 G,不管 CPU 和操作系统怎么高配,也只有一个 G 的内存能用。

内存条是硬件存储设备。很容易能支持 8GB 的数据存储。8GB = 8G * 1024M * 1024K * 1024Byte,也就是 8589934592Byte (字节),8589934592 * 868719476736Bit(比特)。

CPU

CPU 一定程度上影响了最大内存。
我们经常说的 32 位操作系统或者 64 位操作系统,其实说的就是 CPU 里面核心的寄存器是 32 位还是 64 位!
寄存器是由多个集成电路元件 IC 组合成的。CPU 上有数据总线的针脚,可以和内存条一一对应,这里就有数据总线、地址总线、控制总线三大总线了。
如果 CPU 的数据总线有 32 个针脚,并且和内存条上面的 32 个数据总线针脚一一对应连接,那么就可以一次进行 32 比特的数据传输,也就是一次 4 个字节。
数据在 CPU 和内存双向流动的帮手就是寄存器。所以寄存器也要有一次处理 32 比特数据的能力,所以这个时候寄存器也是 32 位的。
CPU 中的寄存器决定我们的操作系统是 32位还是 64位(甚至 8 位,16 位等)。这里的 32位64位,指的是寄存器的位数,而非内存地址的长度。寄存器位数越大,那么一次处理数据的能力越强。比如 32 位寄存器一次可以处理 4 字节数据,64 位寄存器一次可以处理 8 字节数据。

主板 - 地址总线

上面我们说的 CPU 一定程度上影响最大内存,但不是根本原因。
地址总线影响的是内存空间寻址范围。地址总线硬件决定了我们可用的最大内存。
在 CPU 和内存条上,有两个重要的线,一个是数据总线,一个是地址总线。因为 CPU 和内存条本质也不是互通的,他们都需要插在主板上面,所以主板是他们沟通的桥梁。

上面我们说到 8G 的内存条,有 68719476736 比特的数据,逆过来分析一下:
这么大的比特数据,在内存条是按照 8Bit 一组排列的。
每 8Bit 形成一个小房间。所以 8GB 的内存条里面,有 68719476736 / 8 个房间。
计算机操作系统可以通过定向寻址的方案,直接找到每个房间。形象来说,就是每个房间都有一个内存地址 , 系统通过内存地址就可以瞬间找到那个房间,房间里面有 8 个小人 (8Bit)。

内存地址是关键,就由地址总线来指向和控制。如果地址总线有 32 条,那么内存地址最小为:00000000 00000000 00000000 00000000,最大为:11111111 11111111 11111111 11111111。64 条就 00000000 00000000 00000000 00000000 00000000 00000000 00000000 0000000011111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111
对于 32 条地址总线来说,这最小和最大之间,有多少个呢?因为每个 Bit 有 01 两个选择,所以总共有 2 的 32 次方个。每一个都一一对应内存条里面的一个房间,所以最多可以对应 2*2*2*2(32个2相乘)=4294967296 个房间。
每个房间是 8Bit 即 1Byte (字节),也就是总房间大小为:4294967296Byte,也就是 4294967296Byte/1024K/1024M/1024G = 4GB
对于 32 条地址总线,最大的内存地址也就是:11111111 11111111 11111111 11111111。也就是最多只能找到 2*2*2*2(32个2相乘)=4294967296 个房间。也就是最大内存查找范围只有 4294967296Byte/1024K/1024M/1024G = 4GB

数据总线和地址总线的关联

上面说了数据总线和地址总线,我们知道了数据总线用来传输数据,地址总线用来定位地址。
数据总线和地址总线的数量是不固定的,比如 window 操作系统,32 位,那么数据总线是 32 条,而地址总线可能是 32 条,也可能是 36 条。
如果地址总线是 32 条,那么最大内存就是 4G,如果有 36 条,那么最大内存就是 64G 了。

如果 32 位数据总线,配 36 位地址总线,那么一次只能传输 32 位数据,数据对应的地址却是 36 位,寄存器这样看存不下来嘛,因为寄存器少了 4 位。这个时候可以通过位移动,将两个 32 位的地址变成 36 位。
如果 64 位数据总线,配 36 位地址总线,那么一次能传输 64 位数据,而数据对应的地址却只有 36 位。这样只要把高位补 0 就可以了,这也是为什么 64 位操作系统能够兼容 32 位软件的原因。虽然浪费了空间,但是能兼容。
64 位数据总线配 64 位地址总线?2 的 64 次数,实在太大了,就是 ipv6 的数量。所以根本配不了 64 条地址总线,就是配了,也没有这么大的内存可以叠加啊。所以一般都配 40-50 条地址总线就差不多了。

为什么 32 位操作系统只能用 4G 内存空间

当年 win7 系统,明明买了 8G 的内存条,到我到电脑里面一看,只有 4G 不到。其余到 4G 不见了。
其实不是不见了,它还在那里,只是地址总线只有 32 条,导致读取不了更多到内存空间了。


C 绝对是计算机语言的开荒基石。
熟练 C 的程序员,大脑里就有一片星辰大海。