【计算机系统结构】重叠方式

📝本文介绍
本文主要内容位计算机系统结构的重叠方式

👋作者简介:一个正在积极探索的本科生
📱联系方式:943641266(QQ)
🚪Github地址:https://github.com/sankexilianhua
🔑Gitee地址:https://gitee.com/Java_Ryson
由于本人的知识所限,如果文章有问题,欢迎大家联系并指出,博主会在第一时间修正。

📕重叠原理

📖顺序执行和重叠执行

  在几乎所有的冯诺依曼体系计算机中,一条指令从开始到执行完毕,大致可以分为5个阶段:取指,译码,执行,访存,写回。
  在这里,我们将其暂时分为三个阶段:取值,译码,执行。
  顺序执行:一条指令完整的执行完之后,才可以让下一条指令开始取指。也就是指令之间是串行的关系。在我们执行第k条指令时,必须将第k条指令的三个阶段完整执行完,才可以取出下一条指令开始执行。
  重叠执行:在解释第k条指令的操作完成之前,就可开始解释第k+1条指令。也就是,第k条指令进入译码阶段时,就可以开始第k+1指令的取值,从而达到不同阶段重叠,加快多条指令的运行。
  注意:重叠执行并不能加快一条指令的解释,但能加快相邻两条乃至一段程序的解释
在这里插入图片描述

📘一次重叠及问题解决

📖一次重叠

  一次重叠,将一条指令的解释分为两部分:分析和执行,这样再执行过程中,就只会有分析和指令这两部分的重叠,且只重叠一次。

📖时间重叠问题及解决

🔖访存冲突

  • 将指令与数据分开存放在单独的存储器中(哈佛结构)
  • 混存,采用多体交叉存储结构。也就是对存储器内部区域进行重新规划,连续的地址分开存放。
    在这里插入图片描述
  • 增设指令缓冲寄存器

🔖部件数量

  • 在重叠执行中,希望分割成多个小步骤实现流水,必须有独立的指令分析部件和指令执行部件。也就是,需要有足够的硬件数量来支持一条指令多个部分的同时进行。才不会出现两个重叠的步骤需要使用同一个部件的情况。(若是出现此情况,那么大多数情况下这两个步骤也不能分开,强行分开了也没用,后步骤仍然要等先步骤把事情做完,本质上还是串行。)

🔖步骤处理时间

  • 步骤之间的时间不可能完全相同,若是先步骤比后步骤的时间长,那么流水线仍能建立,先步骤做完,后步骤马上就可以处理。若是先步骤比后步骤时间短,那么后步骤就会出现时间来不及的问题。先步骤处理完,但是后步骤还未处理好上一条指令,这时就会出现流水中断。流水线由于这个后步骤的时间原因,需要中断等待后步骤处理完。
  • 解决方法:先行控制方式。先行控制是指在处理机内部设置一定容量的指令缓冲栈,把指今分折器所需要的指令事先取到指令缓冲栈中,而不必访问主存储器。这样,就能够使取指令、分析指令和执行指令重叠起来执行。(这里也就是一次重叠了。)

🔖转移指令

  • 转移指令对于计算机执行来说,是一个较大的问题。从PC寄存器的工作方式,我们也可以看出,每次+1取指。当出现跳转时,就需要重新计算PC,重新取指。若不做任何处理,当出现转移指令时,就会浪费一个时钟周期。
    在这里插入图片描述
  • 解决方式:延迟转移技术。假设,第k+1条指令为转移指令(跳转到k+5),第k指令为与k+1条指令无关的指令,则可以将转移指令提前,也就是第k+1条先解释。而第k条指令是一定要执行的,这样就不会浪费第k+2条指令的分析周期时间
    在这里插入图片描述

📙相关处理

📖数相关

🔖主存空间数相关

  原因:相邻两条指令之间要求对主存同一单元先写入而后再读出的关联。(也就是后一条指令涉及了前一步骤的处理数。)
  解决方法:延迟。等待上一步骤执行完,将数写入后,再读出,才会是最新数据。

🔖通用寄存器数相关

  • 通用寄存器组数相关
    • 延迟
    • 增加相关专用通路(计算完毕后,通过相关专用通路可以直接把数据也如到对应的寄存器)
  • 通用寄存器组变址或基址相关(也就是前一步的计算会涉及到后一步对操作数地址的改变)
  • 这里会涉及一次相关和二次相关。一次相关指的是,与下一条指令计算地址有关,二次相关指的是与该指令往后第二条指令有关。一次相关没有好办法,只能延迟。而二次相关就可以采用设置相关专用通路的方法,直接送入对应寄存器,从而不用推迟。
    • 延迟(推后分析法)
    • 设置相关专用通路

📖指令相关

  原因:冯诺曼型机器的指令允许修改
  解决方法:

  • 程序执行过程中不允许修改指令
  • 改变指令的执行方式,采用“执行” 指令将指令相关改成数相关。

相关推荐

  1. 计算机系统结构期末复习

    2024-03-16 23:36:02       28 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-16 23:36:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-16 23:36:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-16 23:36:02       82 阅读
  4. Python语言-面向对象

    2024-03-16 23:36:02       91 阅读

热门阅读

  1. react的高阶组件怎么用?

    2024-03-16 23:36:02       41 阅读
  2. 安卓UI面试题 51-55

    2024-03-16 23:36:02       42 阅读
  3. Acwing101 --- 最高的牛(差分)

    2024-03-16 23:36:02       38 阅读
  4. MATLAB中的数据类型

    2024-03-16 23:36:02       42 阅读
  5. Redis语法总结

    2024-03-16 23:36:02       58 阅读
  6. 【2024-03-16】蚂蚁金服春招实习笔试三道编程题解

    2024-03-16 23:36:02       57 阅读
  7. python-0008-修改django数据库为mysql

    2024-03-16 23:36:02       35 阅读
  8. libcurl test

    2024-03-16 23:36:02       41 阅读
  9. 【LeetCode】动态规划--题目练习

    2024-03-16 23:36:02       41 阅读
  10. Yaml格式解析

    2024-03-16 23:36:02       43 阅读