2024王道考研计算机组成原理——中央处理器

news2025/7/27 20:10:35

 

CPU的运算器其实就是进行固定的数据处理,后面讲的CPU主要侧重的是它的控制器功能

 

运算器的基本结构

左右两边都是16位,因为寄存器可能位于左右两端的一边(源/目的操作数) 

A、B两端都要接一堆线

通用寄存器 + ALU都在运算器当中

从主存来的数据直接放到暂存寄存器就OK了

需要等待信号稳定了再送入/送出ALU

采用这种大家都接入总线的方式,就使得A、B两端的接线大大减少了,只有32根数据线就好了

每个通用寄存器都有输入线和输出线,用以控制数据的流入/流出

控制器的组成

小结:

 

指令的译码比取指令要快得多,因为它不需要访存是在CPU内部实现的,因此一个指令周期至少要由取指周期和执行周期2部分组成,一个指令周期又由多个时钟周期组成(参考CPU的主频),一个微操作对应的就是一个时钟周期

执行指令有可能需要访存也可能不访存

指令周期》机器周期(CPU周期)》时钟周期

间接寻址就是指针

使用触发器来保存当前CPU处于什么阶段!!!

这样使用统一的时钟部件,CPU知道自己处于指令执行的哪个阶段了,就会由于电信号1的作用去自动地做这个阶段应该做的事情

同理:我们的系统总线也通过总线控制器发出统一的时钟,这样各个设备就都知道自己当前处于什么阶段了(也就是说设备内部的电路可以选择执行相应的操作了),如果没有准备好相应的工作,就给总线控制器发送一个WAIT信号,这样CLK就会被锁存在上一个周期了,可以等你一会

指令流水线:在指令执行的不同阶段,所需要使用的部件(寄存器/内存等) 是不一样的,因此多条指令可以并行执行(把取指令、取有效地址、执行指令分开执行)

数据流向:主存《》寄存器  寄存器《》寄存器  ALU《》寄存器

图中所有的in和out控制信号都和微操作发生器有连线

采用单总线结构同时只允许2个部件之间进行数据交换 

专用数据通路:在两个寄存器之间单独建立一个通路

PCin IRout这些信号都是由CU发出的

地址信息准备完成之后应当撤销刚刚的2个控制信号让总线空闲

PC+"1"可以单独设置一个加法器啊😎,这样不就是自动+"1"吗???

专用数据通路练习题: 

2) (PC) -> MAR    M(MAR) -> MDR   MDR -> IR

专用数据通路意味着可能有多个输入/输出信号到达,所以需要使用多路选择器MUX或者三态门来控制放行哪一路信号(根据信号控制器的信号来决定)

5.4.1 硬布线控制器的设计

一条微指令(T0)又有可能由一个/几个微命令组成,每发出一个微命令就执行一个微操作

如果控制单元EU采用硬布线方式来设计,这种控制器就叫做硬布线控制器

根据FE、IND、EX、INT来判断此时处于指令周期的哪个机器周期

节拍发生器其实就是一个循环,它从0数到N你这个机器周期就结束了,他也不知道是哪个机器周期也无须知道!!!

一旦你FE信号接通之后,CLK就开始打节拍,FE+T0就会控制电路执行第一个微操作

其实就和你做眼保健操一样的,广播先喊第几节,比如:第一节按揉耳垂眼穴,脚趾抓地,你就知道该做第一节了,然后它再喊12345678 22345678...每个节拍你就会执行这一节的相关动作了!!

PSW标志位等信息可能会影响到接下来的微操作序列的执行流

5.4.2 微程序控制器的设计

每条指令对应一段微程序,它由一系列微指令组成

操作控制:这条微指令对应哪几种微操作(比如:1->R 1->W PCout MDRin) 

顺序控制:下一条微指令所在地址

顺序逻辑:指令不一定都是顺序执行的,如果有中断发生,微指令执行的顺序会发生变化

微指令是最小的执序行列,一次执行不能被打断,只有执行下一条微指令的时候才会检查中断

只有执行周期的微程序是不一样的 

这里跟大家重点分析一下:一开始的取指周期不需要操作码参与,直接执行就完事了,然后执行完取指周期之后下地址是3但是送到顺序逻辑的时候,它会根据指令的寻址特征位的标志判断是否需要执行间址周期的微程序,同样地,执行完取指令周期之后如果不是间接寻址此时才会根据OP来确定这条执行周期的指令地址在哪里

5.4.3 微指令的设计 

一个微命令对应的是一条线的接通比如1 -> W  MARin接通

因为有些微命令使用的寄存器等部件不同,可以同时执行,因此有时一条微指令可能对应多个微命令

注意看:这里的操作控制字段当中的每一位就代表了一个微操作(比如:PC -> MAR),可以并行发出操作命令

其实采用这种方式就彳亍🙂

如何确定下地址?

注意看,这个男人...偶不,LDA等执行周期的最后一条微指令的下地址是0,这样回到取指周期之后执行相应的微操作(PC+"1")就可以顺利地去执行下一条指令了耶!!! 

微指令:取指执行的小的那个,可能对应多个微操作

取指周期的第一条微指令由硬件自动给出,直到取指周期结束才会根据操作码来确定执行周期的指令流,其中每个微指令执行结束都会有一个节拍来形成下地址

5.6.1 指令流水线 

考虑到有些时候每个指令周期所使用的硬件部件不相同,所以可以采用流水线的方式来执行每个指令周期的指令,从而让CPU充分忙碌起来

指令流水线方式:只有第一条指令消耗3t,剩余n-1个指令周期都消耗t

加速比:不使用流水线的T0/使用流水线的Tk

完成一个任务消耗k▲t,传统方式消耗:k▲t*n,指令流水线方式k▲t+(n-1)▲t(只有第一个周期需要k▲t,剩下的n-1个周期都只需要▲t)

5.6.2 阻碍指令流水线完美执行的因素

导致流水线的各个阶段没有那么完美衔接的原因是什么呢?

所有指令都安排这5个机器周期,不管你有没有这个机器周期,每个阶段的耗时也取最长的耗时(这样画图的时候才能对齐嘛,这样不就可以根据时钟周期来填入不同的指令了吗???),多出来的那一点时间使用锁存器锁住,到达指定节拍(比如200)的时候统一释放

根据局部性原理,取指阶段的大部分指令都可以通过cache直接获取,当然如果cache不命中的话就必须去访问主存,这样指令流水线就会出现断流的情况

分成指令cache和数据cache的原因就是可以支持这两个操作并行地执行(使用不同的硬件部件)

imm是用来存立即数的,RISC执行阶段处理的数据都是来着通用寄存器/立即数

改变PC:jmp call 中断

写回阶段指的是修改通用寄存器里的值(RISC是这样的,都是用寄存器来保存运算结果)

5.7 多处理器系统

一个CU多个ALU,指令的执行不是并行的,但是数据的处理是并行的

CU向多个执行部件发出相同的控制信号

在一个for循环当中对数组元素进行++:arr[i]++,可以把大的数组分成几块分别放到局部存储器当中,并使用不同的ALU来对他们进行++操作;使用显卡进行像素点的渲染亦是如此!!

共享一个物理地址空间 

多核之间仅共享最低一级的cache

线程切换需要把寄存器的值存到内存当中,这是线程切换的主要开销,因此可以设计硬件多线程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1156704.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

3201. 任务调度

有若干个任务需要在一台机器上运行。 它们之间没有依赖关系,因此可以被按照任意顺序执行。 该机器有两个 CPU 和一个 GPU。 对于每个任务,你可以为它分配不同的硬件资源: 在单个 CPU 上运行。在两个 CPU 上同时运行。在单个 CPU 和 GPU 上同时运行。在两…

RabbitMQ消息队列笔记

目录 docker Java 导包 配置文件 Work Queues 消息堆积 消息生产者发送消息到队列 消息消费者接收消息 Fanout交换机 Direct交换机发送消息 用Java代码创建交换机和队列、绑定 Direct交换机 Direct交换机发送消息 用Java代码创建交换机和队列、绑定 基于注解声明队…

Rust 语言常见的一些概念(上)

目录 1、变量的可变性 常量 隐藏 2、数据类型 2.1 标量类型 整型 浮点型 数值运算 布尔型 字符类型 复合类型 元组类型 数组类型 1、变量的可变性 变量默认是不可改变的(immutable)。这是 Rust 提供给你的众多优势之一,让你得以…

win32 读写UTF-8格式的文件的方法

1,写入数据 最开始是在写入数据前先写入三个字节 BYTE btHead[] { 0xEF,0xBB,0xBF }; ::WriteFile(hFile, btHead, 3, &dwWrite, 0); ::WriteFile(hFile, str, lstrlen(str)*sizeof(TCHAR), &dwWrite, 0);这样写入后文件样式为: 格式是UTF-8…

基于Python制作一个动物识别小程序

目录 引言研究背景目的与意义 动物识别技术概述基本原理图像处理与特征提取机器学习与深度学习方法 数据集与数据预处理数据收集与构建数据预处理步骤数据增强技术 特征提取与选择基础特征提取方法特征选择与降维 引言 研究背景 动物识别是计算机视觉和模式识别领域的重要研究…

《深入浅出OCR》实战:基于CRNN的文字识别

✨专栏介绍: 经过几个月的精心筹备,本作者推出全新系列《深入浅出OCR》专栏,对标最全OCR教程,具体章节如导图所示,将分别从OCR技术发展、方向、概念、算法、论文、数据集等各种角度展开详细介绍。 💙个人主页: GoAI |💚 公众号: GoAI的学习小屋 | 💛交流群: 7049325…

在python中加载tensorflow-probability模块和numpy模块

目录 操作步骤: 注意: 问题: 解决办法: 操作步骤: 在虚拟环境的文件夹中,找到Scripts文件夹,点击进去,找到地址栏,在地址栏中输入cmd,进入如下界面。 输…

国产数据库兼容过程中涉及的MySQL非严格模式

点击上方蓝字关注我 在国产数据库兼容适配过程中,经常遇到因源数据库是MySQL,迁移至其他国产数据库后,因MySQL端兼容模式有非严格模式,导致适配过程过程中需要做调整。那么,MySQL主要的非严格模式小结如下:…

约会杭州云栖2023:为了无法计算的价值一起努力

🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌,CSDN博客专家,阿里云社区专家博主,2023年6月CSDN上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师…

C++初阶 类和对象(上)

前言:C初阶系列,每一期博主都会使用简单朴素的语言将对应的知识分享给大家,争取让所有人都可以听懂,C初阶系列会持续更新,上学期间将不定时更新,但总会更的 目录 一、什么是面向对象编程 二、什么是类和如…

AST反混淆实战|变种ob混淆还原指南一

关注它,不迷路。 本文章中所有内容仅供学习交流,不可用于任何商业用途和非法用途,否则后果自负,如有侵权,请联系作者立即删除! 1.需求 ob混淆是我们最常见的混淆代码,标准的混淆 可以用星…

如何读懂深度学习python项目,以`Multi-label learning from single positive label`为例

Paper : Multi-label learning from single positive label Code 先读一读README.md 可能有意想不到的收获; 实验环境设置要仔细看哦! 读论文 如何读论文,Readpaper经典十问 (可能在我博客里有写) How to read a …

【UE5】如何在UE5.1中创建级联粒子系统

1. 可以先新建一个actor蓝图,然后在该蓝图中添加一个“Cascade Particle System Component” 2. 在右侧的细节面板中,点击“模板”一项中的下拉框,然后点击“Cascade粒子系统(旧版)” 然后就可以选择在哪个路径下创建级…

Notepad++下载、使用

下载 https://notepad-plus-plus.org/downloads/ 安装 双击安装 选择安装路径 使用 在文件夹中搜索 文件类型可以根据需要设置 如 *.* 说明是所有文件类型; *.tar 说明是所有文件后缀是是tar的文件‘;

【Rust日报】2023-10-30 理解 Rust 中的生命周期

理解 Rust 中的生命周期 生命周期(Lifetime)是让 Rust 成为 Rust 的关键因素。 没有了生命周期,轻松的并发、直接的内存分配和整体的数据安全都是不可能的。 但是,生命周期也很难理解,这篇教程会帮助人们理解生命周期的…

【强化学习】13 —— Actor-Critic 算法

文章目录 REINFORCE 存在的问题Actor-CriticA2C: Advantageous Actor-Critic代码实践结果 参考 REINFORCE 存在的问题 基于片段式数据的任务 通常情况下,任务需要有终止状态,REINFORCE才能直接计算累计折扣奖励 低数据利用效率 实际中&#…

【Java】多线程案例(单例模式,阻塞队列,定时器,线程池)

❤️ Author: 老九 ☕️ 个人博客:老九的CSDN博客 🙏 个人名言:不可控之事 乐观面对 😍 系列专栏: 文章目录 实现安全版本的单例模式饿汉模式类和对象的概念类对象类的静态成员与实例成员 懒汉模式如何保证…

C++设计模式_21_Iterator 迭代器(理解;面向对象的迭代器已过时;C++中使用泛型编程的方式实现)

Iterator 迭代器也是属于“数据结构”模式。GoF中面向对象的迭代器已经过时,C中目前使用泛型编程的方式实现,其他语言还在使用面向对象的迭代器。 文章目录 1. 动机(Motivation)2. 模式定义3. Iterator 迭代器代码分析4. 面向对象的迭代器与泛型编程实现…

一天写一个(前端、后端、全栈)个人简历项目(附详源码)

一、项目简介 此项目是用前端技术HTMLCSSjquery写的一个简单的个人简历项目模板,图片可点击放大查看,还可以直接下载你的word或者PDF的简历模板。 如果有需要的同学可以直接拿去使用,需自行填写个人的详细信息,发布,…

uniapp 开发微信小程序 v-bind给子组件传递函数,该函数中的this不是父组件的二是子组件的this

解决办法:子组件通过缓存子组件this然后,用bind改写this 这个方法因为定义了全局变量that 那么该变量就只能用一次,不然会有赋值覆盖的情况。 要么就弃用v-bind传入函数,改为emit传入自定义事件 [uniapp] uview(1.x) 二次封装u-navbar 导致…