美文网首页
详解为什么32位系统只能用4G内存

详解为什么32位系统只能用4G内存

作者: JamFF | 来源:发表于2021-03-07 09:26 被阅读0次

    1. Bit(位)

    Bit 是计算机最小的存储单位,大家都知道计算机实质上都是用二进制数 0 或 1 来存储数据的,所以 Bit 实际上可以看成存放 1个二进制数字的 1个位置。

    2. Byte(字节)

    我们平常讲的 1个文件占多少 KB、MB,1个硬盘占多少 GB、TB,后面的这个 B,指的就是字节 Byte,而不是上面的 Bit,而且 1个 Byte = 8 Bit,这个怎么理解呢?

    其实 1个 Byte 可以看成是有 8 个物理上连续的 Bit 组成的,如下图:

    Bit 和 Byte

    上面说了,1个 Bit 只能表示两种值 0 or 1,其实就是2^1种值。那么 1个 Byte 就是2^8 = 256 种值了。

    • 这 256 个值分别是 0~255 所以 1个字节能表示最大的值就是 255,所以很多时候我们见到有 255 最大的限制(例如 IP 地址)就是这个原因。
    • 二进制 1个字节是由 8 个位组成的,而每 4 个位可以看成 1组,由 1个十六进制数字来表示。 也就是说十六进制的 0~F 分别表示二进制的 0000~1111,所以 16 进制和 2 进制的转化其实是很方便的。

    3. 内存是计算机系统的主存储器

    介绍上面两个存储单位后就介绍下内存了。

    内存有一个很重要的特性,CPU 可以直接访问内存里的数据。

    CPU 不能直接访问硬盘的数据,只能先把硬盘的数据放到内存里,然后再从内存中访问数据。

    所以内存才是计算机系统的主存储器,而硬盘则与光盘、U盘同为外部存储器。

    4. 内存的基本结构

    内存里存放的数据是什么呢? 其实也是只是存放 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。

    5. 引入内存地址概念

    即使我们把内存分成了以字节为单位的结构,但是实际上内存里还是有非常多的字节的,例如 64 MB内存就有 64 × 1024 × 1024 个字节!

    如果 CPU 要查找 1个变量,还是要一个个字节去找到话,还是很浪费时间的,所以为了避免去遍历内存,计算机系统就引入了内存地址这个概念。

    举个例子,内存就是一栋大楼,而内存里每 1个字节就是大楼的每个房间,而内存地址就是房间的门牌号码。如果没有门牌号码,我们去访问某个住在大楼的人是十分困难的,只能从 1 楼开始每个房间去敲门,如果那个人住在顶楼你就悲剧了。而如果你知道那个人的门牌号码,就可以直接上去敲他的门查他水表了,实在是方便很多。

    内存也一样,计算机操作系统会给内存每 1 个字节分配 1 个内存地址,CPU 只需要知道某个数据类型的地址,就可以直接去到对应的内存位置去提取数据了。

    6. 直接寻址技术

    当代计算机还实现了一个逆天的技术,就是直接寻址了。

    什么意思呢?还是用上面的例子说明,假如你知道你要找的人住在那栋大楼的 17 楼 1702,但是你还是需要从 1 楼走到 17 楼去找他,这个过程还是需要时间成本的。

    但是如果你具有了直接寻址技术,就能直接跳到 17 楼 1702 门前,如果你找的下 1个人在 2 楼,又能从 17 楼直接跳到 2 楼。

    直接寻址技术已经成为当代计算机软硬件的标准技术之一了,也就是说只要 CPU 知道要访问数据的内存地址,就能直接到内存的对应位置去访问数据。

    7. 内存地址的表示方式

    跟门牌号一样,其实内存地址也是由 1个 2 进制数字来表示的。每 1个地址对应内存里的 1个 byte 字节,如果地址的值加 1,那么这个地址就对应下 1个字节了。

    那么内存地址的长度是多少呢?这个就是这篇文章标题所涉及的。在32位操作系统中,内存的地址就是 32 位的 2 进制数

    8. 内存地址的数量决定 CPU 能访问的内存大小

    上面说了,既然 32 位系统里内存地址长度是 32 位的,所以 32 位的地址范围就是从 0000 0000 0000 0000 0000 0000 0000 0000 到 1111 1111 1111 1111 1111 1111 1111 1111 (0x00000000 ~ 0xFFFFFFFF), 总共有2^{32}个地址。

    那么2^{32}到底是多少个?2^{32}= 4(G) \times 1024(M) \times 1024(K) \times 1024(B) = 4294967296(B),就是 4G,而每 1个地址对应 1个字节,容量就是 1 byte,所以2^{32}个地址就总共能对应 4GB 的内存容量,这里的 B 指的是 byte 字节。

    假如给 32 位的系统配上了 8GB 的内存,操作系统最多也只能给其中 4GB 分配地址,其余 4GB 是没有地址,因为地址不够用,所以 32 位系统最多支持 4GB 内存就是这样来的。

    那么64位系统呢,对应的,64 位系统的内存地址是 64 位的二进制数,那总共有多少个地址?

    2^{64} = 2^{24}(T) \times 2^{10}(G) \times 2^{10}(M) \times 2^{10}(K) \times 2^{10}(B) = 16777216(T) 个地址, 也就是说 64 位系统配上 64 位 CPU 理论上支持 16777216TB 的内存, 当然这个只是理论了,实际上现在的普通主版能上个 32GB 都不错了。

    见下图:

    内存地址

    9. 关于指针

    大家都知道指针是用来存放内存地址的,那么对于 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个指针。

    作者:nvd11
    链接:https://blog.csdn.net/u011604775/article/details/81606194
    来源:CSDN
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    相关文章

      网友评论

          本文标题:详解为什么32位系统只能用4G内存

          本文链接:https://www.haomeiwen.com/subject/pbbeqltx.html