图灵机的工作方式

图灵机的基本思想就是用机器来模拟人们用纸笔进行数学运算的过程,而且定义了计算机由哪些部分组成,程序又是如何执行的。

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

image.png
图灵机的基本组层如下:

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

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

  1. 首先,用读写头把1,2,+这三个字符分别写入纸带上的3个格子,然后读写头先停在1字符对应的格子上:

    1. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/2332713/1625793900960-420200a2-bd98-4e57-94b1-c09f3e3607c0.png#clientId=u7b7eab6a-a5ef-4&from=paste&height=112&id=ud4eaefcc&margin=%5Bobject%20Object%5D&name=image.png&originHeight=302&originWidth=1082&originalType=binary&ratio=1&size=86592&status=done&style=none&taskId=ufd5845d2-ebc4-4508-abac-56e4f3e1374&width=400)
  2. 然后读写头向右移动一个格,用同样的方式吧2读到图灵机的状态,于是现在图灵机的状态中存储着两个连续的数字:1和2

    1. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/2332713/1625794012489-017ce05b-485b-4310-bff9-f14f7e69f749.png#clientId=u7b7eab6a-a5ef-4&from=paste&height=167&id=u73387164&margin=%5Bobject%20Object%5D&name=image.png&originHeight=302&originWidth=1082&originalType=binary&ratio=1&size=87250&status=done&style=none&taskId=u21216755-28ae-46f5-beb0-1596977e0c8&width=600)
  3. 读写头再往右移动一个格,就会碰到+号,读写头读到+号后,将+号传输给控制单元。控制单元发现是一个+号而不是数字,所以没有存入状态中,因为+号是运算符指令,作用是加和目前的状态。于是通知运算单元工作,运算单元收到要加和状态的值通知后,就会把状态中的1和2读入并计算,再将计算的结果存存放到状态中。

    1. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/2332713/1625794235999-8f9b5703-16a5-4f0e-8df7-0b7d99137f71.png#clientId=u7b7eab6a-a5ef-4&from=paste&height=260&id=xlxkA&margin=%5Bobject%20Object%5D&name=image.png&originHeight=519&originWidth=1233&originalType=binary&ratio=1&size=132317&status=done&style=none&taskId=u892a02e4-e742-455e-94e1-36ba8dd744f&width=616.5)
  4. 最后,运算单元将结果返回给控制单元,控制单元将结果传输给读写头,读写头向右移动,把结果3写入到纸带的格子中。

    1. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/2332713/1625794359158-5600bf36-61eb-4326-a427-423168e620c3.png#clientId=u7b7eab6a-a5ef-4&from=paste&height=148&id=uf86b9da9&margin=%5Bobject%20Object%5D&name=image.png&originHeight=257&originWidth=866&originalType=binary&ratio=1&size=57897&status=done&style=none&taskId=ud43a24fd-51ac-4bbc-89af-c8503ffe8d1&width=500)

这个图灵机的工作方式看起来很简单,和我们今天的计算机是基本一样的。

冯诺伊曼模型

1945年,冯诺伊曼和其他计算机科学家们提出了计算机具体实现的报告,其遵循了图灵机的设计。还定义计算机基本结构为5个部分,分别是中央处理器(CPU),内存,输入设备,输出设备,总线。

  1. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/2332713/1625847346196-10129aa3-8f0c-40e9-866a-c3899e3ddd26.png#clientId=u845b3fb1-802b-4&from=paste&height=221&id=u70a8c18a&margin=%5Bobject%20Object%5D&name=image.png&originHeight=407&originWidth=920&originalType=binary&ratio=1&size=52251&status=done&style=none&taskId=u386e103c-f70d-4841-bc17-16889704283&width=500)<br />我们主要来看看cpu的组成,cpu内部有一些组件,常见的有寄存器,控制单元和逻辑运算单元。其中,控制单元负责控制CPU工作,逻辑运算单元负责计算,而寄存器可以分为多种类型,每种寄存器的功能又不尽相同。内存太远,寄存器更近,这是很大的优势:常见的寄存器种类有:
  1. 通用寄存器,用来存放需要运行的数据,比如需要进行加和运算的两个数据
  2. 程序计数器,用来存储CPU要执行下一条指令所在的内存地址,注意不是存储了下一条要执行的指令。此时指令还在内存中,程序计数器只是存储了下一条指令的地址。
  3. 指令寄存器,用来存放程序计数器指向的指令,指令被执行完成之前,指令都存储在这里

程序执行的基本过程

在前面,我们知道了图灵机的执行过程,接下来我们来看看程序在冯诺伊曼模型上是怎么执行的?程序实际上是一条一条指令,所以指令的运行过程是把一条指令一步一步地执行起来,负责执行指令的就是CPU了。
image.png
CPU执行程序的过程如下:

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

CPU从程序计数器读取指令,到执行,再到下一条指令,这个过程会不断循环,知道程序执行结束,这个不断循环的过程被称为CPU的指令周期。