计算机组成原理- 5 中央处理器

中央处理器

0.Preface

CPU=运算器+控制器
运算器对数据进行加工,控制器控制协调指令序列,包括取指令、分析指令、执行指令。除此之外,cpu还可以控制程序输入和结果输出(IO)

1.CPU的基本功能和结构

1.1 cpu的功能

cpu最基本的功能是处理程序,但是在很多特殊情况下需要__处理中断__和异常情况。具体地,cpu的功能分为以下几种:

控制指令的操作时序、控制指令的执行操作、运算数据、控制存储器和I/O、处理异常和中断

天勤的书上概括为:指令控制、操作控制、时间控制、数据加工、中断处理

其中,天勤书上提到处理中断和异常情况的具体表现为,为了使cpu和外部设备可以很好地协调,尽量使cpu不等待,甚至不参与外部设备的输入和输出过程,采用了中断方式和DMA方式。在这两种方式下,cpu主要要做的就是提出中断请求和DMA请求,以及在执行过程中采用相应的引脚查询中断请求和DMA请求。

查询时机如果查到
DMA请求机器周期结束时DMA控制总线,cpu脱离总线
中断请求指令周期结束时响应中断执行指令,得到中断服务的入口地址,送入程序计数器中。下个指令周期开始时,取出中断周期的第一条指令进行执行

上述描述中,比较困惑的点如下:

1、首先是各个周期的区别,根据整理,大概整理出了如下的区别:

周期的分类
时钟周期节拍,cpu时钟周期
时钟频率的倒数
cpu操作的基本单位
机器周期cpu周期一个机器周期包含若干时钟周期
指令周期从cpu中取出一条指令并且执行的全部时间指令周期由若干个机器周期组成
存取周期可以连续读/写的最短时间间隔DRAM芯片的恢复时间较长,可能是存取时间的几倍

机器周期、指令周期和时钟周期的关系如下图所示:

值得注意的是,一个指令周期内的机器周期的长度可以不相等,而一个机器周期的节拍数(时钟周期)也可以不相等。

2、其次是DMA是啥?

经过一番查找,大致在王道的课件里找到了一些答案:

DMA的英文是Direct Memory Access,直接内存访问。

1.2 cpu的结构

cpu的主要结构大致分为两个方面,一个是运算器,一个是控制器。控制器主要是取指令、分析指令、执行指令,以及发出操作控制信号。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Vm2HWthf-1624420490659)(/Users/sloansexcalibur/Library/Application Support/typora-user-images/image-20210619111604105.png)]

运算器功能控制器功能
算术逻辑单元ALU算术逻辑运算程序计数器PC用于存放下一条指令的地址,具有自增功能,长度取决于存储器字数
暂存寄存器对应用程序员透明,
暂存从主存读来的数据
指令寄存器IR保存当前正在运行的指令
由于不需要任何用户的干预,对用户透明
累加寄存器通用寄存器,
可以用来存放从ALU运算得到的结果
加法运算的输入端
使用多个累加寄存器时,此时进行的是寄存器寻址
指令译码器
通用寄存器组包括AX、BX、CX、DX、SP等,
SP是堆栈寄存器
位数与机器字长相等
储器地址寄存器MAR需要访问的地址信息
位数取决于存储器的容量
程序状态字寄存器PSW包括溢出标志OF、符号标志SF、零标志ZF、进位标志CF
属于内部操作器,对程序员不可见
存储器数据寄存器MDR需要访问的数据信息
移位器对操作数进行移位运算时序系统产生时序信号,
由统一CLOCK分频得到
计数器控制乘除的步骤微操作信号发生器根据IR指令、PSW状态信息
及时序信号, 产生控制信号,其结构有组合逻辑型和存储逻辑型两种。

其中专用寄存器有:PSW、MAR、MDR、IR、PC

cpu的位数与数据总线相同,表示一次能处理多少位数据

要注意的是内部寄存器是否对于程序员可见。

用户可见的寄存器用户不可见的寄存器——透明,不可对其编程
通用寄存器组MAR
程序状态字寄存器MDR
IR

各种长度的计算

名称
机器字长计算机一次整数运算所能处理的二进制的位数
存储字长存储单元中二进制代码的位数
MDR的位数=存储字长
MAR反映存储单元的个数
存储器的容量要注意一个bit就是一个二进制的位
在这里插入图片描述

2.指令执行过程

2.1 指令周期执行过程和信息流

2.1.1 取指周期

取指周期的两大问题:CPU到哪个存储单元取指令,如何形成后继取指指令。

2.1.2 间指周期

注意不是所有的指令执行过程都会有间指周期。间指周期是为了取出操作数的有效地址,操作数的地址存放在相应的存储器中,到相应的存储器中去取数。

2.1.3 执行周期

没有统一的数据流向。根据IR中的操作码和操作数通过ALU操作产生操作结果。

此处以加法和存数为例进行陈述。

1)加法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O1aoTxML-1624420490666)(…/Library/Application%20Support/typora-user-images/image-20210622204317230.png)]

思路:从主存中取出数,和累加器ACC中的值相加送入ACC中

Ad(IR)->MAR          //将指令地址码送入主存
1->R                 //启动存储器读
M(MAR)->MDR          //将MAR中的内容经过数据总线送入MDR,采用总线连接时最好课程M(MAR)->BUS->MDR
(ACC)+(MDR)->ACC     //给ALU发命令,将ACC的内容和MDR的内容相加,存入ACC中

2)存数

将ACC的结果存入主存A中:

Ad(IR)->MAR    //指令的地址码送入MAR中
1->W           //启动存储器写
(ACC)->MDR     //将累加器的内容送入MDR
(MDR)->M(MAR)  //MDR的内容写入主存单元

2.1.4 中断周期

处理中断请求。假如程序断点存入堆栈中,并且用SP指向栈顶地址,则进栈操作是先修改栈顶指针,后存入数据,则数据流如下:

关于中断周期需要思考两个点:1)中断保存的断点在哪里? 2)如何找到入口?

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Tfzd4Fo8-1624420490669)(../Library/Application%20Support/typora-user-images/image-20210622205441678.png)]

0->MAR       //若是改成堆栈存储,则此句改为 SP-1->SP (SP)->MAR
1-W          //启动存储器写
(PC)->MDR    //pc存储的内容为程序的断点
(MDR)->M(MAR) //主存存储器存储的内容送入MAR
向量地址->PC  //向量地址形成的部件送入pc
0->ENIT     //关中断,允许中断触发器清零

2.2 指令执行方案

2.2.1 单指令周期

所有指令采取相同的执行时间来完成。指令周期的大小取决于执行时间最长的执行周期。因为部分段时间的执行周期被强制拉长了,所以单指令周期的效率较低。

2.2.2 多指令周期

不同类型的指令采取不同的执行步骤来完成。多指令周期对于硬件的要求较高。

2.2.3 流水线方案

指令可以并行的方案,称为流水线方案。

2.3 本节总结

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ol5NmJmt-1624420490671)(/Users/sloansexcalibur/Library/Application Support/typora-user-images/image-20210619141216662.png)]

计算机可以通过指令周期的不同阶段判断取出的地址还是数据。

3.数据通路的功能和基本结构

3.1 数据通路的功能

数据通路是各个部件用来传输数据的路径。数据通路由控制部件控制,用以实现cpu内部的运算器和寄存器及寄存器之间的数据交换。

3.2 数据通路的基本结构

数据通路的基本结构分为两种:cpu内部总线的方式、专用数据通路的方式

1) cpu内部总线的方式

通过一条bus进行数据的传输交换,但是容易造成数据的冲突。按照总线的数量分为单总线、双总线和多总线。具体示意图如下:

2)专用数据通路的方式

这种方法根据数据的具体流向安排硬件进行数据传输。性能较高,但是硬件需求量较大。

具体地,又分为如下几种:

1、寄存器之间的传输

寄存器之间的传输借助于cpu内部bus完成。此处以pc为例,把PC内容送至MAR,具体的数据流如下:

2、主存和cpu之间的传输

也是借助于cpu内部的bus进行传输。以cpu取指为例说明主存和cpu之间的数据传输:

3、执行算术或者逻辑运算


由于cpu内部没有存储功能,因此在执行加法操作时,两个操作数须加到ALU两个输入端并且同时有效,其运算结果

4.控制器的功能和原理

4.1 控制单元的功能

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2R4MUyNY-1624420490674)(../Library/Application%20Support/typora-user-images/image-20210622210656238.png)]

输入cu的内容输出cu的内容
指令寄存器,指令操作码送入译码cpu内的控制信号,cpu内寄存器之间的传送和控制ALU
标志,有时指令通过前一条指令的结果产生信号送至控制总线的信号,i/o读写、中断响应等
时钟,时钟脉冲进行控制
来自控制总线的控制信号

控制器是控制单元的核心,其主要功能有:

1)取指令并且指出下一条指令所在的位置

2)对指令进行译码和测试,

3)控制cpu、主存、输入输出之间的数据流动方向

4.2 控制单元的设计

4.2.1硬布线设计

image-20210623090413132

具体的设计步骤是:

image-20210623090646912

image-20210623093048760

硬布线一般用于RISC(指令精简系统),纯硬件控制,因而速度快,但是成本高,扩充指令困难。

天勤:1)硬布线中微操作的次序不可变

​ 2)可在同一节拍内完成的控制对象不同的微操作尽量安排在一个节拍内

​ 3)占时间少的微操作安排在同一个节拍内

image-20210623095217217

image-20210623095244537

image-20210623095334780

image-20210623095350600

4.2.2微程序控制器设计

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0pUYeoxH-1624420490699)(…/Library/Application%20Support/typora-user-images/image-20210623093321572.png)]

image-20210623095503445

微指令->指令->程序,层层套娃。

微指令=操作控制+顺序控制

注意区分几个名词:

1)微指令 & 微操作:微命令和微操作一一对应。命令是操作的信号,操作时命令的执行过程

2)微指令 & 微周期:微周期是执行一条微指令所需要花费的时间。微指令是微命令的集合

3)主存储器 & 控制存储器:

image-20210623093532725

接下来是关于微指令的设计:

微指令的格式分为水平型、垂直型、混合型。

image-20210623105407506

1)水平型:每条指令可以定义多个可并行的微命令

编码方式:

i)直接编码:每个bit对应一个指令,运行速度最快,但是字段较长的话会造成存储空间的浪费。

image-20210623100543172

ii)字段直接编码:将控制字段分为段,每段经过直接译码之后发出控制信号。可以缩短指令字长,但是降低了执行的速度:因为要经过译码方可得出操作。

image-20210623100532189

image-20210623100657950

iii)字段间接编码

某些字段的微指令是由其他微指令解释得出,并非依靠直接编码得出。字段间接编码可以进一步缩短微指令字长,但是削弱了微指令的执行控制能力,通常用作直接编码的辅助手段。

image-20210623100958316

2)垂直型:只可定义一个微命令,由操作码指明

3)混合型:垂直的基础上加上简单的水平

得到微指令的地址有如下几种方式:

1)断定方式:由微地址的下地址字段直接得出后继指令的地址

2)由机器指令的操作码得出

3)增量计数法:(CMAR)+1->CMAR

4)分枝转移

判别条件:转移地址:转移成功后的去向

image-20210623101553305

5)经过测试网络

image-20210623101620072

6)由硬件产生微程序入口地址

image-20210623101729177

以下是上述内容的小小总结

image-20210623104957612

以下是各个周期内微程序控制器的设计

image-20210623104934184 image-20210623105152827

5.指令流水线

为了提高处理器的运算速度,故采取流水线的方式

5.1 基本概念 & 性能指标

5.1.1 基本概念

一条指令可以分为 取指、分析、执行三个阶段,根据各个指令用到的硬件不同,这三个阶段涉及的硬件也不相同。

取指:根据pc内容访问寄存器,并取出一条指令放在ir中

分析:根据指令译码,根据译码结果形成有效地址ea,从ea中读出操作数

执行:把运算器写到通用寄存器或者主存中

若采用顺序执行的方式,则需要3nt的时间:顺序执行的硬件代价小,控制简单,但是部件的利用率较低

image-20210623111444301

若采用一次重叠、二次重叠,则效果如下:

image-20210623111629132

有图可知,在采用重叠方式之后,指令的执行效率大幅度提升。

5.1.2 相关性能指标

1)吞吐率:单位时间内完成操作的数量,或者是输出的数量

image-20210623111852877

2)加速比

不使用流水线的所用时间/使用流水线的所用时间

image-20210623111950173

3)效率

image-20210623112033631

以上理想的状况是,各个阶段所花的时间相同,在完成一个阶段之后立马进入下一阶段

5.2 影响因素 & 分类

5.2.1 数据相关

也就是数据冲突,必须等前一条指令执行完成才能完成下一条指令

解决方案:1)阻塞指令和后续指令都延后几个周期,具体措施分为:硬件阻塞(stall)和软件插入nop

2)数据旁路技术 3)编译优化,通过编译器来调整指令的顺序

5.2.2 结构相关

也就是资源冲突,这种情况下多条指令在同一时刻争夺同一资源

解决方案:暂停某一周期、资源重复配置(采用数据存储器+指令存储器)

5.3.3 控制相关

遇到转移指令和其他改变pc值的指令造成数据断流

解决方法:1)提早判断

2)预取转移成功和不成功的控制流上的转移指令

3)加快提前形成转移码

4)提高转移方向的猜准率

5.3.4 分类

image-20210623112942431

部件功能级:将逻辑运算组成流水线

处理机级:一条指令解释过程分为若干子过程,如取指、译码、执行、访存、写回

处理机间:处理机之间的流水线

5.3 多发技术

5.3.1 超标量技术

image-20210623113559764

5.3.2 超流水技术

image-20210623113614501

5.3.3 超长指令字

image-20210623113624464

5.4 五段式流水线

image-20210623113744062

image-20210623113758888

image-20210623113809575

image-20210623113823874

image-20210623113838345

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吴哈哈就是我

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值