硬件结构——(1) CPU 是如何执行程序的?

硬件结构——(1) CPU 是如何执行程序的?

1. 图灵机的工作方式 

硬件结构——(1) CPU 是如何执行程序的?

图灵机的基本组成如下:

  • 纸带,纸带由个连续的格成,每个格以写符,纸带就好存,带上的 格的字符 就好存中的数据或程序。
  • 读写头,读写头可以读取 纸带上任意格的字符,也可以把字符写纸带的格。
  • 读写头上有部件,存储单元、控制单元、运算单元:
  1. 存储单元:存放数据。
  2. 控制单元:识别字符 是数据还是指令,以及控制程序的流程等。
  3. 运算单元:执算指令。

例:简单运算 1+2 的执行过程

1. ,写头把 “1”、”2″、”+” 这 3 个字符 分别写纸带上的 3 个格然后读写头先停在 “1” 字符对应的格上:

硬件结构——(1) CPU 是如何执行程序的?

2. 接着,读写头读”1″ 到存储设备中 (这个存储设备称为 图灵机的状态):

硬件结构——(1) CPU 是如何执行程序的?

3. 然后读写头向右 移动格,样的把 ”2” 读图灵机的状态,现在图灵机的状态中 存储着两个连续的数字, 1和2:

硬件结构——(1) CPU 是如何执行程序的?

4. 读写头再往右 移动格,就会碰到 “+” 号,读写头读到 “+” 号后,将 “+” 号传输给控制单元,控制单元发现是”+” 号是数字,所以没有存状态中 (因为 “+” 号是运算符指令,作加和的状态),于是通知运算单元。运算单元收到 要加和状态中的值 的通知后,就会把状态中的 ”1”和”2″ 读计算,再将计算的结果 “3” 存放到状态中:

硬件结构——(1) CPU 是如何执行程序的?

5. 最后,运算单元将结果 返回给控制单元,控制单元将结果 传输给读写头,读写头向右移动,把结果 3 写纸带的格:

硬件结构——(1) CPU 是如何执行程序的?

总结:从上灵机计算 1+2 的过程,可以发现图灵机主要功能 就是通过读写头读取纸带格的字符,然后交给控制单元识别字符 是数字还是运算符指令。如果是数字则存图灵机状态中,如果是运算符,则通知运算单元 读取状态中的数值并进算,计算结果最终返回给读写头,读写头再把结果 写纸带的格。

2. 冯诺依曼模型

在1945年,冯诺依曼和其他计算机科学家们提出了 计算机具体实现的报告,其遵循了图灵机的设计,还提出 件构造计算机,并约定了strong>制进算和存储,还定义计算机基本结构为 5 个部分,分别是中央处 (CPU)内存输备输出设备总线。(这 5 个部分也被称为 冯诺依曼模型)

硬件结构——(1) CPU 是如何执行程序的?

(1) 内存:

  • 我们的程序和数据都是 存储在内存,存储的区域是线性的
  • 数据存储的单位 是/strong>进制位 (bit),即0或1。最存储单位 是字节 (byte)。(1字节等于8位)
  • 内存的地址是 从0开始编号然后排列,最后地址为内存总字节数-1,这种结构好似我们程序数组,内存读或写任何数据的速度 都是的。

(2) 中央处理器 (CPU):

中央处理器就是CPU,32位和64位CPU最主要区别在于 能计算多少字节数据。(这32位和64位,通常称为 CPU的位宽
              32位CPU 可以计算 4个字节
              64位CPU 可以计算 8个字节
原因:之所以CPU要这样设计,是为了能计算更数值。如果是 8位的CPU,那么只能计算 1个字节0~255 范围内的数值,这样就完成计算10000 * 500 。于是为了能完成 更大数值的运算,CPU需要多个byte计算,所以CPU位宽越可以计算的数值就越(:32位CPU 能计算的最数是4294967295)

  • CPU内部还有组件:常有 寄存器控制单元逻辑运算单元等。(其中,控制单元负责控制 CPU、逻辑运算单元负责计算、存器可以分为多种类,每种寄存器的功能尽相同)
  • CPU中的寄存器主要作存储计算时的数据。(有了内存为什么还需要寄存器原因很简单,因为内存离CPU太远了,存器就在CPU紧挨着控制单元和逻辑运算单元,计算过程中存取数据的速度会很快,因此计算的速度会更快)

常寄存器种类:

  1. 通存器:存放 需要进算的。(:需要进和运算的两个数据)
  2. 程序计数器:存放 CPU要执 下指令所在的内存地址
  3. 指令寄存器:存放 程序计数器指向的指令,也就是指令本身,指令被执成之前 都存储在这

(3) 总线:

总线/strong>于 CPU和内存以及其他设备之间 的通信,总线可分为3种:

  1. 地址总线:指定 CPU将要操作的内存地址。
  2. 数据总线读写内存的数据。
  3. 控制总线发送和接收信号。(中断、设备复位等信号,CPU 收到信号后进应,这时也需要控制总线)

CPU读写内存数据时,需通过两个总线:要通过 地址总线 来指定内存的地址;再通过 数据总线 来传输数据。

(4) 输入、输出设备:
输备向计算机输据,计算机经过计算后,把数据输出给输出设备。(期间,如果输备是键盘,则按下按键时 是需要和CPU进互的,这时就需要控制总线了)
 

3. 线路位宽与CPU位宽

问题:数据是如何通过线路传输的呢/strong>

              通过操作电压,低电压表示0,电压表示1。
如果构造 这样的信号,可以表示为 101制数据,如果只有线路,就意味着每次只能传递 1bit的数据 (即0或1),那么传输101这个数据,需要经过3次传输才能完成,这样的效率低。

这样传输的方式,称为串行传输 (下bit 必须等待上bit 传输完成才能进输)。若想传多位数据,则需要增加线路,这样/strong>次传输多位数据的方式,称为并行传输

为了避免低效率的 串行传输的方式,线路的位宽最好就能 访问到所有的内存地址。(CPU操作内存地址 需要地址总线,如果地址总线只有1条,那每次只能表示 0或1 这两种情况,所以CPU只能操作 2个内存地址;如果CPU想要操作 4G(2^32)的内存,那么就需要 32条地址总线)

CPU的位宽 最好不要小于线路位宽。(如果32位CPU 控制40位宽的地址总线和数据总线,起来就会复杂且麻烦,32位CPU 最好和32位宽的线路搭配,因为32位CPU最多只能操作 32位宽的地址总线和数据总线。)

如果2位CPU去加和 两个64位的数字,就需要把2个64位的数字 分成2个低位32位数字和2个32位数字 来计算。先加和两个低位的 32位数字,算出进位,再加和两个的 32位数字,最后加上进位,就算出最后结果了,可以发现32 位CPU 并不能性计算出 加和两个64位数字的结果。

而对于64位CPU 就可以性算出 加和两个64位数字的结果,因为64位CPU 可以读4 位的数字,并且64位CPU内部的逻辑运算单元 也64位数字的计算。

但是这并不代表 64位CPU性能2位CPU 多,因为很少应需要算超过32位的数字,所以如果计算的数额 不超过32 位数字的情况下,32位和64位CPU之间 没什么区别的,只有当计算 超过32位数字的情况下,64位CPU的优势才能体现出来。

另外,32 位CPU 最能操作4GB内存,如果装了8GB内存条 就会造成浪费。64位CPU可以寻址的范围更理论最寻址空间为 2^64 。

注:硬件的64位和32位 指的是 CPU的位宽,软件的64位和32位 指的是 指令的位宽。

4. 程序执行的基本过程

程序就是指令,所以程序的运程 就是把每指令的执来,负责执令就是CPU。

硬件结构——(1) CPU 是如何执行程序的?

CPU执行程序的过程:

  • 第:CPU读取 程序计数器的值,这个值是 指令的内存地址,然后CPU的控制单元操作地址总线 指定需要访问的内存地址,接着通知内存设备 准备数据,数据准备好后 通过数据总线 将指令数据传给CPU,CPU收到内存传来的数据后,将这个指令数据 存指令寄存器
  • 第:CPU分析 指令寄存器中的指令,确定指令的类型和参数。如果是计算类型的指令,就把指令交给逻辑运算单元运算;如果是存储类型的指令,则交由控制单元
  • 第三步:CPU执指令后,程序计数器的值,表示指向下指令。(的PU的位宽决定,:32 位的CPU,指令是4个字节,需要消耗 4个内存地址指向的存储单元 来存放,因此程序计数器的值 会4)

总结:程序执时,CPU会根据 程序计数器内存地址,从内存中 把需要执指令 读取到指令寄存器 后执然后根据指令,开始顺序读取下指令。(CPU从程序计数器读取指令、到执再到下指令,这个过程会不断循环,直到程序执束,这个不断循环的过程被称为 CPU的指令周期
 

5. a=1+2 的具体执行过程

编译:CPU无法直接运行高级语言。首先,需要将高级语言程序 编译成汇编语序,再编器 将汇编语序翻译成机器码。(机器码由 0和1 组成的机器语条的机器码 就是条的计算机指令,这才是CPU能够识别的语言)

存储:数据和指令是分开区域存放的。1和2是数据,存放数据的区域 称为数据段;存放指令的区域 称为正文段

硬件结构——(1) CPU 是如何执行程序的?
  • 数据1 被存放到 0x104位置;
  • 数据2 被存放到 0x100位置;

编译器把 a=1+2 翻译成 4条指令,存放到正中。
如图,这 4 条指令被存放到了 0x200 ~ 0x20c 区域中:

  • 0x200 的内容load指令 将 0x100 地址中的数据 2 装寄存器R0 ;
  • 0x204 的内load指令 将 0x104 地址中的数据 1 装寄存器R1 ;
  • 0x208 的内容:add指令 将 寄存器R0和R1 的数据相加,并把结果存放到 寄存器R2 ;
  • 0x20c 的内容:store指令 将 寄存器R2 中的数据 存回数据段中的 0x108 地址中,这个地址就是变量a 在内存中的地址;

编译完成后,具体执序时,程序计数器会被设置为 0x200 地址,然后依次执4 条指令。
因为上例在 32位CPU 上执,所以指令占 32 位,每条指令间隔 4个字节。
据的是根据程序中指定的变量类型 而定。(:int类型的数据则占 4个字节, char类型的数据占 1个字节)

 

(1) 指令:
不同的 CPU 有不同的指令集,对应着 不同的汇编语不同的机器码,接下来选简单的 MIPS指集,来看看机器码是如何的,这样也能明进制的机器码的具体含义。
MIPS指令是32位的二进制,高6位 代表着操作码,表示这条指令是什么样的指令,剩下的26位 不同指令类型所表示的内容不同,主要有三种类型R、I、J。

硬件结构——(1) CPU 是如何执行程序的?

字段命名:
    op:操作码 (指令类型)
    rs:第一个源操作数寄存器号
    rt:第二个源操作数寄存器号
    rd:目的寄存器号 (存放操作结果)
    shamt:位移量 (执行移位操作时 指明需要移动的次数)
    funct:功能码

  • R指令:算术和逻辑操作时,需要读取和写入数据的寄存器号;用于逻辑位移操作时,还需要位移量。当前操作码长度不够时,功能码 用来扩展操作码 来表示对应的具体指令。
  • I指令:数据传输、条件分。后面三个字段所占的11位 被合并成一个字段,这个字段表示 地址值或常数。
  • J指令:跳转。操作码字段之后的26位 合并成一个字段,表示跳转目标地址。

将前面例子的这条指针:”add指令 将 寄存器R0和R1 的数据相加,并把结果放寄存器R2″   翻译成的机器码如下:

硬件结构——(1) CPU 是如何执行程序的?

加和运算 add指令 是属于 R指令类型:

  • add 对应的 MIPS指令 的操作码是 000000,以及最末尾的功能码是 100000;
  • rs 代表 第寄存器R0 的编号,即 00000;
  • rt 代表 第寄存器R1 的编号,即 00001;
  • rd 代表 的临时寄存器R2 的编号,即 00010;
  • 因为不是位移操作,所以位移量是 00000;

将上面所有的字段连起来 就是32位 的MIPS加法指令。(6进制表示的机器码 则是0x00011020)

  • 编译器编译程序时 构造指令,这个过程叫作指令的编码。 
  • CPU执序时 解析指令,这个过程叫作指令的解码

现代CPU 大多数使strong>流水线的来执令,所谓的流就是把任务 拆分成多个务。

如指令通常分为 4个阶段,可以构造 4级流,如下图:

硬件结构——(1) CPU 是如何执行程序的?

四个阶段的具体含义:

  1. CPU 通过程序计数器 读取对应内存地址的指令,这个部分称为 Fetch(取得指令)
  2. CPU 对指令进码,这个部分称为 Decode(指令译码)
  3. CPU 执令,这个部分称为 Execution(执行指令)
  4. CPU 将计算结果存回寄存器 或者将寄存器的值回写内存,这个部分称为 Store(数据回写)

上4个阶段,我们称为指令周期,CPU就是周期接着周期工作,周始。

事实上,不同的阶段 是由计算机中 不同的组件完成的:

硬件结构——(1) CPU 是如何执行程序的?
  • 取指令阶段:指令存放在存储器。实际上,通过 程序计数器和指令寄存器 取出指令的过程,是由控制单元操作的。
  • 指令译码阶段:也是由控制单元操作的。
  • 指令执行阶段:是进算术操作、逻辑操作,还是进数据传输、条件分作,都是由算术逻辑单元操作的 (也就是由运算器处理的)。但如果是简单的 件地址跳转,则是直接在控制单元中完成,不需要运算器。

(2) 指令的类型:
指令从功能的角度划分,可以分为 5大类:

  1. 数据传输类型的指令 (store/load 是寄存器与内存间 数据传输的指令,mov 是将内存地址的数据 移动到另内存地址的指令)
  2. 运算类型的指令 (加减乘除、位运算、等等,它们最多只能处理两个寄存器中的数据)
  3. 跳转类型的指令 (通过修改程序计数器的值 来达到跳转执令的目的,编程中常if-else、swtich-case、函数调)
  4. 信号类型的指令 (发断的指令 trap)
  5. 闲置类型的指令 (指令nop 执,CPU会空转周期)

(3) 指令的执行速度:

  • CPU的硬件参数中 有GHz这个参数。1GHz 的CPU,指的是时钟频率是 1G,表示 1 秒产G次数 的脉冲信号。每脉冲信号 电平转换的过程 表示一个时钟周期
  • 对于CPU来说,在时钟周期内,CPU仅能完成 最基本的动作。时钟频率越时钟周期就越短,速度也就越快。
  • 大多数指令不能在时钟周期完成,通常需要若时钟周期。不同指令需要的时钟周期是不同的 (比如:加法和乘法 都对应着CPU指令,但执行乘法指令需要的时钟周期数 法多)

对于程序的CPU执行时间,我们可以拆解成  CPU时钟周期数 和 时钟周期时间 的乘积

硬件结构——(1) CPU 是如何执行程序的?

时钟周期时间 就是前及的 CPU主频,主频越CPU的速度就越快。要想CPU跑的更快,最基本的就是 提升CPU主频,但是今摩尔定律早已失效,现在的CPU主频 已经无法做到每隔18个月 性能就翻1倍了。

缩短CPU时钟周期数 来提高CPU主频,是我们软件师无法触及的领域,但可以通过 减少程序所需的CPU时钟周期数量 来提升程序的性能。

对于 CPU时钟周期数 可以进拆解成:指令数 x 每条指令的平均时钟周期数(CPI),于是程序的 CPU执间的公式 可变成如下:

硬件结构——(1) CPU 是如何执行程序的?

因此,要想程序跑的更快,优化这三者即可。

  • 指令数:指执行程序所需要的多少条指令,以及哪些指令。(这个层基本靠编译器来优化。因为同样的代码 在不同的编译器下,编译出来的计算机指令 会有不同的结果)
  • 每条指令的平均时钟周期数 CPI:表示执行指令 所需要的时钟周期数。(现今数CPU 通过流水线技术,使得执行指令 所需要的CPU时钟周期数 尽可能的少)
  • 时钟周期时间:指计算机主频,取决于计算机硬件。(有的CPU 超频技术,打开超频意味着 将CPU内部的时钟给调快了,因此 CPU的速度就变快了。但是这也是有代价的,因为CPU跑的越快,散热的压会越CPU也就容易奔溃)

来源:杉杉来啦

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年7月16日
下一篇 2021年7月16日

相关推荐