在理解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. Java对象的创建过程:类的初始化与实例化

    一.Java对象创建时机 我们知道,一个对象在可以被使用之前必须要被正确地实例化.在Java代码中,有很多行为可以引起对象的创建,最为直观的一种就是使用new关键字来调用一个类的构造函数显式地创建对象 ...

  2. 【力扣】922. 按奇偶排序数组 II

    给定一个非负整数数组 A, A 中一半整数是奇数,一半整数是偶数. 对数组进行排序,以便当 A[i] 为奇数时,i 也是奇数:当 A[i] 为偶数时, i 也是偶数. 你可以返回任何满足上述条件的数组 ...

  3. 【C/C++】C++ warning: control reaches end of non-void function return

    控制到达非void函数的结尾. 一些本应带有返回值的函内数到容达结尾后可能并没有返回任何值. 这时候,最好检查一下是否每个控制流都会有返回值. 我是ostream声明的时候没有写return out; ...

  4. vivo浏览器的快速开发平台实践-总览篇

    一.什么是快速开发平台 快速开发平台,顾名思义就是可以使得开发更为快速的开发平台,是提高团队开发效率的生产力工具.近一两年,国内很多公司越来越注重研发效能的度量和提升,基于软件开发的特点,覆盖管理和优 ...

  5. Mysql实例 数据库优化

    目录 一.前言 二.数据库表设计 三.数据库结构设计 四.数据库性能优化 硬件配置选择 数据库配置优化 系统配置优化 数据库安全优化 五.数据库架构扩展 增加缓存 主从复制与读写分离 分库 分表 分区 ...

  6. ciscn_2019_s_9

    很简单的一道题 例行检查 没有开启nx保护,就想到了shellcode来做 很明显的栈溢出 唯一的要求就是shellcode长度不能超过0x24 通过jump跳转到shellcode的位置 完整exp ...

  7. CF1132B Discounts 题解

    Content 有一个长度为 \(n\) 的数组 \(a_1,a_2,a_3,...,a_n\).有 \(q\) 次询问,每次询问给定一个数 \(x\).对于每次询问,求出数组中去掉一个第 \(x\) ...

  8. LuoguP7369 [COCI2018-2019#4] Elder 题解

    Content 有一个魔杖最初在 \(Z\) 巫师中.经过 \(n\) 轮较量,第 \(i\) 轮中,\(Z_{i,1}\) 巫师打败了 \(Z_{i,2}\) 巫师.如果一个巫师打败了拥有魔杖的巫师 ...

  9. 使用vi编辑时,上下左右键显示为字符的问题

    1.此问题是因为ubuntu系统自带的 vi 不完整导致,解决方法:安装完整的vi,执行命令: # sudo apt-get install vim-gtk

  10. springboot整合阿里云视频点播接口

    官方SDK文档地址: https://help.aliyun.com/document_detail/57756.html?spm=a2c4g.11186623.6.904.4e0d3bd9VbkIC ...