·中央处理器这个大小不管学没学过计算机,都会念叨两句CPU什么的。这是科幻电影还是科幻书籍宣传得好还是其他什么的我们暂且不说,反正可以从这个现象了解到,哪怕是外行人都清楚CPU的重要性,我们恐怕没有理由说不好好学这个章节。
目录
CPU的功能与基本结构
这里是浅谈一下的,可能大家看来不是很全面。
CPU功能
指令控制
很显然,CPU免不了对指令做出一些操作,比如说取指令、分析指令、执行指令等。
操作控制
一个指令其实也是由多个操作信号来指示完成的,所以为了完成指令,CPU也必须能够对操作信号进行控制。
时间控制
操作信号是一定要有顺序的否则就乱了套了,关于这一点也就必须要求对操作信号加以时间上的控制。
数据加工
除了对系统有所控制,CPU本身还要具备一些数据处理的能力:算数与逻辑运算。
中断处理
系统运行实际上也不可能一点错误不出现,作为整个计算机的跑腿人,CPU自然也需要有对异常的处理机制。
运算器与控制器的功能
上面提到的那几个功能是由运算器与控制器完成的,因为CPU就是由这两个部分组成的。运算器是主要负责数据加工,控制器则是协调并控制计算机各部件执行程序的执行序列(取指令、分析指令、执行指令)。

CPU的结构
运算器的结构
第一个要说的是算术逻辑单元,主要功能是用于算术逻辑运算。根据操作信号对两个操作对象(A、B)进行算术逻辑运算并输出,本身不能存储这些。
第二个要说的是通用寄存器,主要功能是存放操作数和各种地址信息。上图当中,左边是通用寄存器,我写的第四章的笔记里面就是用这个例子,右边那个也是通用寄存器,只不过右边的是下面这个这段文字描述截图里面提及的寄存器的划分版,划分标准就是高位和低位。
接下来的内容是把刚刚提及的两个部件联系起来:
这种的连接方式是一个寄存器通两条线路与ALU,叫做专用数据数据通路方式。
这个方法又要小心的地方:
有没有一种熟悉的感觉?没错,这个和字扩展、位扩展那一块知识是很类似的问题,具体的解决也是很像译码器:
另外一种解决办法在我看来其实是一个意思,但是王道说是另一种方法,那我们还是来看一下:
既然CPU内部可以按照上面的方法各自接一条自己的专线,那么他们可以一起接一条“总线”吗?答案是可以的:
CPU内部单总线方式:将所有的寄存器的输入端和输出端都连接在一条公共通路上。
先解释一下上图,信息量是很大的:
①总线上一次是只允许一对进行交流的,这个和计算机网络的信道是差不多的。比如说R0和R1可以进行交流,但是同时R2与R3就不能交流。并且这些通用寄存器的交流实际上受到信号的控制(类似
与
这样的)
②总线与CPU连接,但是一旦传输数据A、B端会同时收到,这样就会傻傻分不清。所以啊,设置一个暂存寄存器就可以了。举个例子:R0先传输数据,暂存寄存器和B都记下了,然后R1再次发出数据B端的内容被覆盖,此时A端接收暂存寄存器的内容。
③暂存寄存器还有一个用处是当CPU要同时处理来自主存和通用寄存器的数据时,可以对他们加以区分并保护通用寄存器的数据内容:主存内容先传输,放到暂时寄存器内(如果没有这个元件,那么就可能存到通用寄存器里面,会覆盖原内容),然后通用寄存器的内容传输到B端,之后到ALU里面进行运算,最后的结果存入通用寄存器。(这是对上图中红字的流程解释)
④同样,输出也考虑一个暂存寄存器,当计算结果确定之后并且总线上之前的传输信号都结束了再去传输。
①ALU输出端的暂存寄存器是可以添加移位功能做成移位寄存器的。
②ACC也是一种有特殊功能的通用寄存器。
控制器的结构
注意,数值总线和地址总线都是外部的。
去除文字描述性的总结构图:
对应的模块是这样的:
指令周期的数据流
指令周期
①指令周期:CPU从主存中取出一条指令并执行指令所花费的全部时间
②指令周期常常用若干个机器周期来表示,机器周期又叫CPU周期
一个机器周期又包含若干个时钟周期(也称节拍或者T周期,是CPU运行的最基础时间单位,详细概念见操作系统)
其实因为不同指令的任务不同,所以费时不一样,所以机器周期数和节拍数也会不一致:
指令周期流程
触发器是对过程状态的一种监测。
取址周期
CU的+1是虚指,因为可能会是跳跃,所以要结合实际题目看。
间址周期
标题算是一个缩写的形式,实际上是间接地址寻址的周期。
上图是以一次间址为例的。
IR里面放的是形式地址。
如果是多次间址,那么就是循环将IR里面(MDR也可以存到IR里面也可以不存,不存的话就用MDR去迭代)的地址去找直到有效位置出现。
执行周期
下一小节细说。
中断周期
其中围绕的关键是保存断点!
指令执行方案
前者的方案电路设计简单,但是效率不行,后者效率不错但是硬件难做。
数据通路
基本概念:
①数据通路:数据在功能部件之间传送的路径,功能是实现CPU内部的运算器与寄存器或寄存器之间的数据交换。
②数据通路部件:路径上的部件,如ALU、通用寄存器、异常和中断处理逻辑等
③执行/功能部件:数据通路中专门用于数据运算的部件
④控制部件:根据每条指令的不同生成对数据通路的控制信号,并正确控制指令的执行流程。
⑤内部总线:同一个部件内的交流线路,如CPU内的。
⑥系统总线:同一台计算机系统的各部件的连接,如CPU、内存、各类I/O接口相互连接的总线。
CPU内部单总线方式
将所有寄存器的输入端和输出端都连接到一条公共通路上,这种结构比较简单,但是数据传输存在较多的冲突现象->性能比较低。
当连接各部件的总线只有一条时,称为单总线结构,与之对应的就是如果有多条线路,那么就是多总线结构。
来描述一下上图的过程:
寄存器之间的数据传输
①一开始,数据在PC当中,然后将PC的内容也就是(PC)表示的含义,放到导线Bus上。这一步的实现是依据
信号有效而来的。一旦成功实现,那么总线上就会充满PC的内容。
②第二步相对简单,是总线上的内容要放到MAR里面。这需要信号
有效。
接下的是主存与CPU之间的数据传输
①因为看上一个的例子,我们会发现这样的一个现象,当
与
同时有效的时候,其实是不冲突的,数据可以很流畅的从PC流到MAR。所以可以合并。
②下一个步骤是在地址准备好之后通知主存将数据传到MDR中去,但是此时的总线被第一步还占用着,所以要先撤销第一步提到的两个控制信号(不会影响,因为第一步的数据已经传输好了),这个通知的过程是CU做的。
③主存收到命令以后会自觉地把数据传输到MDR,这个时候MDR要接收数据,所以信号
有效(注意这个信号不是图中那个与内部总线的信号,而是与外部总线交流的信号,图中没画出,我们这里为了方便也用了统一的名称,请不要误会)。
④最后的步骤是要求将MDR的数据传输到IR里面,这是寄存器之间的数据传输,图中的应该写为(MDR)才更标准。这一步的操作信号是要求
与
有效。
下面这个是执行算数或者逻辑运算的过程:
首先我们基础的假设是这是一次加法指令,并且前面的步骤因为和上面两个传输一致,所以我们直接沿用。两个操作数一个在ACC里面,一个在主存里面过程(
就和刚刚从主存取到IR的里面过程一样)。①一个比较尴尬的事实就是IR一般是没有
这个信号的,所以只能巧妙地利用上一步IR的数据来源是MDR这个特性,把本应该IR给出的东西由MDR来给出。所以这就是为什么要是
信号的原因,MAR的信号就毋庸置疑了,毕竟第一步是目的就是确定地址。
②CU给出信号,通知主存传输数据。不过在此之前第一步要先把占用的线路释放。
③主存将数据通过外部数据线传给MDR,需要一个
有效信号
④既然现在两个数据准备就绪(ACC里面的默认就绪),就需要放到ALU里面进行运算。然后根据上一节的内容,我们知道ALU前面要有一个暂存器,这样两个端口才可以分得清。上一步因为MDR的操作数最新,所以可以直接通过内部总线传输到暂存器Y里面。需要的信号是
和
有效。
⑤这一步是看不到Bus的,因为从ACC里面传到ALU之后就直接运算出结果了,所以不用考虑Bus了。然后运算结果也不是立刻传出,而是寄存于暂存器Z里面。
⑥Z里面的数据最终还是要存到ACC里面的,毕竟这是最终目的。
最后提及一下,这个里面CU没有写传输信号的过程,这不是没有,只是因为这个点比较小,不严格的时候就忽略了,王道视频也是为了方便我们理解。
下面是王道给的例题:
取址周期的答案:
间址周期的答案:
执行周期的答案:
专用数据通路
上图中C4那一行之所以是灰色是因为这个是自动的译码的信号,一般是不会要求我们写的,这个地方是因为画出来了所以保险起见,给大家写一下
接下来看一道例题来加深理解:
答案:
(2)
PC->MAR
M(MAR)->MDR
(MDR)->IR
(3)
取
M(MAR)->MDR
(MDR)->ALU->ACC
存
(ACC)->MDR
(MDR)->M(MAR)
(4)
X->MAR
M(MAR)->MDR
(MDR)->ALU->ACC
(5)
Y->MAR
M(MAR)->MDR
(ACC)->ALU,(MDR)->ALU
ALU->ACC
(6)
Z->MAR
(ACC)->MDR
(MDR)->M(MAR)
控制器
硬布线

控制器的主要功能:
①从主存当中取出一条指令,并指出下一条指令在主存中的位置。
②对指令进行测试或译码,产生相应的操作控制信号,以便启动规定的动作
③指挥并控制CPU、主存、I/O设备之间的数据交流
控制器作为一个工作的元件,也是有输入输出的:
硬布线控制器的设计步骤:
①分析每个阶段的微操作序列
②选择CPU的控制方式
③安排微操作时序
④电路设计
CPU的控制方式
安排微操作时序
有三个原则!(我学得有点累,不想打那么多字,就直接截图放下面)
下面是用取指周期举一个例子:
(1)(2)因为没什么相关性,所以都放在同一个时间段里面运行;
(3)(6)都需要在(1)完成之后才能运行,全部尽可能贴着(1),而且两者也是被控对象不一样
(4)(5)按照一般原则是不应该分在一起的,顺序上应该分开,但是这两个都耗时很短,所以按照原则三就放一起了
微程序
必须说明的一些易混淆的概念
指令=微程序
微程序由多个微指令组成
微指令由多个微命令组成
微命令是微操作的控制信号
微操作是微命令的执行过程
我对于这两者的认知就是:
硬布线是“因地制宜”,根据输入内容和现有的元件现场构建微操作控制信号;
微程序就是预判了所有的可能性,提前给你准备好这些操作控制信号,用的时候直接调用。
举个非计算机的例子:喜欢吃不同馅的水饺,硬布线就是想吃的时候依据口味和菜场的供给来现场包,微程序就是冰箱里存好了各种水饺。
小总结一下硬布线和微程序的区别:
基本思想
上图中的微指令n就是一个互斥性微命令组成的微指令,因为互斥,所以一条指令里面只有一个1,表示只有一个微命令 。
微指令的基本格式当中之所以还要有顺序控制是因为要实现自动化,做完一个微命令还要接着做下一个微命令。
微程序控制器的基本结构
·CMAR的作用就是帮助我们定位到本条指令在CM当中的位置。
·地址译码就是一个普通的译码器,和外部的那些都是一样的。
·CMDR的作用就是存储按照CMAR指示从CM当中取出的微指令 。
·外部的操作码字段(OP)传进来到微地址形成部件会产生初始微地址,由这个初始微地址就可以定位到这条机器指令所需要的微程序,把这个微程序按照顺序执行就可以完成这道机器指令。
·为了保障上一条说的内容执行还必须保障是顺序执行的,所以要有一个顺序逻辑。并且为了区分微地址是初始微地址还是程序运行过程中不断产生的微地址,就需要有标志和时钟来辅助确定。这个标志是来自运算器的程序状态字的一个标志(最知名的例子就是转移标志)。
控制存储器CM
·上图的CM结构中,每一行靠后的小方格都是指向下一个地址的,空的则需要顺序逻辑来调控。
·而其他的一些操作,最后一个方格所指示的都是M,也就是取指周期的开始。目的是为了可以进入下一个指令。
微指令格式
微指令的编码方式
下面举一个例题:
微指令的形成方式
前两种理解,后面的四种了解就行,不重要。
下面重点举一个例子说一下断定方式:
到最后了,就总结一下一些知识点,这时候看来一定能理解不少,放最开始可能还没太理解吧。
地址/指令寄存器在CPU内部却在CU外部;
指令流水线的概念及性能指标
流水线的定义
上图的缺点表明了我们要流水线的原因:节约时间!
(计算机不断迭代优化的重要原因之一就是用空间换时间的思想)
优化的思想是什么呢?就是在不影响顺序和功能实现的情况下,尽可能的利用设备,最好是并行运行。
所以这个思想在上图的具体应用就是:
“2”:取指和执行是前者用PC、MAR、MDR,后者用运算器,所以设备上不冲突,就能并行
“3”:与"2"的区别就是提高重叠度
上图都是把一条指令拆成了三个的,实际上因为计算机的不同,可能会拆成4、5个都有可能。
为了清晰了解过程,往往要用合适的图表来表示,上图的两种应该不用我解释,很容易看懂的吧。
性能指标
三个方面:
①吞吐量
②加速比
③
这个和计网的内容很相似,彼此对应理解一下即可。
值得记住的是:k是宽度!比如图中的例子有4行,所以k=4。
影响流水线的因素及分类
机器周期的设置
关于缓冲我还要补充: 结合之前的时空图,我们得到这样的一个观点——某一个时段t,应该会有多个工作同时进行,而若有些工作先完成,完成之后就将数据流入下一个部件,那么下一个部件此时若未完成,则会发生数据冲突。这样是不好的,所以为了调节,设置缓冲的意义就在此,做到统一步伐。
影响流水线的因素
结构相关
第一种办法是时间换空间;
第二种办法是空间换时间:把指令存储和数据存储分开。
数据相关
上面的问题就是数据顺序问题,现在需要r1但是它还没好。
具体的解决方案有3种:
①时间换空间:“等着”
注:哪怕是等也有两种等的方法——硬件和软件的方法
这个是靠硬件来阻断
软件靠写空指令来实现的(什么都不干,空转)
②数据旁路技术:
就是不等存进去,抢着把已经运算好的数据拿到
(不等服务员上菜,直接在灶前等着)
③编译优化:就是按照逻辑,把需要r1的先往后挪,把不需要的往前挪,这样就能利用那个空等的时间。
来个例题看一下:
细致解说一下:
①IF是取指,而且指令存储和数据存储是分开的,这是一个基本概念,记住!
②题目里面说的“按序发射”就是不允许编译优化,“没有采用转发技术”就是指没有数据旁路技术。
③I3的ID所需要的数据是R1与R2,这两个一个是在时间5、一个是在时间6才能得出,所以只能阻塞
④I4的阻塞也是因为数据要等待。
数据冲突还有一种类型是关于读写的:
上面的读法是RAW(写后读,A是After,而且这些是从后往前念的),WAR(读后写),WAW(写后写);
之所以没有读后读的冲突是因为读是不改变内容的。
控制相关
比如出现这样的情况:
判断条件决定是否要跳跃,如果默认不跳转,就顺序执行,那么上图粉色的区域就是有用的,但是默认的情况下却判断之后却要跳跃了,那么粉色的区域就是白忙活了。
反之,如果默认是跳跃,但是判断之后却是要求顺序,那么就是该做的没做了。
解决办法就是:
①尽早判断,减少损失(虽然我觉得这句话很废话)②顺序和跳跃都做,用哪个就选哪个(这个也很废话,因为这很费资源)
③增加往前的通路,还是提早预知
④按照统计学规律,得出各种可能性,按照概率预取指令(这个是最好的)
流水线的分类
流水线的多发技术
图中执行就是灰色的部分
·一个时钟周期内多个指令一起运行,对应的也要有多个部件来承接这些功能
·并且执行顺序是不能改变的,哪怕是不能做到并行,也要保证顺序。
上图的蓝色线就是把时钟周期1给切分成了3段