1. CPU 是如何执行程序的?
代码写了那么多,你知道 a = 1 + 2 这条代码是怎么被 CPU 执行的吗?
不知道也不用慌张,接下来就循序渐进的、一层一层的攻破这些问题。
图灵机的工作方式
图灵机长什么样子呢?你从下图可以看到图灵机的实际样子:
知道了图灵机的组成后,我们以简单数学运算的 1 + 2 作为例子,来看看它是怎么执行这行代码的。
事实上,图灵机这个看起来很简单的⼯作⽅式,和我们今天的计算机是基本⼀样的。接下 来,我们⼀同再看看当今计算机的组成以及⼯作⽅式。
冯诺依曼模型
在 1945 年冯诺依曼和其他计算机科学家们提出了计算机具体实现的报告,其遵循了图灵机的设计,⽽且还提出⽤电⼦元件构造计算机,并约定了⽤⼆进制进⾏计算和存储,还定义计算机基本结构为 5 个部分,分别是中央处理器(CPU)、内存、输⼊设备、输出设备、总线。
内存
我们的程序和数据都是存储在内存,存储的区域是线性的。
数据存储的单位是⼀个⼆进制位(bit),即 0 或 1。最⼩的存储单位是字节(byte),1 字节等于 8 位。
内存的地址是从 0 开始编号的,然后⾃增排列,最后⼀个地址为内存总字节数 - 1,这种结构好似我们程序⾥的数组,所以内存的读写任何⼀个数据的速度都是⼀样的。
中央处理器(CPU)
中央处理器也就是我们常说的 CPU,32 位和 64 位 CPU 最主要区别在于⼀次能计算多少字节数据:
**CPU内部组件:
寄存器
控制单元
逻辑运算单元
总线
总线是⽤于 CPU 和内存以及其他设备之间的通信,总线可分为 3 种:
当 CPU 要读写内存数据的时候,⼀般需要通过两个总线:
输⼊、输出设备
输⼊设备向计算机输⼊数据,计算机经过计算后,把数据输出给输出设备。期间,如果输⼊设备是键盘,按下按键时是需要和 CPU 进⾏交互的,这时就需要⽤到控制总线了。
a = 1 + 2 执⾏具体过程
程序编译过程中,编译器通过分析代码,发现 1 和 2 是数据,于是程序运⾏时,内存会有个专⻔的区域来存放这些数据,这个区域就是「数据段」。如下图,数据 1 和 2 的区域位置:
注意,数据和指令是分开区域存的,存放指令区域的地⽅称为「正⽂段」。
编译器会把 a = 1 + 2 翻译成 4 条指令,存放到正⽂段中。如图,这 4 条指令被存放到了0x200 ~ 0x20c 的区域中:
编译完成后,具体执⾏程序的时候,程序计数器会被设置为 0x200 地址,然后依次执⾏这 4条指令,最终计算出变量a的结果。
|