硬件结构(一)
冯诺依曼模型
定义计算机的基本结构为5个部分:中央处理器(CPU)、内存、输入设备、输出设备、总线。
内存
我们的程序和数据都是存在内存,存储的区域是线性的。
中央处理器
也就是我们常说的CPU , 32位处理器和64位处理器主要区别在于一次能够计算多少字节的数据:
- 32 位 CPU 一次可以计算 4 个字节
- 64 位 CPU 一次可以计算 8 个字节
这里的 32 和 64 位,通常称为 CPU 的位宽。之所以这样设计,是为了能够计算更大的数值,8 位一次只能计算一个字节 0~255 的范围,如果是 32 位的话就是 0~4294967295
CPU 内部一些常用组件:
- 寄存器
- 通用寄存器
- 程序计数器
- 指令寄存器
- 控制单元
- 逻辑运算单元
总线
总线使用与 CPU 和内存以及其他设备之间的通信,总线可分为 3 种 :
- 地址总线,用于指定 CPU 将要操作的内存地址;
- 数据总线,用于读写内存的数据;
- 控制总线,用于发送和接受信号,比如终端、设备复位等信号, CPU 收到信号后自然进行相应,这是也需要控制总线
当CPU要读写内存数据的时候,一般需要通过两个总线:
- 首先要通过
地址总线
来指定内存地址; - 再通过
数据总线
来传输数据;
线路位宽与 CPU 位宽
数据是如何铜鼓哦线路传输的呢? 其实是通过操作电压,低电压表示 0 , 高电压表示 1 .
为了避免低效率的穿行传输的方式,线路的位宽最好一次技能访问到所有的内存地址。CPU 要想操作的内存地址就需要地址总线,如果地址总线只有 1 条,那每次只能表示0 或 1
这两种情况,所以 CPU 一次只能操作 2 个内存地址, 如果想要 CPU 操作 4G 的内存,那么就需要32条地址总线,因为 2^32 = 4G 。
指令
现代大多数 CPU 都是用流水线的方式来执行指令,所谓流水线就是把一个任务拆分成多个小任务,于是一条指令通常分为 4 个阶段,称为 4 级流水线 :
-
Fetch(取得指令):CPU 通过程序计数器读取对应内存地址的指令
- 我们的指令是存放在存储器里的,实际上,是通过程序计数器和指令寄存器取出指令的过程,是由控制器操作的
-
Decode(指令译码):CPU 对指令进行解码
- 也是有控制器执行的
-
Execution(执行指令):CPU 执行指令
- 无论是算数操作、逻辑操作,还是进行数据传输、条件分支操作都是由算数逻辑单元操作的,也就是由运算器处理的。但是如果是一个简单的无条件地址跳转,则是直接在控制器里面完成的,不需要用到运算器。
-
Store(数据诙谐):CPU将计算结果存回寄存器或者将寄存器的值存入内存
指令的类型
- 数据传输类型的指令,比如 store/load 是寄存器与内存间数据传输的指令, mov 是将一个内存地址的数据移动到另一个内存地址的指令。
- 运算类型的指令,比如加减乘除、位运算、比较大小等等,他们最多只能处理两个寄存器中的数据。
- 跳转类型的指令,通过修改程序计数器的值来达到跳转指令的过程,比如编程中厂家你的 if - else , switch - case ,函数第哦啊用等。
- 信号类型的指令,比如发生中断的指令 trap。
- 闲置类型的指令,比如指令 nop , 执行后 CPU 会空转一个周期;
你知道吗?
-
64 位相比 32 位 CPU 的优势在哪 ? 64 位 CPU 的计算性能一定 32 位 CPU 高很多吗?
- 64 位 CPU 可以一次计算超过 32 位的数字,而 32 位 CPU 如果要计算超过 32 位的数字,要分多步骤计算,效率就没那么高,但是大部分应用程序很少计算那么大的数字,所以只有运算大数字的时候,64 位 CPU 的优势才能体现出来,否则和 32 位 CPU 的计算性能相差不大。
- 64位 CPU 可以寻址更大的内存空间,32位 CPU 最大的寻址地址是4G,即使你加了8G大小的内存,也还是只能寻址到4G,而64位 CPU 最大寻址地址是2^64(16384G),远超于32位 CPU 最大寻址地址的2^32。
-
你知道软件的32位和64位之间的区别吗?再来32位的操作系统可以运行在64位的电脑上吗?64位的操作系统可以运行在32位的电脑上吗?如果不行,原因是什么?
- 64位和32位软件,实际上代表指令是64位还是32位的:
- 如果32位指令在64位机器上执行,需要一套兼容机制,就可以做到兼容运行了。但是如果64位指令在32位机器上执行,就比较困难了,因为32位的寄存器存不下64位的令;
- 操作系统其实也是一种程序,我们也会看到操作系统会分成32位操作系统、64位操作系统,其代表意义就是操作系统中程序的指令是多少位,比如64位操作系统,指令也就是64位,因此不能装在32位机器上。
- 总之,硬件的64位和32位指的是 CPU 的位宽,软件的64位和32位指的是指令的位宽。