📝本文介绍
本文主要内容位计算机系统结构的重叠方式
👋作者简介:一个正在积极探索的本科生
📱联系方式: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条指令的分析周期时间
📙相关处理
📖数相关
🔖主存空间数相关
原因:相邻两条指令之间要求对主存同一单元先写入而后再读出的关联。(也就是后一条指令涉及了前一步骤的处理数。)
解决方法:延迟。等待上一步骤执行完,将数写入后,再读出,才会是最新数据。
🔖通用寄存器数相关
- 通用寄存器组数相关
- 延迟
- 增加相关专用通路(计算完毕后,通过相关专用通路可以直接把数据也如到对应的寄存器)
- 通用寄存器组变址或基址相关(也就是前一步的计算会涉及到后一步对操作数地址的改变)
- 这里会涉及一次相关和二次相关。一次相关指的是,与下一条指令计算地址有关,二次相关指的是与该指令往后第二条指令有关。一次相关没有好办法,只能延迟。而二次相关就可以采用设置相关专用通路的方法,直接送入对应寄存器,从而不用推迟。
- 延迟(推后分析法)
- 设置相关专用通路
📖指令相关
原因:冯诺曼型机器的指令允许修改
解决方法:
- 程序执行过程中不允许修改指令
- 改变指令的执行方式,采用“执行” 指令将指令相关改成数相关。