计算机原理(一)
计算机原理系列
欢迎大家关注「海拉鲁知识大陆」 多交流不迷路
计算机原理(一)
背景
不知道有没有大家思考过32位和64位的问题,如下:
- 软件上,那么我们的数据库有32位和64位版本;
- 操作系统,那么在阿里云上选择Centos和Debian版本的时候,也会有32/64 版本;
- 是CPU,那么有32位CPU,也有64位CPU。
这些是什么意思呢?64位为什么有优势?
1.图灵机的构造
想要学懂程序执行的原理,就要从图灵机说起了(科班的童靴可以略过哈),它在计算机科学方面有两个巨大的贡献:
1、它清楚地定义了计算机能力的边界,也就是可计算理论;
2、它定义了计算机由哪些部分组成,程序又是如何执行的。
我们先来了解图灵机的内部构造:
- 图灵机拥有一条无限长的纸带,纸带上是一个格子挨着一个格子,格子中可以写字符,你可以把纸带看作内存,而这些字符可以看作是内存中的数据或者程序。
- 图灵机有一个读写头,读写头可以读取任意格子上的字符,也可以改写任意格子的字符。
- 读写头上面的盒子里是一些精密的零件,包括图灵机的存储、控制单元和运算单元。
2.图灵机如何执行程序
比如我们要计算11+15的值,具体的运算步骤如下:
a.首先,我们将“11、15、+” 分别写入纸带上的3个格子(现在纸带上的字符串是11、15、+),然后将读写头先停在11对应的格子上。
b.接下来,图灵机通过读写头读入11到它的存储设备中(这个存储设备也叫作图灵机的状态)。图灵机没有说读写头为什么可以识别纸带上的字符,而是假定读写头可以做到这点。
c.然后读写头向右移动一个格,用同样的方法将15读入图灵机的状态中。现在图灵机的状态中有两个连续的数字,11和15。
d.接下来重复上面的过程,会读到一个+号。下面我详细说一下这个运算流程:
- 读写头读到一个+号 ;
- 然后将+号传输给控制单元 ;
- 控制单元发现是一个+号,所以没有存入状态中。因为+号是一个我们预设的控制符(指令),它的作用是加和目前状态。因此,控制单元识别出是控制符,并通知运算单元工作;
- 运算单元从状态中读入11、15并进行计算,将结果26存储到状态;
- 运算单元将结果回传给控制单元;
- 控制单元将结果传输给读写头。
e.读写头向右移动,将结果26写入纸带。
这样,我们就通过图灵机计算出了11+15的值。图灵机构造的这一台机器,主要功能就是读写纸带然后计算;纸带中有数据、也有控制字符(也就是指令),这个设计和我们今天的计算机是一毛一样的。
图灵通过数学证明了,一个问题如果可以拆解成图灵机的可执行步骤,那问题就是可计算的。另一方面,图灵机定义了计算机的组成以及工作原理,但没有给出具体的实现。
3.冯诺依曼模型
具体的实现是冯诺依曼和其他几位科学家提出的。遵循了图灵机的设计,并提出用电子元件构造计算机,约定了用二进制进行计算和存储,并且将计算机结构分成以下5个部分:
- 输入设备;
- 输出设备;
- 内存;
- 中央处理器;
- 总线。
这个模型也被称为冯诺依曼模型,下面我们具体聊一下。
内存
在冯诺依曼模型中,程序和数据被存储在一个被称作内存的线性排列存储区域。存储的数据单位是1个二进制位,英文是bit。最小的存储单位叫作字节,也就是8位,英文是byte,每一个字节都对应一个内存地址。内存地址由0开始编号,比如第1个地址是0,第2个地址是1,然后自增排列,最后一个地址是内存中的字节数减1。
CPU
冯诺依曼模型中CPU负责控制和计算。为了方便计算较大的数值,CPU 每次可以计算多个字节的数据。
那这里的32和64,称作CPU的位宽。
因为一个byte最大的表示范围就是0~255。比如要计算20000*50,就超出了byte最大的表示范围了。因此,CPU需要支持多个byte一起计算。当然,CPU位数越大,可以计算的数值就越大。
控制单元和逻辑运算单元
寄存器
CPU要进行计算,比如最简单的两个数字求和时,因为CPU离内存太远,所以需要一种离自己近的存储来存储将要被计算的数字。这种存储就是寄存器。寄存器就在CPU里,控制单元和逻辑运算单元非常近,因此速度很快。
寄存器中有一部分是可供用户编程用的,比如用来存加和指令的两个参数,是通用寄存器。
还有一部分寄存器有特殊的用途,叫作特殊寄存器。比如程序指针,就是一个特殊寄存器。
下一条要执行的指令,会从内存读入到另一个特殊的寄存器中,这个寄存器叫作指令寄存器。
总线
CPU和内存以及其他设备之间,也需要通信,因此我们用一种特殊的设备进行控制,就是总线。总线分成3种:
- 一种是地址总线,专门用来指定CPU将要操作的内存地址。
- 还有一种是数据总线,用来读写内存中的数据。当CPU需要读写内存的时候,先要通过地址总线来指定内存地址,再通过数据总线来传输数据。
- 最后一种总线叫作控制总线,用来发送和接收关键信号,比如中断信号,还有设备复位、就绪等信号,都是通过控制总线传输。同样的,CPU需要对这些信号进行响应,这也需要控制总线。
输入、输出设备
输入设备向计算机输入数据,计算机经过计算,将结果通过输出设备向外界传达。如果输入设备、输出设备想要和CPU进行交互,比如说用户鼠标/按键需要CPU响应,这时候就需要用到控制总线。
这里再说明几个问题:
a. 线路位宽问题
如果只有一条线路,每次只能传递1个信号,因为你必须在0,1中选一个。比如你构造高高低低这样的信号,其实就是1100,相当于你传了1个数字10过去。这种传递是相当慢的,因为你需要传递4次。
这种1个bit1个bit发送的方式,我们叫作串行。如果希望每次多传一些数据,就需要增加线路,也就是需要并行。
- 如果只有1条地址总线,那每次只能表示0-1两种情况,所以只能操作2个内存地址;
- 如果有10条地址总线,一次就可以表示2*10种情况,也就是可以操作1024个内存地址;
- 如果你希望操作4G的内存,那么就需要32条线,因为2*32是4G。
b. 64位和32位的计算
CPU的位宽会对计算造成什么影响?
比如场景:要用32位宽的CPU,求和两个64位的数字。
因此必须把两个64位数字拆成2个32位数字来计算,这样就需要一个算法,先加和两个低位的32位数字,算出进位,然后加和两个高位的32位数字,最后再加上进位。
而64位的CPU就可以一次读入64位的数字,同时64位的CPU内部的逻辑计算单元,也支持64位的数字进行计算。但是不要仅仅因为位宽的区别,就认为64位CPU性能比32位高很多。大部分应用不需要计算超过32位的数字呀。
还有一点,32位宽的CPU没办法控制超过32位的地址总线、数据总线工作。比如说你有一条40位的地址总线(其实就是40条线),32位的CPU没有办法一次给40个信号,因为它最多只有32位的寄存器。因此32位宽的CPU最多操作2*32个内存地址,也就是4G内存地址。
不要忽视这些细节,性能其实和这些息息相关,现在可以回答64位和32位比较有哪些优势了吗?