详解为什么32位系统只能用4G内存
Bit 是计算机最小的存储单位,大家都知道计算机实质上都是用二进制数 0 或 1 来存储数据的,所以 Bit 实际上可以看成存放 1个二进制数字的 1个位置。
我们平常讲的 1个文件占多少 KB、MB,1个硬盘占多少 GB、TB,后面的这个 B,指的就是字节 Byte,而不是上面的 Bit,而且 1个 Byte = 8 Bit,这个怎么理解呢?
其实 1个 Byte 可以看成是有 8 个物理上连续的 Bit 组成的,如下图:
上面说了,1个 Bit 只能表示两种值 0 or 1,其实就是 种值。那么 1个 Byte 就是 种值了。
介绍上面两个存储单位后就介绍下内存了。
内存有一个很重要的特性,CPU 可以直接访问内存里的数据。
CPU 不能直接访问硬盘的数据,只能先把硬盘的数据放到内存里,然后再从内存中访问数据。
所以内存才是计算机系统的主存储器,而硬盘则与光盘、U盘同为外部存储器。
内存里存放的数据是什么呢? 其实也是只是存放 0 或者 1 这两个二进制数字,所以内存里实际上有海量的小格子,每 1个格子是 1个 bit ,就只能存放 1个数字(0或者1),那么数值 255 就需要 8 个格子存放,也就是 1个字节 byte 。
但是问题来了,我刚说内存里的格子数量非常巨大,如果 CPU 要读出某个指定的数据,怎么去找呢?
1个 1个格子去遍历吗?其实稍微接触过数据结构的都知道,遍历虽然实现简单,但是在海量数据面前简直是自杀行为。
所以实际上内存是把 8个 8个 bit 排成 1组,每 1组成为 1个单位,大小是 1 byte (字节),CPU 每次只能访问 1个 byte,而不能单独去访问具体的 1个小格子(bit)。 1个 byte 字节就是内存的最小的 IO 单位 。
也就是说内存是由 8个 8个小格(bit)组成的 1个字节单位(byte)排列组成的。 如下图:
其实大部分数据都会作为各种数据类型存放在内存内,而各种数据类型所占的字节大小也是不同的,例如上图解析的,char 字符类型占 1个字节,int 类型和 unsigned int 类型占 4 个字节 byte。
即使我们把内存分成了以字节为单位的结构,但是实际上内存里还是有非常多的字节的,例如 64 MB内存就有 64 × 1024 × 1024 个字节!
如果 CPU 要查找 1个变量,还是要一个个字节去找到话,还是很浪费时间的,所以为了避免去遍历内存,计算机系统就引入了内存地址这个概念。
举个例子,内存就是一栋大楼,而内存里每 1个字节就是大楼的每个房间,而内存地址就是房间的门牌号码。如果没有门牌号码,我们去访问某个住在大楼的人是十分困难的,只能从 1 楼开始每个房间去敲门,如果那个人住在顶楼你就悲剧了。而如果你知道那个人的门牌号码,就可以直接上去敲他的门查他水表了,实在是方便很多。
内存也一样, 计算机操作系统 会给内存每 1 个字节分配 1 个内存地址,CPU 只需要知道某个数据类型的地址,就可以 直接 去到对应的内存位置去提取数据了。
当代计算机还实现了一个逆天的技术,就是直接寻址了。
什么意思呢?还是用上面的例子说明,假如你知道你要找的人住在那栋大楼的 17 楼 1702,但是你还是需要从 1 楼走到 17 楼去找他,这个过程还是需要时间成本的。
但是如果你具有了直接寻址技术,就能直接跳到 17 楼 1702 门前,如果你找的下 1个人在 2 楼,又能从 17 楼直接跳到 2 楼。
直接寻址技术已经成为当代计算机软硬件的标准技术之一了,也就是说只要 CPU 知道要访问数据的内存地址,就能直接到内存的对应位置去访问数据。
跟门牌号一样,其实内存地址也是由 1个 2 进制数字来表示的。每 1个地址对应内存里的 1个 byte 字节,如果地址的值加 1,那么这个地址就对应下 1个字节了。
那么内存地址的长度是多少呢?这个就是这篇文章标题所涉及的。在32位操作系统中, 内存的地址就是 32 位的 2 进制数 。
上面说了,既然 32 位系统里内存地址长度是 32 位的,所以 32 位的地址范围就是从 0000 0000 0000 0000 0000 0000 0000 0000 到 1111 1111 1111 1111 1111 1111 1111 1111 (0x00000000 ~ 0xFFFFFFFF), 总共有 个地址。
那么 到底是多少个? ,就是 4G ,而每 1个地址对应 1个字节,容量就是 1 byte,所以 个地址就总共能对应 4GB 的内存容量,这里的 B 指的是 byte 字节。
假如给 32 位的系统配上了 8GB 的内存,操作系统最多也只能给其中 4GB 分配地址,其余 4GB 是没有地址,因为地址不够用,所以 32 位系统最多支持 4GB 内存就是这样来的。
那么64位系统呢,对应的,64 位系统的内存地址是 64 位的二进制数,那总共有多少个地址?
个地址, 也就是说 64 位系统配上 64 位 CPU 理论上支持 16777216TB 的内存, 当然这个只是理论了,实际上现在的普通主版能上个 32GB 都不错了。
见下图:
大家都知道指针是用来存放内存地址的,那么对于 32 位系统来讲,内存地址是 1个 32 位长度的 2 进制数,而每 1个内存单位长度只有 1 byte = 8 bit(位),所以 1个指针就需要 4 byte 的内存来存放该指针的内容(1个内存地址)。
所以,我们定义 1个指针 int *p; 然后求 sizeof(p) 是返回4字节。
而对于 64 位系统来讲,内存地址是 64 位的 2 进制数,所以 sizof(p) 就返回了 8,共需要 8 个内存单位去存放 64 位系统的 1个指针。