考研408《计算机组成原理》复习笔记,第五章(2)——CPU指令执行过程

一、指令执行基本流程

为了方便下面的知识点理解,要先明白一个指令到底是怎样一个执完整行流程

中断是操作系统OS的知识点,各位应该都学过,这里懒得解释了

二、指令周期

【指令周期】:就是CPU**【取出指令 并 执行完一条指令】**所需要的时间

1、【指令周期】分为哪些阶段

回顾指令知识点:

根据指令类型不同,【指令周期】分为两种:

  • 1、【无条件转移指令】:通常执行阶段无需访问主存,就算取指阶段也只用访问一次主存
    • 所以只包含【取指阶段 】+【执行阶段
      • 取指阶段】还包括【取指 】+【分析】(不然看不懂指令怎么执行?)
    • 对应所花费的时间就叫【取指周期】+【执行周期
  • 2、【间接寻址指令】:给出的是形式地址,需要先去主存取指令有效地址,然后再访问主存取出指令,要访问2次主存
    • 所以需要【取指阶段】+【间址阶段】+【执行阶段
    • 对应所花费的时间就叫【取指周期】+【间址周期】+【执行周期
  • 最后不管是哪种指令,如果CPU采用中断方式,指令结束前CPU会发出中断查询,若有【中断请求】,CPU还会进入【中断阶段】
    • 所以!最完整的【指令周期】(包含间接寻址的指令)是4个阶段
    • 取指周期】+【间址周期】+【执行周期】+【中断周期

注意:

  • 题目没提到上面提到的【总线周期】或【I/O周期】,默认不存在、不用管
  • 然后我说的**最完整的【指令周期】**是涵盖了【间接寻址】的
    • 如果是直接【无条件转移指令】就无需考虑【间址周期】

2、机器周期、时钟周期回顾

那么一个指令周期究竟多长怎么表达?那就是用到专门的单位【机器周期】、【时钟周期】了(就像描述时间的单位是小时、分钟、秒.......)

注意:

  • 【时钟周期】又称【节拍】、【CPU时钟周期】
    • 最小的时间单位、cpu操作的最基本单位,一段信号里【时间周期】之间都是固定一样大小
    • 【主频】是数字脉冲信号震荡的频率,是【时钟周期的倒数】(可以理解【时间周期】是【主频】的份数),频率越高,则时钟周期越短
  • 一个【机器周期】又叫【CPU周期】
    • 包含多个【时钟周期】,一段信号里各个【机器周期】之间没有固定的长度

那么一个【指令周期】又由多个【机器周期】组成

然后【指令周期】又分为【定长指令周期】和【变长指令周期】:

  • 【定长指令周期】:1个指令内的【机器周期】长度一样
  • 【变长指令周期】:1个指令内的【机器周期】长度不一样
    • 因为【取指令】需要访问【主存】
    • 但是【执行指令】时只要指令到了CPU,若不再需要访问主存的话,就会以飞快的速度执行
    • 所以不同阶段所需要的【机器周期长度】应该是不同的,就会有【变长指令周期】甚至可以说【变长指令周期】的依据是【时钟周期】

不同指令所需要的**【机器周期数量】** 也是不同的:

3、例题

三、指令周期数据流

由于教材和视频的写法不统一,很乱,所以我做了一个统一的写法

而且标出了专业的流程写法,比如(PC)--->MAR,请务必记住

1、【取指周期】

取指周期的任务是 :根据PC中的指令地址,从主存里取出****指令 并送到IR进行分析指令

注意:

  • 取指令的同时,CU会发出控制信号,让【PC+"1"】
    • 但要留意后面我们会学到【中断周期】,涉及到的是【堆栈】,堆栈地址是自上到下、地址高位到低位,所以【PC+"1"】对应【SP-"1"
  • 【1--->R】意思是【Read读信号】为【1】,发出【读命令】
  • 【M(MAR)--->MDR】是【MEM(MAR)--->MDR】的缩写,【MEM(M)】就是【Memory寄存器】
    • 之所以是(MAR)--->(MDR),并不是主存会把数据先给MAR再给MDR,而是因为主存收到读命令后,根据MAR指向的地址找到内容,再给MDR
    • 或者你可以理解为CPU里的MAR把地址给到主存的MAR,在CU发出读命令后,主存再根据自己的MAR去找该地址指令

说白了就是:1去(去主存) ------> CU发命令(读命令) ------> 1回(回CPU的IR) ------> 下一轮

2、【间址周期】

间址周期的任务: 根据指令地址码的形式地址,去主存取出操作数有效地址

  • 将指令中的【地址码】送到【MAR】并经过【地址总线】送到主存,CU发出读命令存取出有效地址,最后返回【MDR】

注意:

  • 其中【Ad(IR)】表示取出IR中存放指令的地址字段,也就是【操作码的形式地址】

说白了就是:1去(去主存) ------> CU发命令(读命令) ------> 1回(回CPU的MDR)

3、【执行周期】

4、【中断周期】

中断周期的任务: 保存断点,将【中断程序的入口地址】给到【PC】

  • PC放下一次预执行的指令嘛,把中断程序的起始指令地址给他就能开始执行中断的程序指令了;同时还得保存老PC值,一遍执行完中断回来干旧活

要理解中断周期,需要先知道几个事:

  • 1、中断其实有点像函数调用,CPU收到【中断请求】,就会暂停当前任务,转而处理【中断程序】,也就暂时改变【PC+"1"】流程,跳转到别的指令

    • 那么【新PC】记录的会是【中断程序】里的指令位置,为了处理完中断程序后能恢复原来任务,还得考虑保存断点(【旧PC】)
  • 2、中断阶段一般采用【堆栈】保存断点,而堆栈用的是【SP指针】

    • 保存在【栈顶】
    • 然后由于【堆栈】和【主存】的地址顺序不一样(从栈底到栈顶,由高地址到低地址)
    • 所以【PC+"1"】对应【SP-"1"
    • 【堆栈】是主存中的一部分数据结构,所以本质还是【写入主存
      注意:
  • 【1 ---> W】意思是【Write写信号】为【1】,发出【写命令】

    • 因为【SP】代表【旧PC】存在堆栈栈顶,但是堆栈本质也是【主存一部分】,所以要【写入主存

说白了就是:存旧PC ---> CU发命令(写命令) ------> 改新PC(CU设置)

【总结特点】(重要!!)

所以其实可以发现,这些流程都是有特点的,如果你死记硬 就会崩(我靠单押了)

CU的【读 / 写控制信号】有很大的作用:

  • 1、控制数据总线上数据流的方向
    • 是流入存储器
    • 还是流出存储器
  • 2、控制存储器操作的是【读信息】还是【写信息】
    • 那我画一下大致套路:
      • 【读信号】:让主存数据流出存储器,读入到R0寄存器,套路都是:
        • 1------>R
        • M(MAR)------>MDR
        • (MDR)------>R0
      • 【写信号】:让数据流出R0,流入主存存储器,写入到主存,套路都是:
        • 1------>W
        • R0------>MDR
        • M(MDR)------> MAR

【例题】

四、指令执行方案

首先回顾一下知识点【CPI】、【IPS】

1、单周期处理器(CPI=1)

第一种方案是采用【单指令周期】,重点:

  • 所有指令都规定用【1个时钟周期 】完成,【CPI = 1
  • 而【时钟周期大小】取【需耗时最长的指令的执行时间
  • 指令之间【串行】执行!!
  • 看似很快很牛逼,但是实则还是要适应最久的指令,还是大家要干等着浪费时间
    • 注意:下一条指令只能等上一条指令结束才能启动
  • 【难点】:
    • 留意这么个知识点:
      • 1**、单周期CPU没有【IR】**,因为每个指令固定用【1个时钟周期】,所以指令一取出直接执行,以最快速度完成一条指令
      • 2、【控制信号不会变】:【取指令】、【取数据】有专门的部件分开工作,所以不需要改变控制信号,记住就行了
      • 3、单周期CPU需要搭配【多总线CPU结构】或【专用通道结构】、不能用【单总线CPU结构】,这里不理解可以看下一节的笔记会讲,大概原因就是单总线会导致数据冲突,所以单总线只允许同一时刻一个部件允许、发数据,那要想在一个时钟周期完成一个指令的那么阶段操作,肯定得要求同一时刻各个部件能够同时工作

2、多周期处理器(CPI>1)

第二种方案是采用【多指令周期】,重点:

  • 【不同类型】的指令都选用【不同****时钟周期 】完成,【CPI > 1
  • 而【时钟周期大小】取【需耗时最长的指令的执行时间
  • 指令之间【串行】执行!!
  • 但是多周期处理器需要更复杂的硬件设计,总体上还是又快性能又好
  • 【难点】:
    • 留意这么个知识点:
      • 1**、多周期CPU有【IR】**,因为每个指令不确定要用几个时钟周期,不知道啥时候取下一指令,就需要IR控制发一下指令
      • 2、【控制信号会改变】 :因为在不同的时钟周期里(取指阶段、执行指令时取数据...)都共享一个部件(比如存储器),所以一条指令会多次用到同一个部件做不同操作,就需要改变控制信号

3、流水线处理器(CPI=1)

第3种方案是采用【流水线方案】,重点:

  • 每****1个时钟周期 】启动一条指令
    • 注意,并不是一个时钟周期执行完一条指令,启动下一条指令的时候,可能上一条指令并没有执行完
    • 前面我们学过【一条指令的执行】可以分为【多个阶段】,所以这里意思就是上一指令或许刚完成一个阶段,有一些部件比如PC、IR用完了空闲了,下一条指令刚好可以使用这些部件,就马上启动了
    • 只有【理想状态 】下,真的每一个指令能达到一个时钟周期就执行完毕,才会【CPI = 1
  • 指令之间【并行 】执行!!尽量让多个指令近乎同时执行

具体后面会研究

【例题】

总结

相关推荐
所愿ღ1 小时前
JavaWeb-Servlet基础
笔记·servlet
oe10195 小时前
读From GPT-2 to gpt-oss: Analyzing the Architectural Advances(续)
笔记·gpt·学习
Include everything9 小时前
Rust学习笔记(三)|所有权机制 Ownership
笔记·学习·rust
livemetee10 小时前
Flink2.0学习笔记:Flink服务器搭建与flink作业提交
大数据·笔记·学习·flink
INS_KF11 小时前
【C++知识杂记2】free和delete区别
c++·笔记·学习
Easocen11 小时前
Mybatis学习笔记(五)
笔记·学习·mybatis
丑小鸭是白天鹅13 小时前
嵌入式C语言学习笔记之枚举、联合体
c语言·笔记·学习
十一102414 小时前
FX10/20 (CYUSB401X)开发笔记5 固件架构
笔记
FakeOccupational15 小时前
【电路笔记 通信】AXI4-Lite协议 FPGA实现 & Valid-Ready Handshake 握手协议
笔记·fpga开发