编程必备的CPU知识基础篇(二)

天龙工具admin2024-10-13 7:03:04152A+A-

前言

上一篇文章通过人类计算场景讲解了CPU的整体结构,以及CPU的内存访问和程序执行原理。本文将从人们执行任务的场景中阅读指令来解释CPU的执行过程和内部结构组成,并总结一般的架构原理。

CPU是如何实现程序执行的?

程序在内存中的存储以及CPU的内存访问机制已经在前面实现了。接下来,CPU可以读取指令并执行它们。下面解释这个过程。

登记

CPU需要根据地址来访问指令。程序的第一条指令必须指定给CPU。如何指定呢?

首先我们来分析一下CPU的指令执行过程:CPU读取到第一条指令并执行后,需要继续按顺序执行下一条指令。 CPU 必须知道下一条指令的地址。根据第一条指令的地址和指令长度可以计算出下一条指令的地址,即“指令地址+指令长度=下一条指令的地址”。以此类推,依次进行即可。可见CPU需要记住要读取的指令的地址。另外,CPU读取内存数据时计算过程中产生的临时结果也需要保存。

问题:如何满足 CPU 的这些内存要求?

回到人们做题的场景,眼睛读到的字符、计算产生的中间结果、接下来要计算的步骤等等都会被暂时记忆在大脑中。可见CPU内部一定有一个内存组件,就是寄存器。登记就是暂存。它的存储速度一定要快,存储容量不能太大,否则会占用内存。

没错,寄存器的读写速度与CPU相同,其容量与CPU一次可以读取的数据量相匹配。例如,64位CPU的寄存器可以存储8个字节。寄存器的成本比内存贵得多。虽然也是由晶体管组成,但存储结构比内存更复杂,消耗的能量也更多。

CPU内部根据不同的存储用途有多种寄存器。例如:前面提到的存储代码地址的指令指针寄存器、存储计算和传输数据的通用寄存器、存储段地址的段寄存器等。有些寄存器是向开发者开放的“可编程寄存器”,也有用于CPU自己使用。

对于学习汇编语言来说,寄存器是学习的关键。这里我们可以简单的了解这些。

人员执行任务的要素

CPU执行一条指令就相当于完成了一项计算任务。当程序中的所有任务完成后,程序结束。在继续CPU的任务之前,我们先来看看我们自己是如何完成任务的。

假设您是团队领导,您的领导分配了一项任务。接到任务后,你自己肯定不会努力的。不要忘记你的团队。您需要将任务分解为可以分配给个人的子任务,然后确定每个任务的执行时间和执行人,从而形成任务执行计划。然后是计划的执行,将任务分配到人,跟踪执行过程并根据执行情况做出适当的调整。另外,为了保证任务按时完成,需要保证每个执行者按照计划约定的时间进行工作。最终,任务顺利完成,并将成果交给了领导。

从上述场景中我们可以得出哪些任务执行要素?

首先要有任务;那么,你就是任务负责人,负责任务的分解、分配、执行、跟踪、调整等管控工作。简而言之,就是任务控制;而且,每个子任务都会分配给一个人,这就是Task执行;另外,在任务执行过程中,您将跟踪任务的执行状态,并根据状态调整流程。同时,你还要保证执行者按照时间节奏工作,保证按时完成。这里的要素是状态和时间节奏。

经过上面的简单分析,我们得出了人执行任务的关键要素有三个:任务、任务控制、任务执行。任务控制还涉及执行状态和工作节奏。

如下图:

人员执行任务的要素

接下来,我们将根据这些要素来解释CPU的内部结构。注意,我们这里讨论的是CPU的一般结构或者概念模型。程序员了解CPU就足够了。至于CPU微架构的细节,需要查看详情。中央处理器产品。

控制器

对于CPU来说,一条指令就是一个工作任务,而程序就是任务的集合。 CPU根据指令指针寄存器中的地址读取指令并将其保存在内部指令寄存器中。

CPU内部可以有很多个零件,相当于一个团队。指令译码器接收到任务(即指令)后,负责将指令分解为各执行部件能够识别的、符合一定时序的操作信号序列,相当于形成任务执行计划。

操作控制器负责“任务执行计划”的执行,即根据操作信号序列的时序要求和组件之间的协作关系,及时向相应的执行组件发送信号进行配合完成指令任务,相当于根据状态和工作节奏控制执行。过程。

这样,指令寄存器、指令译码器和运算控制器就构成了CPU的控制单元,即控制器。这就是CPU内部的“任务控制”。

执行单位

控制器分解出来的“子任务”会被发送到相应的执行单元去“执行任务”。执行单元包括:负责读写内存的加载/存储单元、负责整数运算的ALU(算术逻辑单元)、负责浮点运算的FPU(浮点单元)、负责地址转换(如分段)的逻辑单元。组件、分页小部件)等等。

负责计算的执行单元在教科书中称为算术单元。下面简单介绍一下CPU算子的计算原理。

操作员

数字电路的基础是电子元件(如晶体管),主要有开和关两种状态,可以表示0和1。因此,计算机天然支持二进制。如前所述,晶体管可用于构建存储元件,进而形成寄存器和存储器等存储设备。还可以做什么?

事实上,二进制0/1除了表示数据、存储信息之外,还可以参与计算。这里我要讲的是布尔运算,包括AND、OR、NOT、XOR。例如:

1 and 1 = 1,1 and 0 = 0,0 and 1 = 0 ,0 and 0 = 0,and代表“与”运算

它是利用二级系统的布尔运算能力,使用一些二极管、晶体管等电子元件构成数字电路中最基本的逻辑单元——门电路。最基本的门电路有:与门、或门、非门、异或门,对应的是布尔运算逻辑。

有了门,可以进行逻辑运算,但是算术运算(例如加法和减法)呢?

	看个题目:计算二进制0111 + 1110 =?

二进制加法规则:按位计算,每一位需要两次加法:一次加法计算当前两位数,结果加一个进位。这样,每一位计算需要两步:先计算“和”,然后加上“进位”。

二进制“和”计算,如:

1+1=0,1+0=1,0+1=1,0+0=0,正好符合“异或(xor)”计算规则。

“进位”计算,如:

1+1->1,1+0->0,0+1->0,0+0->0,正好符“与(and)”计算规则。

可见,加法可以利用逻辑运算来计算,因此利用门电路分别组合计算“进位”和“和”,实现一位二进制计算。这是一位全加器。加法器由多个一位全加器级联而成。例如:8个一位全加器级联组成8位加法器,可以进行字节加法计算。计算机使用“补码”来表示数据,减法也可以使用加法来计算。因此,如果你有加法器,你可以计算减法,然后你可以计算乘法和除法。

与加法器类似,将多个逻辑门组合起来实现某种逻辑功能的数字电路称为组合电路。组合电路可以组成一个负责各种计算的运算单元,即算术单元。例如,加法器是ALU的核心部分。

好了,这里简单介绍一下运算单元的计算原理,方便大家理解。

指令周期

至此,我们已经讲解了CPU的基本结构,如下图:

CPU基本结构

万事俱备,只欠东风。如何使上述CPU结构发挥作用呢?

现实生活中,我们按照时钟来安排工作,形成节奏。例如:早上6点起床,早上8点30分到达公司,早上9点开早会……CPU的各个部件有序工作需要什么条件呢?

1. 时钟周期

与我们不同的是,CPU 的各个组件都有单一的工作。只要有力量,他们就会一直工作,不需要休息。当每个组件完成其工作时,也需要将其划分为多个工作步骤。每个步骤都需要一定的时间,并且步骤之间有顺序。组件如何安排它们的工作?

这就涉及到工作节奏,比如著名的“番茄工作法”。将每个工作周期设置为25分钟,这是一个番茄钟周期,然后休息5分钟,然后开始另一个番茄钟周期。四个番茄周期为一组。再休息 15 至 30 分钟。重复这个过程就会形成工作节奏。

编程必备的CPU知识基础篇(二)

同样的道理,CPU的各部件在工作时也需要一个工作周期。循环内安排了许多可以完成的工作步骤。完成后,不休息地开始下一个工作循环,继续工作。这种重复就形成了CPU的工作节奏。

可见,如果有工作周期,我们就能实现有节奏的工作,CPU就必须有“时钟”。集成电路中最常用的时钟电路是石英晶体振荡器(简称晶振),通常集成在主板芯片中。晶振可以以固定的时间间隔向CPU提供连续的脉冲信号。这个时间间隔就是CPU的时钟周期,以纳秒为单位。

CPU在脉冲信号的驱动下工作,正所谓“闻鸡起舞”。每个时钟周期可以接受2个信号,即“上升沿和下降沿”。上升沿是上电时刻,电压从低电压变为高电压的时刻,下降沿的相反是断电时刻。数字电路在边沿信号驱动下工作。

CPU每秒的时钟周期数就是CPU的时钟频率,也就是主频。需要注意的是,由于现代CPU的工作频率远高于主板,主板上的晶振提供的时钟周期对于CPU来说太长,因此采用“倍频”技术将其转换为时钟周期。主板频率转化为CPU的工作频率。因此,人们常说“CPU主频=外频(即主板频率)*倍频”。

2.指令周期

有了时钟周期,CPU的各个部件就可以在其驱动下工作。执行一条指令的工作时间称为指令周期,以时钟周期为单位。我们从时钟周期的角度简单描述一下CPU的指令周期。

总线周期:CPU在执行指令之前,需要从内存中读取指令。指令执行过程中,还需要从内存中读写数据。无论读还是写都需要访问总线一次,所需的时间都是一个总线周期,以时钟周期为单位。一个指令周期将由多个总线周期组成。

一个总线周期至少需要4个时钟周期(T1、T2、T3、T4)。以读周期为例,简单说明如下:

 T1:CPU把要读取的存储单元地址放到地址总线上;
 T2:CPU通过控制总线向内存发送读取信号
 T3:存储器将数据发送到数据总线
 T4:将数据从数据总线读入CPU

需要注意的是,如果在T3内存向总线发送数据失败,那么CPU会在T3之后等待一个时钟周期加法器有记忆功能,如果数据没有准备好则再等待另一个时钟周期,直到数据准备好后才进入T4 。可见,如果内存速度太慢,无论CPU工作得有多快,也只能等待。可见,单纯追求高CPU主频并不能提升性能。

以下是CPU指令周期的主要阶段。你可以这么理解:

指令周期阶段

取指令阶段:根据指令长度和总线宽度,在一个或多个总线周期内取指令。

翻译阶段:一个时钟周期内完成指令译码

执行阶段:由相应的计算单元根据指令功能进行计算,其中整数加减=1T(T代表时钟周期);整数乘法和除法 >= 3T;浮点加法和乘法 ∈ [3T, 5T];浮点除法 ∈ [3T,15T]

内存访问阶段:如果指令操作数在内存中,则需要几个总线周期才能从内存加载数据。

回写阶段:如果需要将运算结果保存到内存中,则需要总线周期来写入数据。

(注:本文暂时不解释指令流水线的原理)

指令集

1、为什么要使用命令来操作计算机?

CPU作为计算核心设备应该如何使用?

当然是通过指令,但人们操作计算机最早的“手势”不是指令而是按钮。

这很容易理解。比如说我们现在使用的各种APP不都是基于按钮操作的,或者是鼠标点击或者触摸屏点击的。

基于按钮的APP操作很方便,但操作最底层的计算核心就惨了。最大的问题可能是缺乏灵活性。比如要扩展一种计算或者控制,就得在机器的物理结构上加一个按钮,太麻烦了。如果要实现更复杂的算法,操作者不可避免地会猛烈地按下按钮。跑完程序后,你会大汗淋漓,手也会很累。如果代码有bug或者长时间工作按错按钮,就会崩溃!

计算机设计的目的是能够处理所有可计算的问题,这就需要能够操作计算机来实现任何各种复杂程度的可计算算法。这将涉及无数的计算操作组合(想想前面提到的三种基本控制结构的任意组合),所以这永远不能用按钮来表达。

在人类所能掌握的表达信息的方式中,语言是最灵活的。自然语言和数学语言可以在各自的领域任意表达。语言是由符号组成的。只要设计出符号来描述任何算法的逻辑,就可以表达任何算法。这种类型的语言是图灵完备的。

图灵完备性可以简单理解为能够存储和访问数据,支持程序控制结构(支持至少3种基本结构及其嵌套组合),支持各种数据操作(算术、比较、逻辑等)。当然,前面我们也讨论过,任何数据结构和算法都可以通过控制CPU对内存的访问来实现。

可见,操作计算机最完美的“姿势”就是使用满足图灵完备性的指令。

2. 指令和指令集

计算机指令由操作码和操作数组成,其中操作码指定指令功能,操作数是指令处理的数据。喜欢:

ADD dest,source 等价于dest=dest+source

其中,ADD是代表加法的操作码,dest是“加数”和“加数”,“和”存放在dest中。

计算机只能表示二进制,因此需要对指令进行二进制编码,即指令编码。指令编码对操作码和操作数采用二进制编码,然后按照一定的语法规则进行组织。操作码必须是唯一的,以便CPU能够识别指令的功能、长度、操作数等信息,保证其正确执行。

指令的二进制形式就是机器语言,但是人类编写二进制指令太费力了,所以后来出现了接近人类语言词汇的指令助记符,形成了汇编语言。程序是用汇编语言编写的,然后由编译器翻译成机器指令,然后才能运行。如今的高级语言也必须经过汇编才能在机器上运行。

操作CPU的指令的集合就是指令集。 “世界上本没有路,但走的人多了,它就成了路。”计算机指令自诞生以来不断增多和扩展,逐渐形成两大指令系统,代表不同的设计思想:

CISC 代表“复杂指令集计算机”。为了获得更高的执行性能,常用软件实现的功能都用硬件指令来实现,指令集开始变得庞大。 Intel x86系列一直朝着这个方向发展,增加新指令来兼容旧指令,指令集也越来越大。然而,每种指令类型都需要额外的电路元件。指令集越大,处理器就越复杂,执行速度也会越慢(因为结构复杂的指令执行涉及的环节较多),而且很多高级指令并不常用。 RISC提出后,就称为CISC。

RISC代表“精简指令集计算机”,它简化了指令功能,把复杂的功能留给程序,但会增加程序使用的指令数量。由于命令功能单一,相当于把一个大任务拆成了一堆小任务。可以安排更多的人去做,速度也会提高。因此,可以通过提高指令并行性和提供更多寄存器(减少内存访问)来提高计算性能。这就是RISC指令系统。

使用CISC的程序简单,但处理器结构复杂。使用RISC的程序很复杂,但处理器结构很简单。两者各有优缺点,后来融合了:在RISC机的发展中,引入了更多的指令来封装硬件细节,为程序提供形式简单、功能复杂的指令。它们不再是“精简的”。 CISC机器可以动态地将CISC指令翻译成类似RISC的操作序列(即具有单一功能的微指令),然后通过提高指令并行性来加快执行速度。

如今,x86 完全主导了桌面、便携式和服务器计算。 RISC在高性能服务器和嵌入式处理器市场表现更好。 ARM、Power、MIPS是RISC指令集,x86是CISC指令集。

架构回顾

1. 基于计算机的信息处理的要素

本文从人类计算场景出发,讲解CPU的计算核心结构和内存访问机制。

在计算核心的架构中,暴露了两种类型的电路,一种是由存储单元组成的存储,另一种是由逻辑门组成的计算。计算和存储分离,如:运算符和寄存器、运算符和内存。如果两者之间需要传输数据,就需要有数据通道,比如运算器和寄存器之间的内部总线,运算器和存储器之间的系统总线。同时需要对存储、传输、计算进行控制,实现数据处理。

这就构成了计算机信息处理的五个要素:数据、计算、存储、通道、控制。如下图:

计算机实现的5个要素

在以后的文章中,我们将使用这 5 个要素来理解计算机体系结构。这里大家可以先有个印象。

2.任务模型的三要素

本文通过人处理任务的场景来讲解CPU执行指令任务的内部结构。任务处理模型具有三个基本要素:任务、任务控制和任务执行。将计算机系统视为任务模型对于理解计算机系统的功能逻辑非常有帮助。

3、操作信息处理系统的正确“姿势”

作为可以实现任何算法的计算设备,计算核心提供了最灵活的使用方式,即满足图灵完备的指令集。这是给我们的一个启示。信息系统会根据支持的操作逻辑的复杂程度提供不同的使用方式。

对于可用性高的系统来说,方便的UI是最好的操作方式。随着运算逻辑变得更加复杂,逐渐接近图灵完备性。这在信息系统中很常见。例如,数据库提供了类似SQL的语言,该语言已经非常灵活,但仍然提供存储过程来处理更复杂的逻辑。了解这一点,可以让大家更容易理解不同信息系统使用方式的差异。

点击这里复制本文地址 以上内容由bbmw采集呈现,若本文有侵犯到您的版权,请联系我们告知删除,谢谢!

支持Ctrl+Enter提交

©2013-2023 bbwm.cn 赣ICP备2022006624号