当前位置: 首页 > news >正文

《计算机原理与系统结构》学习系列——处理器(下)

系列文章目录

目录

  • 流水线冒险
    • 数据冒险
      • 数据相关与数据冒险
      • 寄存器先读后写
      • 旁路
      • 取数使用型冒险
      • 阻塞
    • 控制冒险
      • 分支引发的控制冒险
      • 假设分支不发生
      • 动态分支预测
      • 双预测位动态分支预测
      • 缩短分支延迟
      • 带冒险控制的单周期流水线图
  • 异常
    • MIPS中的异常
    • MIPS中的异常处理
    • 另一种异常处理机制
    • 非精确异常
    • 精确异常
    • 流水线中的异常
    • 带异常处理的流水线
    • 异常的性质
    • 多个异常处理
  • 中断
    • 中断系统
    • 中断的基本类型
      • 中断的产生方式
      • 中断处理方式
      • 是否屏蔽
      • 中断源
      • 中断响应方式
      • 中断重数
    • 中断源的种类
    • 中断请求方式
      • 请求结构
      • 中断请求标记 INTR
      • 禁止中断和中断屏蔽
        • 禁止中断
        • 中断屏蔽
        • 中断判优
    • 在这里插入图片描述
    • 中断响应
    • 中断处理程序入口
    • 中断处理及中断返回
    • 中断嵌套
    • 中断屏蔽


流水线冒险

数据冒险


数据相关与数据冒险

在这里插入图片描述

  • $ v0寄存器($ 2)被五条指令使用,其中,sub指令将结果-20写入$v0另外4条指令预期读取数据-20与sub指令数据相关
  • 但是,sub指令在CC5才将-20写入$ v0,and和or在CC3/CC4就要读取-20,此时$v0的值还是10,于是产生数据冒险(data hazard)

寄存器先读后写

  • 约定寄存器前半拍写后半拍读,在CC5中,sub先写结果-20,再由add读取,可避免一次冒险

旁路

在这里插入图片描述

  • 实际上,and和or要使用的数据-20在CC3就已经由ALU计算生成,我们可以从EX/MEM寄存器将数据直接传给and指令的ALU
  • 从MEM/WB寄存器将数据传给or指令的ALU,这种跳过寄存器写回、直接从流水线寄存器取得数据的方法称为转发(forward)或旁路(bypass)
  • 其中,and指令将sub的ALU运算结果作为ALU的rs输入,形成ALU-ALU旁路
    • 1a. EX/MEM.RegisterRd = ID/EX.RegisterRs
  • or指令将sub的ALU运算结果(MEM级),作为ALU的rt输入,称为MEM-ALU旁路

配备两种旁路,则称为全旁路

取数使用型冒险

考虑指令序列
lw $t0,12( $s0 )
add $t1, $t0 , $t0

在这里插入图片描述

下一条指令使用lw的目标寄存器rt时,访存读出的数据在MEM级才产生,尝试添加旁路,发现数据流向和时间相反,对这种取数-使用型数据冒险,必须在lw指令后添加一个气泡/阻塞周期


阻塞

add 指令已经执行IF和ID周期,我们并不是真的塞入一条空指令nop,而是把add的控制信号全部清零、使其不改变任何状态单元,将其变为空指令,同时将add指令的地址重新写回PC(PC+4-4),在lw的EX周期重新执行add指令阻塞由冒险检测单元控制实现



控制冒险

分支引发的控制冒险

在这里插入图片描述
分支指令beq在MEM级才能决定是否分支,此前beq后的三条指令都已被取到流水线分支成功执行了,分支失败才应该执行的指令就产生了分支冒险,是一种典型的控制冒险(control hazard)


假设分支不发生

当我们猜测每个分支语句发生的概率很小,如循环中用于退出循环的beq reg1,$zero,Exit指令,我们可以采取总是假设分支不发生的策略,执行那些紧跟在beq后的指令,跳过分支,如果预测失败不产生额外开销,且预测成功率能达到50%,就能减少减少50%的分支冒险开销
(也有总是假设分支发生)


动态分支预测

上面这种方法只是简单的假设全部分支都不发生,是一种静态分支预测

通过向数据通路添加称为分支预测缓存(分支历史记录)的小型索引存储器区,保存近几次分支的记录,进而预测分支是否发生,这样的策略称为动态分支预测,动态分支预测的准确率通常高达90%

考虑一个循环,进行9次循环分支(分支发生)后退出(分支不发生)
使用单预测位(初始化为表示不分支的0)会产生两次预测错误:

  • 进入第1次循环后,要继续循环分支,然而预测位为0,预测不分支,产生一次预测错误
  • 进入第9次循环后,不再循环分支,然而预测位为1,预测分支,产生第二次预测错误

双预测位动态分支预测

在这里插入图片描述

使用双预测位时,则只会产生一次预测错误,两个预测位表示0~3这4个数,初始化为0

  • 分支一次+1且不超过3,不分支一次-1且不超过0
  • 当预测位为0、1时,预测分支不发生
  • 当预测位为2、3时,预测分支发生

缩短分支延迟

在此前的分析中,beq在MEM级才能决定是否分支

  • 如果能将整个分支过程提前到EX级,就能将分支错误时的开销从3条指令(3个周期)缩短到2条指令(2个周期)
  • 提前到ID级,就能将分支错误开销进一步降低到1条指令

这种缩短分支延迟的策略需要提前2件事:
1.计算分支目标地址 2.判断分支条件

  • PC+4的值在IF周期已经计算出来,完全可以在ID周期计算出分支目标地址
  • 在ID级从寄存器堆取出rs和rt的数据,送入一个相等检测单元
  • 判断相等以后,即可向控制PCSrc的多选器发出信号,将分支目标地址写回PC,在ID级完成分支

如果beq上一条指令是R型指令,且需要比较R型指令的运算结果,则在R型ALU结果旁路到IF/ID寄存器的基础上,还需要将beq指令阻塞一个周期
如果beq上一条指令是lw指令取得的数据,需要阻塞2个周期


带冒险控制的单周期流水线图

在这里插入图片描述

  • 支持旁路的旁路单元
  • 支持阻塞的冒险检测单元
  • 用于在ID级比较两数是否相等的相等检测单元


异常

MIPS中的异常

在MIPS中系统中,中断、陷阱、系统调用和任何可以中断程序正常运行的情况都称为异常

  • 外部事件——中断
  • 内存翻译异常
  • 程序或硬件探测到的错误
  • 数据完整性错误
  • 系统调用和陷入

MIPS中的异常处理

  • 保存出错指令
    • 异常程序计数器EPC
    • EPC寄存器用于指向异常发生时指令跳转前的执行位置,当异常时,返回这个地址 继续执行
  • 保存问题产生的原因
    • 状态寄存器 Cause register
    • 我们假定一位:0表示未定义指令,1表示算数溢出
  • 异常处理系统跳转至统一的入口地址 8000 0180

另一种异常处理机制

  • 向量中断
    • 由异常原因决定中断控制的转移地址
  • 例如:
    • 未定义指令: 8000 0000
    • 算数溢出: 8000 0180
  • 指令可能是:
    • 处理中断,跳转到实际的中断处理程序

非精确异常

  • 常规异常一般为软件的异常
  • 异常发生时,跳转前最后被执行的指令是其MEM阶段刚好被执行完的那条指令。受影响指令是EX阶段刚好执行完的那条指令。
  • 仅仅是停止流水线并保存状态,包括产生异常的原因:
    • 哪条(些)指令产生了异常
    • 哪些可以完成或清除,可能需要“手动”完成
    • 对于复杂多发无序的流水线,此方法是不可行的
  • 而中断一般为硬件异常,中断可以是芯片内部,也可以是芯片外部触发产生,硬件简单,但处理软件复杂

精确异常

  • 在运行流程中没有任何多余效应的异常
    • 即当异常发生时,受影响指令之前的指令被完全执行,而受影响指令及后面的指令还没开始执行
  • 如果受影响指令在分支延迟时间片中,则硬件自动处理EPC,在重新执行分支指令时,分支延迟时间片中的指令会被再执行一次
  • 精确异常的实现对流水线的流畅性是有一定的影响的,有助于保证软件设计上不受硬件实现的影响
  • 但异常太多,系统执行效率就会受到影响

流水线中的异常

  • 控制冒险的另一种形式
  • 假设加法指令add $1,$2,$1在执行阶段产生了算术溢出
    • 防止$1被破坏
    • 完成前面的指令
    • 清除add和后面的指令
    • 设置Casue和EPC寄存器的值
    • 把控制转交给异常处理程序
  • 类似于分支预测错误的情形
    • 使用许多相同的硬件

带异常处理的流水线

在这里插入图片描述

异常的性质

  • 可重新执行的异常
    • 流水线可以先清除这条指令
    • 在异常处理完后再重新执行这条指令
      • 从头开始取指和执行
  • 将导致异常的指令地址PC保存到EPC中
    • 找到引起异常的指令
    • 实际上保存的是PC+4
      • 异常处理例程必须调整,从保存的地址中减去4

多个异常处理

  • 流水线重叠执行多条指令
    • 在一个时钟周期内可能发生多个异常
  • 简单方法:从最早发生异常的指令开始处理异常
    • 清除后续的所有指令
    • 精确异常
  • 复杂的流水线中
    • 每周期执行多条指令
    • 乱序的完成时间
    • 保持精确异常处理非常困难


中断

中断系统

  • 当设备准备好或发生故障时
    • 控制器向CPU发出中断申请
  • 中断类似于异常
    • 但对指令执行来说,中断是异步的
    • 能够在指令之间调用处理程序
    • 中断状态通常能指出中断设备
  • 中断优先级
    • 更急迫需要的设备赋予更高的优先级
    • 能够中断一个低优先级的中断处理程序

中断的基本类型

中断的产生方式

  • 强迫中断:由某种随机产生的紧急事件引发的中断
  • 自愿中断:由程序中事先安排好的中断指令引发

中断处理方式

  • 程序中断:CPU响应中断后,转去执行相应的中断处理程序
  • 简单中断(DMA方式):CPU响应中断后,不执行中断处理程序,只是让出几个总线周期给DMAC完成DMA操作

是否屏蔽

  • 非屏蔽中断:优先级高,用于应急处理
  • 可屏蔽中断:优先级低,用于一般外设传送

中断源

  • 内中断:由CPU内部软硬件原因引发,如单步中断
  • 外中断:CPU以外的部件引发

中断响应方式

  • 向量中断
    • 将所有的中断处理程序的入口地址(第一条指令的地址)排成一张表,称为中断向量表
    • 在中断响应时,CPU通过这张表找到各个中断处理程序的入口地址
  • 非向量中断
    • 中断源不提供中断服务程序的入口地址,而通过软件查询的方法得到

中断重数

  • 单重中断:在CPU执行中断服务程序过程中不能再被打断
  • 多重中断(中断嵌套):在执行某个中断服务程序的过程中,CPU可去响应级别更高的中断请求

中断源的种类

① 由外围设备引起的中断要求CPU介入I/O操作,例如:
* 慢速设备的缓冲寄存器准备好接收或发送数据
* 信息块传送的前、后处理
* 设备的启动或非数据控制动作(如磁带、磁盘定位)的完成
* I/O的任一环节出错等
② 由运算器产生的中断。
③ 由存储器产生的中断。
④ 控制器产生的中断。
⑤ 过程控制产生的中断。
⑥ 时钟定时中断。
⑦ 电源故障中断。


中断请求方式

请求结构

独立请求线

  • 可直接识别中断源
  • 中断请求线数目有限
    在这里插入图片描述
    公共请求线
  • 通过软硬件识别中断源
  • 中断源数目可以扩充
    在这里插入图片描述

二维结构

  • 同级别采用相同请求线
  • 不同级别采用不同请求线
    在这里插入图片描述

中断请求标记 INTR

一个请求源对应一个INTR中断请求标记触发器
多个INTR组成中断请求标记寄存器
在这里插入图片描述

禁止中断和中断屏蔽

禁止中断
  • 产生中断源后,由于某种条件的存在,CPU不能中止现行程序的执行,称为禁止中断
  • 一般在CPU内部设有一个**“中断允许”触发器**。该触发器置“1”状态,才允许中断源等待CPU响应;该触发器被清除,则不允许所有中断源申请中断
  • “中断允许”触发器通过**“开中断”、“关中断”**指令来置位或复位
中断屏蔽
  • 当产生中断请求后,用程序方式有选择地封锁部分中断,而允许其余的中断仍得到响应,称为中断屏蔽
  • 实现方法是:
    • 为每一个中断源设置一个中断屏蔽触发器来屏蔽该设备的中断请求
    • 具体来说,用程序方法将该触发器置“1”, “0”
中断判优
  • 按中断性质和处理的轻重缓急进行排队
    • CPU现行程序与中断请求之间 :
      • 现行程序优先级低于中断请求优先级,CPU可以响应中断请求
    • 各中断请求之间
      • 硬件排队方式
        • 优先级高的自动封锁优先级低的中断请求
        • 速度快,成本高,难于修改
      • 软件查询方式
        • 查询顺序可通过编程改变,灵活
        • 查询、判优靠程序实现,占用CPU时间,速度慢

硬件实现(排队器)

在这里插入图片描述
软件实现(程序查询)

在这里插入图片描述


中断响应

  • 保存断点
    • 入栈或存入指定内存单元
  • 关中断
    • 防止中断响应过程被打断
  • 形成中断服务程序入口

由中断隐指令实现:并不是真正的指令,由硬件直接实现的中断响应过程中的基本操作
在这里插入图片描述



中断处理程序入口

  • 硬件方法(向量中断):
    • 硬件自动形成中断处理程序的入口地址(中断向量)
    • 向量地址通常有两种情况:
      • 向量地址是中断服务程序的入口地址
        • CPU不需要再经过处理就可以进入相应的中断服务程序
        • 适合于中断源比较少的情况。
      • 向量地址是中断向量表的指针
        • 中断源给出的向量地址是中断服务程序入口地址的地址。例:8086中断系统

在这里插入图片描述在这里插入图片描述

  • 软件查询法:八个中断源 1,2,… 8 按降序排列
    在这里插入图片描述


中断处理及中断返回

  • 开中断
    • 允许中断嵌套
  • 中断服务
    • 根据中断源的要求进行具体的服务操作
  • 关中断并恢复现场
    • 防止受干扰,先关中断;然后从堆栈弹出原现场信息
  • 开中断
    • 由于中断程序的插入时随机的,无法在返回原来的程序之后开中断
    • 必须在中断返回之前,由中断服务程序执行开中断指令
  • 中断返回
    • 从堆栈中弹出断点地址,便可从服务程序返回到原来程序的断点处执行原程序
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述


中断嵌套

  • 概念
    • 一个系统中有多个中断源
    • 若CPU正在某中断服务程序时
    • 有更重要的中断源申请中断,则CPU就中止正在服务的程序,转为新的中断源服务
    • 在处理完毕后,再返回到被中止的服务程序,直至处理完,返回主程序
  • 中断嵌套的关键
    • 中断处理程序中开中断
    • 利用堆栈保证中断的逐级返回
      在这里插入图片描述


中断屏蔽

  • 中断优先级包括两层含义
    • 响应优先级
      • 多个中断源同时发出中断请求时,由硬件排队线路决定的CPU的响应次序,称为硬排队
    • 处理优先级
      • CPU在处理中断的过程中,优先执行哪个中断服务程序的次序
      • 可以由中断屏蔽码来改变优先级顺序,称为软排队
  • 中断屏蔽
    • 通过改变中断屏蔽码来改变中断优先级的技术

屏蔽字
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

http://www.lryc.cn/news/475649.html

相关文章:

  • JDK新特性(8-21)数据类型-直接内存
  • 003-Kotlin界面开发之声明式编程范式
  • QT pro项目工程的条件编译
  • 深度学习之经典网络-AlexNet详解
  • 部署Prometheus、Grafana、Zipkin、Kiali监控度量Istio
  • 结合 Spring Boot Native 和 Spring Boot 构建高性能服务器架构
  • ArcGIS影像调色(三原色)三原色调整
  • SQLite从入门到精通面试题及参考答案
  • 【C/C++】字符/字符串函数(0)(补充)——由ctype.h提供
  • Git 的特殊配置文件
  • 数据的表现形式(1)
  • 《高频电子线路》—— 调幅
  • ubuntu22.04安装ROS2Humble
  • 软中端,硬中断(学习笔记)
  • scIDST:弱监督学习推断单细胞转录组数据中的疾病进展阶段
  • Linux 下执行定时任务之 Systemd Timers
  • flutter 专题二 Flutter状态管理之Riverpod 0.8.4
  • 【Linux】从零开始使用多路转接IO --- poll
  • Docker配置宿主机目录和网络映射
  • 第十七课 component组件解析
  • 求余和求模是不是一样的,就要看看计算机中的 fix 和 floor 区别
  • 00 递推和递归的核心讲解
  • 深度学习常用开源数据集介绍【持续更新】
  • rust编写的系统监测器
  • 【MyBatis源码】CacheKey缓存键的原理分析
  • 034_Structural_Transient_In_Matlab结构动力学问题求解
  • 项目模块十五:HttpResponse模块
  • 推荐一款优秀的pdf编辑器:Ashampoo PDF Pro
  • 【系统架构设计师】2024年上半年真题论文: 论模型驱动架构设计方法及其应用(包括解题思路和素材)
  • 国内短剧源码短剧系统搭建小程序部署H5、APP打造短剧平台