计算抽象:可计算理论、模型与计算机

实际上关于本文所要探讨的内容,早在19年就在 关于可计算、图灵机及CPU性能 中进行了梳理。所以本文简要串联下逻辑,其余内容可以参见之前的这篇文章。

计算机和操作系统的核心自然是为 计算 服务的,那么什么问题是可被计算的呢?这就是可计算理论探讨的问题。

但是理论过于抽象,而图灵机就可以认为是该理论的模型,即 计算模型 。图灵机可以等价于任何有限逻辑数学过程的终极强大逻辑机器。除了图灵机之外,还有其他的计算模型,比如寄存器机

关于此处的内容,参见维基百科的定义。可以在维基百科上顺着图灵机找到很多相关的概念索引,值得试试看。

那么 计算模型 如何变成现实呢?冯·诺伊曼结构

该结构思想和我们之前学过的知识点有非常大的联系,主要是:

  • 存储和计算分离:plusar消息队列可还记得?当然了,plusar的存储和计算分离是消息队列历史演进中产生的思想。
  • 更进一步的是,逻辑和控制分离:各种设计模式、编程思想,重点就是控制流程和业务逻辑的分离。

该结构五大件:控制器、运算器、存储器、输入、输出。算法都讲究空间复杂度和时间复杂度,为什么呢?和五大件一对比,很自然得出推论:

  • 存储器:对应空间
  • 控制器和运算器组成的执行单元:对应时间

一个程序占用执行单元时间长了,自然时间复杂度就高。你用的多了,其他程序不就用的少了?一个程序占用存储器的空间越多,空间复杂度越高。虽然有虚拟内存机制,好像内存(存储单元)大小是相对无限的,但是过大内存占用,会导致频繁的缺页,拉高磁盘负载,进而又反过来影响执行单元的执行。

假设: 执行单元不再是晶体管实现,而是变成了量子计算机,且量子计算器的计算能力无穷。那么请问,到那时,时间复杂度还是重要的标准吗?


再回到 计算 上,现阶段计算的重要指标就是速度,如何评估速度呢?两个维度:

  1. 响应时间:单位任务完成的时间
  2. 吞吐量:单位时间完成的任务

这两个维度太棒了,响应时间偏向于个体,吞吐量偏向于整体。

那么单个任务的执行时间,在这里就是CPU的执行时间,CPU执行时间 = CPU时钟周期数 * 周期时间。

当CPU当做是一个需要口号121 121来指挥的机器,喊口号时工作(喊得越快跑的越快),不喊口号时停止。那么这个机器完成一项任务的总时间,自然就等于喊口号的数量 * 喊口号的频率。

这里更建议阅读一下《编码:隐匿在计算机软硬件背后的语言》,可以理解为什么CPU需要时钟周期,也即底层硬件结构:实际上就是 组合逻辑电路和时序逻辑电路组成,需要统一的口号(心跳)来协调工作。

同时,建议阅读《计算机组成》第一章。

CPU执行时间 = CPU时钟周期数 * 周期时间,而CPU时钟周期数 = 指令数 * 平均每条指令的执行时间。

所以:CPU执行时间(响应时间) = 指令数 * 平均每条指令的执行时间 * 周期时间。

这里你可能会想问,为什么是 平均每条指令的执行时间呢? 其实答案也在《编码》中,不同指令对应操作不同的硬件单元,不同的硬件单元对应的电路组成不一样,所以总的执行时间也不相同。类似的,电脑上打开文本文档和打开IDEA哪个快呢?

为什么要推算响应时间的公式呢?答案还是 计算 的重要指标:速度,也即缩短响应时间,加快执行。

所以我们看到计算机的主频相比之前变高不少,对应就是降低了周期时间,但也受着约束,这块内容请参加之前的文章。

而指令数的下降一方面是程序本身优化,另一方面是引入新硬件结构支持更复杂的指令。

最后 平均每条指令执行时间(CPI),对应如下方面:

  1. 流水线技术:单个CPU上采用多级流水线同时执行多条指令,使得CPI降低,增大吞吐量
  2. 并行技术:多个CPU同时执行多条指令,使得CPU降低,增大吞吐量
  3. 缓存技术:通过在内存和CPU之间加入多级缓存,降低CPI

关于计算抽象就说到这里。通过本文的分析,也就引出了下文的指令集,指令集是对CPU整体硬件的抽象,并且流水线技术是对指令执行重要的优化。

其他内容参见: 关于可计算、图灵机及CPU性能 ,与本文相互补充。

猜你喜欢

转载自blog.csdn.net/zhou307/article/details/114950959