目录
五、第五章——中央处理器
1、CPU的功能和基本结构
(1)运算器内部结构
(2)控制器的基本结构
(3)CPU的四大部分
2、指令执行过程(数据流向 & 执行方案)
(1)时钟周期(机器周期 & 指令周期)
(2)指令流程
(3)取值周期 & 间址周期 & 中断周期
(4)指令执行方案(单个、多个、流水线)
(5)总结
3、数据流通——单总线结构 ※※※
(1)单总线——实战(例题)
(2)总结
4、数据流通——专用通路 ※※※
5、硬布线控制器的设计(超级多)——纯硬件
(1)CU——线的梳理
(2)设计控制器(4个步骤)
(2.1)分析各个阶段的微操作
(2.3)安排微操作时序(对应节拍执行的操作)
(2.4)电路设计
(3)总结
6、微程序控制(microprogram & microprocessor)
(1)概念梳理——指令、微程序、微指令、微操作(层层封装)
(2)指令如何从CU里面解析为 微指令 的
(3)存放的微指令(n个机器指令——对应n+1条微程序)
(4)总结
6、微指令——设计(微程序的微指令)
(1)微指令格式——水平、垂直、混合(水平+垂直)
(1.1)水平型
(2)地址的形成方式(怎么找下一个地址)
(3)练习题——计算下地址字段
(4)总结
7、微程序控制单元——设计
(1)设计步骤——4步
(2)微程序设计分类(更深一层的套娃)
(3)微程序 VS 硬布线
(4)总结
8、指令流水线(指令执行优化)
(1)顺序执行 & 流水执行
(2)流水线的表示方法(执行过程图 & 时空图)
(3)流水线的性能指标(吞吐量、加速比、效率)
(1)总结
9、指令流水线的影响因素
(1)MIPS架构(五段流水-五级流水线)
(2)影响因素(3点)结构 数据 控制
(2.1)结构 (资源抢占)
(2.2)数据
(2.3)控制(条件跳转问题)
(3)总结
9、指令流水线的分类
(1)粒度(部件功能、部件、车间) & 功能(多、单)
(2)【静态 & 动态】 & 【线性 & 非线性】
(3)多发技术(多路并发)
(3.1)超标量技术(空间复用)
(3.2)超流水技术
(3.3)超长指令字(当他发现可以并行执行,他就自动组合变成超长的指令)
(4)总结
10、五段花式流水(五级流水线)
(1)考试要考各种指令在流水线中的执行操作
(1.1)运算类指令——加法 ADD
(1.2)LOAD(load)指令
(1.3)STORE(存储指令)
(1.4)beq & bne ——有条件跳转指令
(1.5)JUMP——无条件跳转指令
(1.6)习题
11、多处理器
(1)多处理器的基本概念
(1.1)SISD(单指令流-单数据流)
(1.2)SIMD(单指令——多数据流)
(1.3)MISD(不存在-多指令-单数据流)
(1.4)MIMD(多指令-多数据流)
(2)向量处理器 & 向量数据库(存储器)
(3)多核处理器(一个CPU——多个处理器)
12、硬件多线程
- ALU(Arithmetic Logical Unit逻辑运算单元)
- 寄存器
- CU(控制单元)
- 中断系统
CPU的时钟周期是指CPU在执行一个基本操作所需的时间。它通常以纳秒(ns)为单位表示,也可以用赫兹(Hz)来表示。
时钟周期的长度取决于CPU的设计和制造工艺。对于不同型号的CPU,时钟周期的长度可能会有所不同。一般来说,现代计算机的CPU时钟周期在几个纳秒到几十纳秒之间。
不同的CPU架构、不同的制造工艺以及不同的速度等因素都会影响时钟周期的长度。
执行周期——根据硬件设计来——千差万别!!!
没有最好的,只有最合适的!!!
单个指令周期:(所有指令执行的周期是相同的!)
缺点:但对于简单的指令,早早执行完后,就会空转!(浪费时间!)——速度慢!!(串行的)
优点:硬件设计——制作简单
多个指令周期:(不同的指令有不同的时钟周期!)
优点:周期不同,灵活,执行速度快(但还是串行的)
缺点:但设计就很复杂!
设计结构多种多样!还是那句话,没有最好的,只有最合适滴!!!
这里只对单总线的数据流通进行说明。
明白了其中的数据是怎么一步一步由CU控制,从总线流动的过程后,
对于其他通路(多总线)——也是一样的道理!具体就看自己的硬件设计啦!
学完后,一个冲动——自己去设计一个CPU的数据通路!嘻嘻(逐渐胡言乱语~)
取指令周期
间址周期(将间接地址进行转换——并送到目的地)
执行周期
前期工作完成——指对应的数据都准备好了,要转换的数据都转换了
根据操作数,执行对应的操作
明白各个指令周期该干的事情!
首先分析指令——明白该指令存在哪些操作,具有哪些周期!
然后细化到每个周期,该干什么事情!(最后一步一步写,就可以啦~)
思路和【单总线】一样!
专用通路——就是在CPU中的各个部件的通信——由CU单独控制
缺点:不占用总线,这样硬件设计更加复杂!成本更高!
优点:速度快!!!
有一种说法,虽然他慢,但是他快呀!(滑稽.jpg)
虽然他慢(运行速度),但是他快(开发速度)呀!
指令牌套娃:一个指令——对应四个周期——周期里面对应着节拍数来执行微操作
(每一个节拍,可以执行若干个微操作)
具体情况,就看我们的设计啦——经典层层封装!(操作+节拍+周期 = 指令)
一个CU——全身上下都是线(斩不断,理还乱!)——其实还好啦~
- 顶部的一排线——操作码译码器——来接收指令
- 左边的一排线——节拍发生器——来控制每个周期里执行的节拍数(流水线必备,这样才知道执行到周期中哪一个环节了)
- 右边的一排线——4个触发器(对应了4个指令周期)——并且再加上每个执行单元完成的flag(许多标志位)
- 下边的一排线——控制对应的微操作(微命令)——发出执行指令,通过右边的flag来判断是否执行完成(毕竟,电路可不是全双工的)
GPT也夸我唉
第二步——选用的是定长机器周期(这里就不纠结啦~)
本质——找到哪些指令,在哪些阶段中有使用!
组合逻辑电路设计(列出操作时间表:如下)
并且不止这个,要逐个分析——取址——间址——执行(3个周期中)
对应的节拍(T0、T1、T2)里面的微操作!!!
第一步:列出操作时间表(对应三个周期)
第二步:针对微操作——写出表达式
比如这个从内存中取数据的操作——从三个表中得到结果——写出逻辑表达式
第三步:画出逻辑图
根据逻辑图——我们就可以得出——对应微操作的命令信号(简称微命令)
硬布线太复杂!!!——适用于 精简指令集!!!——毕竟指令少!
对于复杂指令集——指令可能有100多条,太多——硬布线太复杂!!!
优点:速度快
缺点:扩充指令,设计改进困难(复杂),不适用太多的指令集系统
软件思想——封装!!!(无线套娃!一层麻烦,那我就再加一层!)
既然微操作这么多,那么我就用微程序段来封装这些微操作!
比如说——对于【取值周期】那一套微操作——我就封装一个微程序段
微程序段——加起来——就是一个微程序——对应一个机器指令!
即——n个机器指令——对应n条微程序
微命令 = 微操作
指令——翻译为【微程序】——顺序逻辑处理(支持中断等)——传输微程序
微程序存储【CMAR】——翻译【对应的地址】——找出对应【微指令】——执行
并根据他的下地址——找下一个【微指令】(循环往复!)
为什么是n+1条?
因为n个机器指令,是不是执行的东西各部相同?那么必然有n条!
还有一条是哪里来的呢?是因为指令需要共用一个【取值周期的 微程序】!
那么,为什么没有间址、中断的周期 微程序呢?
因为在那个时代,还没有这些,不用考虑了!(可以说这个教程已经落伍了)
不过思想一直都是这个思想,理解就行啦~
- 直接编码
- 字段直接编码
套娃——加译码器——减少位数
为什么微程序比硬布线慢呢?
为什么x86架构(AMD和Intel)要比arm架构慢呢?
因为x86采用的是微程序——微指令——精简指令集
Arm采用的是硬布线——指令——节拍+微操作——复杂指令集
①(分析操作——②微操作封装——微指令封装【③格式+④编码】)
这个动态修改挺好的(测试+修改——如果是硬布线,得重新再造)
传统的冯洛伊曼机——串行(顺序)执行
优点:结构简单
缺点:速度慢
顺序 & 重叠执行(这里可以细分多个阶段)
吞吐量——吞吐率
加速比(原时间 / 加速时间)
效率
周期统一的方式——添加锁存器——以此来控制进度
设计师们要针对这些问题(冲突),专门进行优化和调整
真是令人头秃!!!老老实实用顺序的,就不会有这些问题了!(doge.jpg)
互斥——指令之间的问题(抢占同一个资源)
同步——数据之间的问题(同时要读 or 写 数据)
还是那句话,只要设计多个操作,那么就必然存在互斥、同步等操作!
需要我们去优化!
其实这些的诞生,是由于前面的流水线优化,而来的
运算器里面的三大东西——IMM(立即数)、A、B
注意——写回寄存器是在WB 阶段
一般情况下,也就load和store才访存!(在RISC中)
多个输入+一个处理(想想都离谱)
为什么要知道?(向量处理器)
就是让我们明白:专业的东西,就得专业的人和物去做!
所以——不要局限于当下!!!(如果这个东西,我们用着不方便!那么咬咬牙,自己做一个!)
这很正常——但是:一旦设计共享,并发——那么就存在“锁的问题”
这就不赘述啦~
用硬件——实现多线程
多线程是一种通过在同一进程中同时执行多个线程来提高程序性能和资源利用率的方式。使用硬件来实现多线程有以下好处和坏处:
好处:
- 并发性:通过多线程,可以使程序并发执行,充分利用多核处理器的计算能力,提高程序的执行效率和响应速度。
- 资源共享:多线程可以共享同一进程的地址空间和资源,避免了进程间的昂贵的上下文切换和数据复制操作,加快了数据共享和通信的速度。
- 任务分解:将程序分解成多个较小的线程,可以更容易地管理和调度任务,实现更细粒度的并行计算,提高系统的吞吐量和响应性。
- 负载平衡:多线程可以根据系统的负载情况自动调整任务的分配,使得不同的线程可以充分利用系统资源,达到负载均衡的效果。
坏处:
- 线程竞争:多个线程访问共享数据时可能会发生竞争条件(如死锁、数据竞争等),导致程序的正确性受到影响,需要使用同步机制来确保数据的一致性和正确性。
- 上下文切换开销:线程之间的切换需要保存和恢复上下文信息,这会引入一定的开销。当线程数量过多时,频繁的上下文切换可能会造成系统性能下降。
- 调试困难:多线程程序的调试相对于单线程程序更加困难,由于线程之间的交互和并发执行,出现问题时排查和定位错误可能更加复杂。
因此,尽管多线程能够提高程序性能和资源利用率,但也需要谨慎使用,合理设计线程数量和同步机制,以克服潜在的竞争和调试困难带来的问题。
学习的道路,可能是孤独的!但是为了自己梦想,自己的未来,加油!相信你一点可以做到!