图灵机由英国数学家和计算机科学家阿兰·图灵(Alan Turing)于1936年提出。它是一种抽象的计算设备,是一种理论上的计算模型,用于描述和模拟计算的过程,至于为什么要做计算可参考我另外一篇文章。可以说,图灵机抽象模型一经提出,从此计算机的设计就有了核心灵魂。
所以,搞懂图灵机,才能搞懂由此延申出来各种计算机系统、子系统。
图灵机简单介绍
图灵机由以下几个部分组成:
- 无限长的纸带,被划分为一个个单元格,每个单元格上可以写入符号。
- 读写头,可以在纸带上移动,并读取和写入单元格上的符号。
- 控制单元,根据读写头的位置和读取到的符号来决定下一步的操作。
图灵机的工作原理如下:
- 初始时,纸带上包含输入数据,并且读写头指向初始位置。
- 控制单元根据读写头所在位置和读取到的符号,根据预先定义的规则,决定下一步的操作,例如写入新的符号、移动读写头、改变状态等。
- 根据控制单元的指令,图灵机执行相应的操作,并进入下一个状态。
- 这个过程不断重复,直到图灵机进入终止状态或无法继续执行。
人肉跑图灵机
上面读不懂没关系,我们来人肉跑一下抽象模型,再结合我给的图抽象思考下就懂了。
下面是我经过烧脑推理画的抽象图,再次对图灵机做一次抽象:
1、纸袋——抽象人类编写的计算规则输入媒介
2、读写头和控制单元,抽象控制规则
3、Program抽象的人基于2的控制规则编制程序
我写了一个程序到纸袋上,纸袋上它们的顺序是010,看下图执行过程的read列,我的Program给定了从纸袋读取0的时候,下一个动作是写纸袋1,然后向右边移动,跳转的下一个state还是0,这个时候纸袋值从0变1。然后纸条划走,来到第二个位置,program中state 0的1,对应动作写纸袋0,然后右移,下一个状态还是0。如此往复,最后还能停机。剩下的读者自己画个表,像我这样。分析下,动动脑子就懂了。
从虚到实
图灵机,搁我的理解(当然不权威),就是一个确定的规则集合、按规则编制的状态控制、数据集合,外加让前面两抽象动起来的机制。
图灵在1936年提出,旨在解决“可计算性”问题,即什么样的问题可以通过计算来解决。图灵机具有无限长的纸带、读写头和控制单元等组件,通过读写头的移动和符号的读写来模拟计算过程。这是一个
1945年冯·诺依曼(John von Neumann)根据当时已经具备雏形的计算机器,抽象的提出冯·诺依曼架构。它包括了计算机的五个基本组成部分:中央处理器(CPU)、存储器(Memory)、输入设备(Input)、输出设备(Output)和控制单元(Control Unit)。冯·诺依曼架构中的程序和数据都存储在存储器中,通过控制单元的指令来执行计算操作。把图灵机从抽象中解放了出来,变得更加具体。
当然还有一种大同小异的哈佛架构~这里就不提了。
图灵机和冯·诺依曼架构的泛化
抽象的好处,就是其泛化能力,这个是人类独有的,你独有的智慧。
我要说的其实一个美学问题,即相同的结构,在不同的观察层次,重复出现的组织之美。如果你了解过分型理论,你一定知道我在说什么。
下面我们列举两个例子。
硬件层面
CPU内部
CPU(中央处理器)内部通常由以下几个主要组件构成:
-
控制单元(Control Unit):控制单元是CPU的核心部分,负责协调和管理CPU内部的操作。它解析和执行指令,控制数据流和控制信号的传输,并确保各个组件按照正确的顺序执行操作。
-
算术逻辑单元(Arithmetic Logic Unit, ALU):ALU执行算术和逻辑运算,例如加法、减法、乘法、逻辑与、逻辑或等。它接收来自寄存器的数据,并根据指令执行相应的运算操作。
-
寄存器(Registers):寄存器是CPU内部的临时存储器,用于存储指令、数据和中间结果。不同类型的寄存器用于不同的目的,例如程序计数器(Program Counter, PC)用于存储下一条要执行的指令的地址,累加器(Accumulator)用于存储运算结果等。
-
存储器(Memory):存储器用于存储程序和数据。它包括主存储器(RAM)和辅助存储器(硬盘、固态硬盘等)。CPU通过访问存储器来读取指令和数据,并将结果写回存储器。
-
数据通路(Data Path):数据通路是连接CPU内部各个组件的路径,用于传输数据和控制信号。它包括数据总线(Data Bus)、地址总线(Address Bus)和控制总线(Control Bus),用于在各个组件之间传递数据和控制信号。
-
缓存(Cache):缓存是一种高速临时存储器,用于存储最常访问的指令和数据。它位于CPU内部,能够提供更快的数据访问速度,以减少对主存储器的访问次数。
以上是现代CPU内部常见的组成部分,它们共同协作,实现指令的解析、数据的处理和存储、控制信号的传输等功能。这些组件的设计和优化对于CPU的性能和效率至关重要。
CPU内部由制造商写死了确定的规则,这些规则提供给使用者的对接方式就是CPU的指令集,指令对应了电路中的一个电路组合和行为。
人在此基础上code。写操作系统、写驱动、写应用。
内存内部
现代内存(主存储器)内部通常由以下几个主要组件构成:
-
存储单元(Memory Cells):存储单元是内存的基本组成单位,用于存储数据。每个存储单元通常由一个或多个存储元件组成,例如电容器、翻转触发器等。每个存储单元能够存储一个固定大小的数据单元,例如一个字节。
-
地址线(Address Lines):地址线用于指定要访问的存储单元的地址。它们决定了内存中的特定存储单元的位置。地址线的位数决定了内存的寻址能力,即能够寻址的存储单元的数量。
-
数据线(Data Lines):数据线用于传输数据到内存或从内存中读取数据。它们是用于传输数据的物理连接,决定了内存与其他组件之间的数据传输速度和带宽。
-
控制线(Control Lines):控制线用于传输控制信号,例如读写信号、使能信号、时钟信号等。它们控制内存的读写操作和时序。
-
存储器管理电路(Memory Management Circuitry):存储器管理电路负责内存的管理和控制。它包括地址解码器(Address Decoder)用于将地址信号解码为特定存储单元的选通信号,还包括写入/读取电路(Write/Read Circuitry)用于处理写入和读取操作。
-
控制逻辑(Control Logic):控制逻辑协调和管理内存的操作。它接收来自CPU或其他组件的控制信号,并根据信号的类型和时序来控制内存的读写操作。
我们可以看到,就算内存内部,也由控制单元、内外部存储单元、抽象总线、。
存储的磁盘
硬盘(Solid State Drive, SSD)内部通常由以下几个主要组件构成:
-
存储芯片(Memory Chips):固态硬盘使用闪存芯片作为存储介质,存储数据。闪存芯片通常采用非易失性存储技术,例如NAND闪存。每个存储芯片包含多个存储单元,每个存储单元可以存储多个比特的数据。
-
控制器(Controller):控制器是固态硬盘的核心部分,负责管理和控制固态硬盘的操作。它接收来自计算机系统的读写请求,并将数据传输到存储芯片或从存储芯片中读取数据。控制器还负责处理错误检测和纠正、垃圾回收、数据压缩和加密等功能。
-
高速缓存(Cache):固态硬盘通常配备一定容量的高速缓存,用于临时存储读取和写入的数据。高速缓存能够提供更快的数据访问速度,提高固态硬盘的性能。
-
接口(Interface):固态硬盘与计算机系统之间通过接口进行连接和通信。常见的接口包括SATA(Serial ATA)、PCIe(Peripheral Component Interconnect Express)等。接口的类型和版本会影响固态硬盘的数据传输速度和兼容性。
-
控制逻辑(Control Logic):控制逻辑协调和管理固态硬盘的操作。它接收来自CPU或其他组件的控制信号,并根据信号的类型和时序来控制固态硬盘的读写操作。
-
电源管理电路(Power Management Circuitry):电源管理电路负责管理固态硬盘的电源供应。它可以控制固态硬盘的功耗和电源模式,以提高能效和延长电池寿命。
我们可以看到,就算内存内部,也由控制单元、内外部存储单元、抽象总线。
列举了三个计算机内部基本的单元,它们内部其实就是一个小型的冯诺依曼架构。
软件层面
软件层面也能泛化。
就问你,你是不是自嘲CRUD Boy/Girl,你面向的是什么在编程,是不是在用一堆确定的api在那调用api?你是不是在利用api的规则在构建一堆复杂的业务规则?
只不过,有的coder负责设计和定义计算机的指令集,依赖于底层的电路设计的固定规则。
有的coder负责编写汇编程序,依赖硬件提供的指令集。
有的coder负责设计和开发操作系统,依赖C语言、汇编。
有的coder负责使用开发语言开发应用系统,依赖语言本身及操作系统提供的能力。
coder 们有自己所在的层级,有自己层级的生态,而此生态依赖于它下一层级提供的的规则集合,coder们利用规则创建他所面向业务的规则集合,再提供给别人使用的规则集合,最终落到了不会编码的普通手上。这活生生的,就像地球的生物群落一样。
搞清楚自己所在的层级,你知道你学的技术是什么了吗?规则集合,然后用起来,搭建你的目标规则集合,放出去给别人使用。
that’s it
大可大,小可小,无限套娃,深化泛化,抽象万岁~
尾声
如果跳出计算机,来到更加旷阔的视野中,你如果按这种思维方式去看,你会看到什么?
校园网内部,公司内网,计算机组成的集群,甚至超级云计算内部,何尝又不是这种架构为主的变种?明显的区别,就是单机内部的总线变成了网线~~
少年,跳出三界,open your eyes~~~