您的位置:  首页 > 技术杂谈 > 正文

CPU是如何执行程序的 | a = 1 +2 在CPU中发生了什么?

2022-01-27 10:00 https://my.oschina.net/my1197/blog/5415645 Anta_Cnl 次阅读 条评论

1. CPU 是如何执行程序的?

代码写了那么多,你知道 a = 1 + 2 这条代码是怎么被 CPU 执行的吗?

不知道也不用慌张,接下来就循序渐进的、一层一层的攻破这些问题。

图灵机的工作方式

图灵机长什么样子呢?你从下图可以看到图灵机的实际样子:

  • 有一条「纸带」,纸带由一个个连续的格子组成,每个格子可以写入字符,纸带就好比内存,而纸带上格子的字符就好比内存中的数据或程序;
  • 有一个「读写头」,读写头可以读取纸带上任意格子的字符,也可以把字符写入到纸带的格子;
  • 读写头上有一些部件,比如存储单元、控制单元以及运算单元:
  1. 存储单元用于存放数据;
  2. 控制单元用于识别字符是数据还是指令,以及控制程序的流程等;
  3. 运算单元用于执行运算指令

知道了图灵机的组成后,我们以简单数学运算的 1 + 2 作为例子,来看看它是怎么执行这行代码的。

  • 首先,用读写头把 「1、2、+」这 3 个字符分别写入到纸带上的 3 个格子,然后读写头先停在 1 字符对应的格子上
  • 接着,读写头读入 1 到存储设备中,这个存储设备称为图灵机的状态;
  • 然后读写头向右移动一个格,用同样的方式把 2 读入到图灵机的状态,于是现在图灵机的状态中存储着两个连续的数字, 1和2;

  • 读写头再往右移动一个格,就会碰到 + 号,读写头读到 + 号后,将 + 号传输给「控制单元」,控制单元发现是一个 + 号而不是数字,所以没有存入到状态中,因为 + 号是运算符指令,作用是加和目前的状态,于是通知「运算单元」工作,运算单元收到要加和状态中的值的通知后,就会把状态中的 1 和 2 读入并计算,再将计算的结果 3 存放到状态中

  • 最后,运算单元将结果返回给控制单元,控制单元将结果传输给读写头,读写头向右移动,把结果 3 写入到纸带的格子中

事实上,图灵机这个看起来很简单的⼯作⽅式,和我们今天的计算机是基本⼀样的。接下 来,我们⼀同再看看当今计算机的组成以及⼯作⽅式。

冯诺依曼模型

在 1945 年冯诺依曼和其他计算机科学家们提出了计算机具体实现的报告,其遵循了图灵机的设计,⽽且还提出⽤电⼦元件构造计算机,并约定了⽤⼆进制进⾏计算和存储,还定义计算机基本结构为 5 个部分,分别是中央处理器(CPU)、内存、输⼊设备、输出设备、总线。

内存

我们的程序和数据都是存储在内存,存储的区域是线性的。

数据存储的单位是⼀个⼆进制位(bit),即 0 或 1。最⼩的存储单位是字节(byte),1 字节等于 8 位。

内存的地址是从 0 开始编号的,然后⾃增排列,最后⼀个地址为内存总字节数 - 1,这种结构好似我们程序⾥的数组,所以内存的读写任何⼀个数据的速度都是⼀样的。

中央处理器(CPU)

中央处理器也就是我们常说的 CPU,32 位和 64 位 CPU 最主要区别在于⼀次能计算多少字节数据:

  • 32 位 CPU ⼀次可以计算 4 个字节;
  • 64 位 CPU ⼀次可以计算 8 个字节;

**CPU内部组件:

  • 寄存器

  • 控制单元

  • 逻辑运算单元

总线

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

  • 地址总线,⽤于指定 CPU 将要操作的内存地址;
  • 数据总线,⽤于读写内存的数据;
  • 控制总线,⽤于发送和接收信号,⽐如中断、设备复位等信号,CPU 收到信号后⾃然进⾏响应,这时也需要控制总线;

当 CPU 要读写内存数据的时候,⼀般需要通过两个总线:

  • ⾸先要通过「地址总线」来指定内存的地址;
  • 再通过「数据总线」来传输数据;

输⼊、输出设备

输⼊设备向计算机输⼊数据,计算机经过计算后,把数据输出给输出设备。期间,如果输⼊设备是键盘,按下按键时是需要和 CPU 进⾏交互的,这时就需要⽤到控制总线了。

a = 1 + 2 执⾏具体过程

程序编译过程中,编译器通过分析代码,发现 1 和 2 是数据,于是程序运⾏时,内存会有个专⻔的区域来存放这些数据,这个区域就是「数据段」。如下图,数据 1 和 2 的区域位置:

  • 数据 1 被存放到 0x100 位置;
  • 数据 2 被存放到 0x104 位置;

注意,数据和指令是分开区域存的,存放指令区域的地⽅称为「正⽂段」。

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

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

编译完成后,具体执⾏程序的时候,程序计数器会被设置为 0x200 地址,然后依次执⾏这 4条指令,最终计算出变量a的结果。

展开阅读全文
  • 0
    感动
  • 0
    路过
  • 0
    高兴
  • 0
    难过
  • 0
    搞笑
  • 0
    无聊
  • 0
    愤怒
  • 0
    同情
热度排行
友情链接