欢迎浏览我的博客 获取更多精彩文章
CPU是如何工作的?
该文章翻译自:https://milapneupane.com.np/2019/07/06/how-does-a-cpu-work/
Translated By:https://milapneupane.com.np/2019/07/06/how-does-a-cpu-work/
CPU,也被叫做微处理器,是计算机的心脏,大脑.
我们就来看看计算机的核心是如何工作的吧
通常来说,一个工具要比一个机器更加简单,因为工具通常以手驱动,而机器以力驱动
–查尔斯·巴贝奇
计算机,通常来说,是以电力驱动的机器.不过他的灵活性与可编程性帮助我们更简单地获得可以用的工具
CPU是计算机的心脏,大脑.它执行提供给它的指令.它主要的工具就是计算,进行逻辑操作,并且将指令编排在一起.在我们深入它的工作原理之前,我们先看一下它的主要部件和主要的规律吧
处理器的两个主要部件
- 控制单元
- 算术逻辑单元
控制单元–CU
控制单元是CPU的一部分,它帮助我们编排指令的执行,换句话来说,它负责"要做什么"的部分.根据指令,它能够将CPU与计算机其他部分的连线激活(包括ALU,虽然ALU是在CPU里面的).控制单元是CPU在处理指令时第一个收到指令的部件.
总共有两种控制单元:
- 实体控制单元
- 微可编程控制单元
实体控制单元由硬件部分组成,如果要对其进行更改,就要在硬件层面对其进行更改,但是微可编程控制单元可以通过编程来改变其行为.实体控制单元在处理指令上更快,但是微可编程控制单元会更加地灵活
算术逻辑单元–ALU
顾名思义,算术逻辑单元就是负责CPU中的算术和逻辑的计算工作的.ALU会处理加法,减法等操作.它由逻辑电路和逻辑门来实现这些操作
大多数逻辑门会要求两个输入,产生输出
在下面,是一个半加器的例子,它要求两个输入,然后计算出结果.在此处,A和B是输入,S是本位输出,C是进位输出
存储 – 寄存器与内存
CPU的主要工作就是去执行提供给它的指令,在多数时候,提供的指令里面会包含各种各样的数据.有一些数据是立即数(即仅仅在一个模型中存在,在模型运行时产生,在模型结束后删除),还有一些数据是输入和输出数据.这些数据与指令会存在以下的存储器中:
寄存器
寄存器是一组数据存储的单元,一个寄存器由触发器组合而成,触发器就是一组可以存储一位(1bit)数据的逻辑门
一个触发器有两个输入,写输入和数据输入,还有一个输出.我们激活了写输入后,就可以对存储的数据进行更改了.当写输入处于非激活状态时,输出一直保持同样的值
上图为一个RS触发器
CPU里面有众多的寄存器来存储数据.但是如果要将这些数据发送到主存(即内存)中,因为这些数据是立即数,所以会比较慢.这些数据会通过总线在寄存器中移动,一个寄存器可以存储任何类型的bit数据
内存(RAM)
RAM是一组排列好的寄存器的集合,并且以一种最优化的方式组合在一起,所以它能够存储非常多的数据.RAM具有易失性,当我们关闭电源时,数据就会丢失.当RAM从一个8位的地址里面读写数据时,数据输入就会被存储到RAM中
什么是指令?
指令是计算机能够表现的计算单位的最小粒度.(译者注:水平不够,这段翻译地有点拗口,大概意思就是,指令在计算机中已经是最小单位了,不可能再进行拆分)
以下是几种CPU能够处理的指令
- 算术指令,如ADD和SUBTRACT指令
- 逻辑指令,如ADD,OR,NOT
- 数据指令,如MOVE,INPUT,OUTPUT,LOAD,STORE
- 控制流指令,如GOTO,IF…GOTO,CALL,RETURN
- 结束指令,HALT
指令使用汇编语言提供给计算机,汇编语言通常是由高级语言经过编译器生成而来的(手写汇编的酸爽,谁用谁知道)
这些指令都是在CPU中用电路实现的,ALU负责一些算术的指令,CU负责控制流的指令
在一个时钟周期内,CPU能够处理一条指令,但是现代的处理器通过多核机制和流水线处理等优化,通常可以在一个周期内处理多条指令
计算机可以处理的一组指令叫做指令集
CPU时钟
时钟频率
计算机处理的速度由时钟频率来决定的.一个时钟周期经过的时间很短,大概在250*10E-12秒,时钟频率越高,处理器速度就越快,时钟频率由gHz来衡量,1gHz=10E9Hz,一赫兹就是一秒,所以1GHz表示一秒有10E9个时钟周期
时钟频率越高,CPU就可以处理更多指令.这意味着,为了提高CPU速度,我们可以提高时钟频率或者通过一些优化方法降低一个操作所需要的指令数.一些处理器有能力提高自身的频率,不过提高频率会增大自身的发热量甚至冒烟起火(超,死命给我超!)
指令是如何被执行的
指令被顺序存储在内存中.一个CPU指令由操作码和内存地址组成
在CU里面,有两个寄存器,一个是指令寄存器,它加载指令的操作码,还有一个是指令地址寄存器,加载正在执行的指令的地址.CPU中还有其他的寄存器,用来存储指令的其余部分
让我们来手动执行指令,完成两个数相加的操作吧
1. LOAD_A 8
当我们调用<1100 1000>时,这条指令被存储在RAM中.
前面4位是操作码,它定义着要做的操作.随后这条指令被送到控制单元的指令寄存器中,被解码被load_a 8,意思是它需要加载地址1000的寄存器中的数据到寄存器A
2. LOAD_B 2
与上面的相似,它加载地址为0010的寄存器中的数据到寄存器B
3. ADD B A
下一条指令是将这两个数据加载一起.在这里,控制单元会通知算术逻辑单元进行ADD操作,然后将结果存在寄存器A中
4. STORE_A 23
将寄存器A的数据存入内存地址为 0001 0111的寄存器中
总线
所有在CPU,寄存器,内存和IO设备之间的数据,都是通过总线来传输的.
为了要加载刚刚我们进行了加法操作之后的数据,将其存在内存中,CPU将内存地址"放"在地址总线中,将操作后的结果"放"在数据总线中,然后激活控制总线的信号.这样,通过总线的传输,数据就送到内存中了.
为了减少多次存取的消耗,CPU通常会有缓存机制,在CPU中,会预读取一些指令,并将其缓存下来.在我们看来,一个处理器在一秒钟可以完成成百上千万条指令.这意味着,会有很多时间花在了存取数据中,甚至比执行指令的时间多得多.所以CPU为了提高执行效率,会缓存一些指令和数据在CPU的缓存里面(如现代CPU的L1,L2缓存)
指令流水线
现代CPU会使用指令流水线,从而并行地执行多个指令.读取,解码,执行.当一条指令在解码时,CPU能够读取下一条指令
但是这会带来一个问题,当一条指令依赖于另外的指令时,要怎么做呢?CPU会先处理没有依赖的指令
性能
一个CPU的性能取决于他的执行时间.性能=1/执行时间
在做一个CPU性能考量的时候,需要考虑到它指令执行时间和时钟速度,为了要提高程序执行的效率,我们既要提高时钟频率,也要减少程序所需的指令数.现在的处理器因为具有多核机制,所以能够在一秒内执行成千上万条指令,但是如果我们写的程序所需指令数太多,同样是会降低CPU的性能的.
为了让CPU执行地更快,有非常多的优化方法运用在了CPU上面.当我们编写程序时,我们需要考虑如何去减少CPU总共要执行的指令数从而提高效率