32位和64位操作系统

你是否经常听到下面这些词汇:

32位操作系统64位操作系统32位处理器64位处理器x86x64

这些词汇是什么意思?它们之间是什么关系?

本文将详细讲解这些基本概念

XX位处理器

我们所说的32位处理器64位处理器,这里的3264通常是指CPU的寻址能力

什么是寻址能力,这还要从内存地址说起

你需要先阅读上一章节从二进制到十六进制

我们知道,为了方便CPU从内存中取出数据,CPU会把内存划分为一段一段的区域,每一段占8bit,即一个字节

通过对每个区域进行编号,来精准的操作某一个内存区


内存划分和编号


上图中的编号,就是内存地址

当我们要让CPU取出内存地址3的时候,我们要通过连接到CPU的数据总线(CPU的数据总线通常连接在电脑主板上),向CPU发送一个取值指令,同时,告诉CPU内存地址


CPU根据地址取出数据


从图中可以看出,CPU根本不是预先给每个内存地址编号,而是根据你发送的内存地址,通过一个数学运算,就立刻算出应该从整个内存的哪个位置开始取

我之所以这样解释,是因为有些朋友总是纳闷:对内存编号没问题,那编号本身是存在什么地方呢?

答案就是:编号根本不存在任何地方,而是在操作内存的时候,CPU根据你发送的编号,直接计算出来的

就像上图中所示,你发送一个地址3,CPU并不知道3的编号,它甚至没有编号这个概念,它只是简单的经过运算3 * 8 bit = 24 bit,计算出需要读取的数据,在整个内存中的偏移量,从而定位到内存的第24bit,然后读取一个字节(8bit)即可

这就是内存地址在真实的硬件环境中是如何应用的

再说回我们的话题

我们要让CPU操作某个数据,需要告诉CPU内存地址

怎么告诉CPU内存地址呢?根据之前所讲,是由主板通过数据总线,发送一个地址给CPU

要知道,在计算机内部,所有的东西都必须用二进制表示,包括内存地址,比如,内存为3的地址实际上是11

你可以把数据总线想象成一个高速公路,CPU想象成一个临时仓库,你向CPU发送的地址是高速公路上的并行车辆


通过数据总线运送数据


从上图中可以看出以下细节:

  • CPU仓库:CPU实际上对数据拥有短暂、快速的暂存能力,这里把CPU比作仓库,实际上是指CPU的寄存器。寄存器会短暂的记录数据,比如收到一个地址后,寄存器会把地址短暂的记录下来,等待CPU通过这个地址计算出偏移量。
  • 数据总线的宽度决定了一次能运送的数据量,上图中的数据总线宽度是5,则表示一次有能力运送5bit的数据
  • 数据总线的宽度必须和CPU寄存器的存储能力一致。试想,如果仓库中只能存3bit的数据,而数据总线运输过来的是5bit,则多余的2bit必须要丢弃,这样一来,多出来的数据就无意义了。所以,如果CPU的寄存器能暂存5bit,则数据总线一定也是5bit的宽度。

我们平时所说的32位处理器,指的就是寄存器可以暂存32位的数据,同时,数据总线的宽度也是32位

这也就意味着,我最大可以向CPU发送的地址编号是321,即十进制的2^{32} - 1,即4294967295

根据存储的换算公式,1GB = 1024MB,1MB = 1024KB,1KB = 1024 byte,1byte = 8bit

可以轻松的换算出:32位的CPU,根据最大的地址编号,可以读到内存的偏移量为:4294967295个字节,也就是大约4GB

这就是为什么很多老的电脑,它使用的是32位的CPU,哪怕你给内存升级到16G,它还是只能识别4G

于是,我们有了这样的说法:一个X位的CPU,它的寻址能力是X位,能识别的内存是2^{X} - 1字节

大家可以根据这样的算法,算算看,64位的CPU大概可以识别多少G的内存,答案在本文末尾

另外,64位的CPU不仅可以提升寻址能力,还可以提升一次性读取数据的能力,比如,64位的CPU可以一次性从内存中读取8个字节的数据,然后通过64位的数据总线传输,不需要分8次读取

x86 和 x64

x86和x64是指CPU的指令集

这是啥意思呢

所谓指令,是指向CPU发送的一个特殊的二进制命令,常见的指令有:取出某个内存中的数据(取址)、保存某个数据到某个内存(存值)、运算等等

要知道CPU发展了这么多年,速度不断的提升,同时也不断开发出新的指令

x86是一种古老的指令集合,它出现于1978年,目前这种指令集主要集中在32位的CPU上

x86-64,简称x64,它在x86指令集基础上新增了很多针对64位CPU的指令集

所以,有些软件分为x86版本和x64版本,它们就是为不同指令集的CPU分开发布的版本

这就产生了以下有趣的现象:

  • 如果你的CPU是32位的,那么只能安装软件的x86版本,因为x64版本要用到新的指令集,你的CPU是不支持的
  • 如果你的CPU是64位的,既可以安装x64版本,也可以安装x86版本,因为x64指令集兼容x86指令集。但是,如果你安装的是x86版本,虽然CPU仍然是64位的,但是你的软件只会使用x86指令集,也就是说,你的软件只会向CPU运送32位的地址和数据,信息高速公路有一半没有用上,无法完全发挥64位CPU的优势。

XX位操作系统

操作系统的出现,让用户不需要直接管理硬件

如果你看到这里,应该知道直接操作硬件是非常麻烦和复杂的

操作系统就是用来直接管理硬件的

因此,既然作为硬件的核心——CPU,拥有32位和64位,为了尽可能的发挥CPU的优势,操作系统也分为32位和64位

和其他软件一样

32位的CPU上,只能安装32位的操作系统,因为64位操作系统会使用新的指令集,而CPU是没有这些指令的

64位的CPU上,可以安装64和32位的操作系统,当然,和软件一样,32位的操作系统无法发挥64位的速度优势

另外,由于软件不会直接管理硬件,而是通过向操作系统对硬件进行管理,因此:

只有64位的操作系统才能安装64位的软件,当然也兼容32位的软件

32位的操作系统只能安装32位的软件

它们的关系就像是下图所示


32位和64位操作系统(图4)



64位的CPU可以识别多少G的内存 \frac{2^{64} - 1}{1024*1024*1024} ≈ \frac{2^{64}}{2^{10}*2^{10}*2^{10}} = \frac{2^{64}}{2^{30}} = 2^{34}GB


您可能还会对下面的文章感兴趣: