计算机组成原理汇总

news2024/11/17 7:52:17

提示:日落归山海,山海藏深情

文章目录

  • 1.1 计算机的发展
  • 1.2 计算机硬件的基本组成
  • 1.3 计算机的性能指标
  • 2.1.1 进位计数制
  • 2.1.2 BCD码
  • 2.1.3 无符号整数的表示和运算
  • 2.1.4 带符号整数的表示和运算(原反补)
  • 2.1.5原反补码的特性对比
  • 2.1.6 移码
  • 2.1.7 定点小数
  • 2.2.0 奇偶校验码(大纲已删)
  • 2.2.1 电路的基本原理 加法器设计
  • 2.2.2 并行进位加法器
  • 2.2.3 补码加减运算器
  • 2.2.4 标志位的生成
  • 2.2.5 定点数的移位运算
  • 2.2.6
    • 2.2.6.1 原码的乘法运算
    • 2.2.6.2 补码的乘法运算
  • 2.2.7.1
    • 原码的除法运算
  • 2.2.7.2 补码的除法运算
  • 2.2.8 c语言的类型转换
  • 2.2.9 数据的存储和排列
  • 2.3.1 浮点数的表示
  • 2.3.2 IEEE754
  • 2.2.3 浮点数的运算
  • 3.1 存储系统基本概念
  • 3.2.1 主存储器的基本组成
  • 3.2.2 SRAM DRAM\
  • 3.2.3 只读存储器ROM
  • 3.3.1 主存储器与CPU的连接
  • 3.3.2 双端口RAM和多模块存储器
  • 3.4.1 磁盘存储器
  • 3.4.2 固态硬盘SSD
  • 3.5.1 Cache的基本概念和原理
  • 3.5.2 Cache和主存的映射方式
  • 3.5.3 Cache替换算法
  • 3.5.4 Cache写策略
  • 3.6.1 页式存储
  • 3.6.2 虚拟存储器
  • 4.1.1 指令格式
  • 4.1.2 扩展操作码指令格式
  • 4.2.1 指令寻址
  • 4.2.2 数据寻址
  • 4.2.3 偏移寻址
  • 4.2.4 堆栈寻址
  • 汇总
  • 4.3.1 高级语言与机器级代码之间的对应
  • 4.3.2 常用的X86汇编指令
  • 4.3.3 ATu0026T格式和Intel格式
  • 4.3.4 选择语句的机器级表示
  • 4.3.5 循环语句的机器级表示
  • 4.4 CiSC和RiSC
  • 5.1 CPU的功能和基本结构
  • 5.2 指令周期的数据流
  • 5.3.1 单总线结构
  • 5.3.2 专用通路结构
  • 5.4.1 硬布线控制器的设计
  • 5.4.2 微程序控制器的基本原理
  • 5.4.3 微指令的设计
  • 5.4.4 微程序控制单元的设计
  • 5.6.1 指令流水线的基本概念
  • 5.6.2 指令流水线的影响因素和分类
  • 五段式指令流水线
  • 5.7.1 多处理器的基本概念
  • 5.7.2 硬件多线程的基本概念
  • 6.1.1 总线概述
  • 6.1.2 总线的性能指标
  • 6.2 总线仲裁(408不考)
  • 6.3 总线操作和定时
  • 7.1.1 输入输出系统和IO控制方式
  • 7.1.2 外部设备
  • 7.2 IO接口
  • 7.3.1 程序查询方式流程图
  • 7.3.2 中断的作用和原理
  • 7.3.3 多重中断
  • 7.3.4 程序中断方式
  • 7.3.5 DMA 方式


1.1 计算机的发展

计算机系统=软件+硬件
软件分为系统软件和应用软件
系统软件:用来管理整个计算机系统(eg:操作系统,数据库管理系统,标准程序库,网络软件,语言处理程序,服务程序)
应用软件:按任务需要编制成的各种程序(eg:抖音,王者荣耀,迅雷等)
硬件的发展
第一台电子数字计算机:ENIAC(手动接线来控制计算) 1946 逻辑元件:电子管
第二代:逻辑元件:晶体管
第三代:逻辑元件:中小规模集成电路,将元件集成在基片上
第四代:逻辑元件:大规模,超大规模集成电路,开始出现“微处理器”,微型计算机 ,个人计算机pc 萌芽 苹果A13制造工艺:7nm 也就是每一个逻辑元件不超过七纳米的工艺水平,微处理器8080机器字长8位,微处理器8086机器字长16位
摩尔定律:揭示了信息技术进步的速度,集成电路上可容纳的晶体管数目,约每隔18个月便会增加一倍,整体性能也将提升一倍
计算机硬件的基本组成:早期冯诺依曼机的结构,现代计算机的结构

1.2 计算机硬件的基本组成

早期冯诺依曼机
请添加图片描述

“存储程序”的概念是指将指令以二进制代码的形式事先输入计算机的主存储器,然后按其在存储器中的首地址执行程序的第一个指令,以后就按该程序的规定顺序执行其他指令,直到程序执行结束,就不需要每一步都进行手工连接的操作,进而来提高速度
输入设备:将信息转换成机器能识别的形式
存储器:存放数据和程序
运算器:算术运算逻辑运算
输出设备:将结果转换成人们熟悉的形式
控制器:指挥程序运行,控制器从存储器中读取一个指令的数据流,这样他才会指挥运算器
在计算机系统中:软件和硬件在逻辑上是等效的,意思也就是同一个功能可以使用软件实现,但是也可以使用硬件实现,eg:对于乘法运算,可以设计一个专门的硬件电路实现乘法运算也可以用软件的方式,执行多次加法运算来实现
冯诺依曼计算机的特点:1:计算机由五大部件组成,2:指令和数据以同等地位存于存储器,可按地址寻访,3:指令和数据用二进制表示 4:指令由操作码和地址码组成 5 存储程序,6 以运算器为中心,输入/输出设备与寄存器之间的数据传送通过运算器完成
现代计算机的结构
请添加图片描述

以存储器为中心, 输入输出设备直接从存储器存取数据,这样就可以解放更多的运算器的时间,由于运算器以及控制器的关系十分紧密,所以在大规模集成电路出现之后,这两个东西通常被集成于同一个芯片上,这个芯片通常也就叫cpu,cpu通过控制线控制运算器,你接下来要执行的是什么操作,另外控制器也会控制主存储器的一个读写,以及输入输出设备的启动与停止,主存储器也会与cpu进行数据的交换,第一种就是参与运算的数据会放在运算器中,指令会放在控制器中,由控制器来进行解析,并发出相应的控制信号,主存储器和cpu统称为主机,主存和辅存统称为存储器,这里要注意主存(运行内存)属于主机,而辅存(机身存储)属于i/o设备
主存储器的基本组成
请添加图片描述

主存储器有三个部分:存储体,MAR,MDR
主存储器中用于存储数据的东西叫做存储体,存储体是由一系列的存储元件组成的,可以存放二进制的零或者一
MAR: 存储地址寄存器
MDR:存储数据寄存器
cpu会将它想读的数据的地址写到MAR中,主存储器就可以根据MAR中的地址并把数据先写到MDR中去,最后cpu就可以通过数据线路从MDR中取走数据,写也是同样的操作 cpu会将要写的数据的地址放在MAR中,将数据存放在MDR中,最后cpu会通过控制总线告诉主存储器,这次要执行的是写操作 主存储器可根据这三个信息便可写入数据
存储单元:每个存储单元存放一串二进制代码,存储字:存储单元中二进制代码的组合,存储字长:存储单元中二进制代码的位数,存储元:既存储二进制的电子元件,每个存储元可存1bit
运算器的基本组成
运算器:用于实现算术运算,逻辑运算
ACC:累加器,用于存放操作数,或者运算结果
MQ;乘商寄存器,在乘,除运算时,用于存放操作数或者运算结果
x:通用 的操作数寄存器,用于存放操作数
ALU(核心单元):算术逻辑单元,通过内部复杂的电路实现算数运算,逻辑运算
控制器的基本组成
CU:(核心单元)控制单元,分析指令,给出控制信号
IR:指令寄存器,存放当前执行的指令
PC:程序计数器,存放下一条指令地址,有自动加1功能
完成一条指令:取指令PC 分析指令IR 执行指令CU

请添加图片描述
请添加图片描述

请添加图片描述

请添加图片描述
请添加图片描述

计算机系统的层次结构
请添加图片描述

下层是上层的基础,上层是下层的扩展
编译程序:将高级语言编写的源程序全部语句一次全部翻译成机器语言程序,而后再执行机器语言程序(只需翻译一次,生成.exe文件,下次直接点击exe文件即可)
解释程序:将源程序的一条语句翻译成对应机器语言的语句,并立即执行,紧接着再翻译下一句(每一次执行都要翻译)

1.3 计算机的性能指标

存储器的性能指标
MAR位数反映存储单元的个数(最多支持多少个)
MDR位数=存储字长=每个存储单元的大小
总容量=存储单元个数存储字长(bit) 1Byte=8bit
cpu主频(时钟频率):cpu内数字脉冲信号震荡的频率 等于时钟周期分之一
cpi:执行一条指令所需要的时钟周期数(不同的指令,cpi不同,甚至相同的指令,cpi也可能有变化)
执行一条指令的耗时=cpi
cpu 时钟周期
IPS每秒执行多少条指令,IPS=主频/平均CPI

系统整体的性能指标
数据通路带宽:数据总线一次所能并行传送信息的位数(各硬件部件通过数据总线传输数据)
吞吐量:指系统再单位时间内处理请求的数量 系统的吞吐量主要取决于主存的存取周期
响应时间:指用户向计算机发送一个请求,到系统对该请求做出响应并获得它所需要的结果的等待时间
基准程序是用来测量计算机处理速度的一种实用程序 也就是跑分软件

2.1.1 进位计数制

任意进制转化十进制
二进制转化为八进制
三个二进制数正好可以表示八种不同的状态
以小数点开始左右3位为一组,每组转化为对应的八进制符号(高位整数补零,地位小数补零)
请添加图片描述

二进制转化为十六进制
四个二进制数正好可以表示十六种不同的状态
以小数点开始左右4位为一组,每组转化为对应的16进制符号
请添加图片描述

八进制转化二进制
请添加图片描述

十六进制转化为二进制
请添加图片描述

进制的常见书写方式
二进制以B结尾,八进制以O开头,十六进制以H结尾或者以0x开头,十进制以D结尾
请添加图片描述

十进制转化为任意进制
请添加图片描述

方法一
(除基取余法整数部分):任意一个整数都可以写成整数X(R的一次方,二次方,一直到n-1次方,所以是可以整除的)部分加上余数K0(0~R)部分 ,所以我们除以R之后得到余数K0便是R的零次方上的数值,再用得到的商再除以R得到的便是K1(先取得的余是整数的低位
请添加图片描述

(乘基取整法小数部分):核心思想也是一样 想办法把K-1算出来,这里发现乘上一个R便可直观的得到K-1的值 ,得到的结果再乘R得到的便是K-2的值(先取得的整是小数的高位
请添加图片描述

方法二(拼凑法)
若是给你的十进制数不是特别大的话,可能使用这些拼拼凑凑的方法可能要快一些,假如要将十进制转化成八进制,完全可以先转化成二进制,然后二进制再三位一组转化为八进制
小结回顾
请添加图片描述

2.1.2 BCD码

BCD:用二进制编码的十进制
8421码
通过上述我们知道要想表示0~9这十个数,必须最少需要4bit,而4bit则可以表示16个值 ,这样也就会有6个yong余,8421码的提出便是为了快速转换
8421码的相加:若是两个数对应的8421码相加的结果不在映射表中,也就是落到了10~15这个区间这个时候我们再加上6 这样就一定会向高位进一个1,而低位所留下的部分又正好是我们个位所留下的部分
请添加图片描述

余3码
也就是在8421码的基础上加上一个0011得到不同的映射关系,
2421码
我们依然是使用四个二进制位来表示一个十进制位,不过这四个的权值是2421,同样需要注意0 ~ 4第一位都是零,5 ~ 9第一位则一定是1 这也是为了避免同一个值有不同的2421码(如5 0101或1011)
请添加图片描述

回顾
请添加图片描述

2.1.3 无符号整数的表示和运算

这里主要探讨两个问题,无符号整数,在计算机硬件内,如何表示,无符号整数的加法,减法运算时怎么用硬件实现的
机器字长限定了每一次只能进行几个bit运算,机器字长也限制了通用寄存器只能有多少位
无符号整数
全部二进制位都是数值位,没有符号位,第i位的位权是 2的i-1次方,n bit无符号整数表示的范围0~2的n次方-1 超出则溢出,意味着计算机无法一次处理这么多,可以表示的最小的数全是0,可以表示的最大的数全是1
无符号整数的减法运算
被减数不变,减数全部按位取反,末位+1 减法变加法,从最低为开始,按位相加,并往最高位进位
请添加图片描述

知识点回顾
请添加图片描述

2.1.4 带符号整数的表示和运算(原反补)

首先我们这节主要解决的是带符号整数,在计算机硬件内,如何表示,第二带符号整数的加法,减法运算是如何用硬件实现的?
同一个带符号整数可以用不同的编码方式表示 ,这便是原码 补码 反码,形式不同但是含义相同
原码表示法
分为符号位和数值位 符号位0正1负 其实也就是之前的表示方式,不过是使用一位来表示正负,其他的依然如之前的表示,注意这里假设的机器字长是n+1
请添加图片描述
原码的缺点:符号位不能参与运算,需要设计复杂的硬件电路才能处理,所以聪明的科学家也就想到了用补码来表示真值——符号位可以参与运算(正数的补码可以解释为位权,负数的补码不能解释为位权)

  • 方法 一*
    正数的原码,反码,补码都是不变的
    负数的原码到反码是符号位不变,数值位取反,然后末位+1得到补码
    若是让你根据补码来求反码,你可以先求原码再求反码(这里使用的方式是第二种,从右往左找到第一个1 这个1左边的所有数值位按位取反便可得到原码)
    请添加图片描述

方法二
从右往左找到第一个1,这个1左边的所有“数值位”按位取反(按照之前我们计算机计算的方法,把所有的数值位按位取反,末位加一个一,若是反码最后一个是一,并且这个一前面也是一,就会导致不断的向前进位,直到前面那个是零才会停止,也就导致从右往左第一个1的右边的值与原码是一致的,所以这也就是为什么我们从右往左找到第一个1,这个1左边的所有数值按位取反便可得到补码)
请添加图片描述

方法一是计算机处理的方式,我们若是手算的话 推荐第二种
带符号整数加法运算
从低位开始,按位相加(符号位参与运算),并往更高位 进位
请添加图片描述
带符号整数减法运算
A-B=A+(-B),也就是将减数取负值,所以也就有了全部位取反
方法一:首先是全部位按位取反,然后末位加一,与上面负数求补码有所不同(符号位不变,数值位取反)
方法二:与之前类似,从右往左找到第一个1,此1左边的全部取反(之前负数求补码是数值位取反,这里是全部),右边的不变便可得到原码或者补码
请添加图片描述
这也就能和之前的无符号的减法相联系,减数 全部取反,末位加1,相联系
知识点回顾
请添加图片描述

2.1.5原反补码的特性对比

注意加红的即可,如若是-64-64 结果保存在原码中则会溢出,若是保存于补码中则不会溢出

请添加图片描述

2.1.6 移码

补码的基础上将符号位取反
请添加图片描述
请添加图片描述

请添加图片描述

2.1.7 定点小数

反码,补码和上面是一样的 这里看一下区别
请添加图片描述
另外一个需要注意的地方就是取值范围以及最小的数,还有真值零的表示
请添加图片描述

2.2.0 奇偶校验码(大纲已删)

在有效信息位的首部或者尾部加上一位奇偶校验位
奇校验码:整个校验码(有效信息位和校验位) 中“1”的个数为奇数个
偶校验码:整个校验码(有效信息位和校验位)中“1”的个数为偶数
其实也就是数给定的编码中1的个数, 若是奇校验码,其中有效信息码中1的个数为奇数个,则校验位添加0 若是有效信息码中1的个数为偶数个,则校验位添加1,
偶校验的硬件实现,各信息进行异或(模2加)运算,得到的结果即为偶校验位,然后进行偶校验(所有位进行异或,若结果为1,说明出错,但是若是同时有两个bit发生错误,则进行偶校验也是不能发现错误的)

2.2.1 电路的基本原理 加法器设计

这里主要讲三个部分,算数逻辑单元的作用,大致原理,电路基础知识,加法器的实现,与类似C语言&& 表达式Y=A*B “或”类似“||” 表示式Y=A+B,但是要注意优先级“与”是大于“或”的,同时满足分配律以及结合律如A(C+D)=AC+AD ,再如ABC=A(BC),异或相同是零,相异是一 同或 相同是一,相异是零,与异或正好相反
一位全加器两个本位和一个来自低位的进位可以确定本位的和并且也能确定应该向高位进一个什么样的值,
请添加图片描述
串行加法器
只有一个全加器,数据逐位串行送入加法器中进行运算,进行触发器用来寄存进位信号,以便参与下一次运算,如果操作数长n位,加法就要分n此进行,每次产生一位和,并且串行逐位地送回寄存器,所以这张串行加法器的效率较低
请添加图片描述
并行加法器
把n个全加器串联起来,就可以进行两个n位数的相加,串行又称为行波进位,每一级进行直接依赖于前一级的进位,既进行信号是逐级形成的,所以这种加法器的快慢却决于每一位进位的速度
请添加图片描述

本节总览

请添加图片描述

2.2.2 并行进位加法器

上述的时候我们讲过 速度很大程度上取决于进位的速度,这里我们可以发现进位的表达式又可以用更低一位的进位表达,这里也就是数学中的递推法 最终我们发现每一级是可以使用C0表示的,也就意味着我们可以直接算出每一个全加器的值,也就意味着每一个进位几乎都是同时产生的,但是这样也有一个缺点就是会导致设计的电路越来越复杂,所以通常是有四个全加器和一些运算逻辑组成
请添加图片描述

2.2.3 补码加减运算器

也就是从硬件的角度来看补码的加减运算是如何实现的,如下图,若是我们进行的是X+Y 则此时Sub也就是0 此时控制多路选择器 Y的值直接通过,若是X-Y 此时Sub也就是1,此时控制多路选择器打开1这个开关,而Y也要进行非操作,此时再加上sub 中的这个一,也就实现了减法变加法(全部位取反,末位值加一)

请添加图片描述

入下 计算机的底层逻辑在处理加法或者减法的时候是,无论是有符号数还是无符号数都是通过同一个电路来处理的,但是最后我们判断是否溢出的时候,有符号数的判断逻辑和无符号数的判断逻辑是存在显著的区别的
请添加图片描述
请添加图片描述

2.2.4 标志位的生成

两个nbit的数相加,除了生成一个nbit的值外 同时也会生成四个标志位如下
请添加图片描述

2.2.5 定点数的移位运算

移位:通过改变各个数码位和小数点的相对位置,从而改变数码位的位权,可用移位运算实现乘法和除法,原码的算数移位——符号位保持不变,仅对数值位进行移动,右移:高位补0,低位舍弃,若舍弃的位=0,则相当于/2 若舍弃的位!=0 则会丢失精度,其实这些也是可以理解的,原码到反码的过程中有一个是全部取反,自然左边高位是补一,而反码又要加一,自然作用到补码上低位也就是补零
请添加图片描述

循环移位
不带进位位:用移出的位补上空缺,带进位位,移出的位放到进位位,原进位位补上空缺

2.2.6

2.2.6.1 原码的乘法运算

这节主要讲三个问题,乘法运算的实现思想,原码的一位乘法,补码的一位乘法
乘法运算的实现思想将乘数拆成多个数相加,再用被乘数分别与这些乘数进行相乘再相加,但是这里考虑到机器实现有三个问题,1,实际数字有正负,符号位如何处理?,2,乘积的位数扩大一倍,如何处理?,3,4个位积都要保存下来最后统一相加?
问题一:符号位单独处理,符号位=A异或B
问题二:先加法再移位 重复n次,当前位=1,则ACC加上被乘数,当前位=0,则ACC加上0,每次乘完之后 在进行移位,然后乘积高位往右移动,继续看乘数的乘低位,为1则与乘积高位相加,结果放在乘积高位中,在移动,再继续看乘积低位
请添加图片描述问题三:你会发现这里的结果不是每一个算出来 然后相加 而是一位算出来就放在ACC与MQ中了
这里使用的是双符号位,但是使用单符号位也不会出错,至于这里为什么使用双符号位,可能是因为补码的乘法一定要使用双符号位,这里可能是与补码保持统一
请添加图片描述

2.2.6.2 补码的乘法运算

和原码的移位加法相似,但是还需要多来一次加法,最后的这一次加法会让乘数的符号位也参与运算,只有加法没有移位,如下图MQ红色部分既是这里所说的辅助位,所有寄存器的长度一般都是统一的,所以这里的补码采用的是双符号位的形式,
请添加图片描述
如对下图的解析,第一步的时候,辅助位-MQ中的最低位为-1,这个时候加上乘数的补码 然后ACC和MQ统一右移,符号位不动,数值位右移,正数右移补0 负数右移补1(符号位是啥就补啥),Y5是这里的辅助位,Y4是这里MQ中的最低位
请添加图片描述
知识点回顾
请添加图片描述

2.2.7.1

原码的除法运算

如下图ACC中保留的是被除数 MQ中保留的是商 通用寄存器中保留的是除数,本来我们的想法是比较ACC与通用寄存器中的值来确定商的值,但是计算机很傻,会先默认商一,若是检查到ACC中的符号位是1(负)此时也就会修改商上面的值让其为0 并且让ACC恢复原样,然后减去除数,ACC与MQ整体左移低位补零,然后依然是默认商1,若是最后一步商余数为负,也需要回复余数并商零
请添加图片描述
恢复余数法(手算)
根据所得余数的符号位的正负来确定商应该是0或者1
请添加图片描述
恢复余数法的改进
若余数为负,则可直接商0,并让余数左移一位再加上除数
请添加图片描述
不恢复余数法(手算)
请添加图片描述

2.2.7.2 补码的除法运算

请添加图片描述

2.2.8 c语言的类型转换

C语言中定点整数是用“补码”存储的
所以进行强制转化的时候
无符号数和有符号数:不改变数据内容,改变解释方式
长整数变短整数:高位截断,保留低位
短整数变长整数:符号扩展

2.2.9 数据的存储和排列

大小端模式
小段读取的方式更有利于机器的处理:计算机首先从计算机读入的最低有效字节 这样CUP在处理加法的时候,这样从低有效字节读入是有利于处理的
请添加图片描述
边界对齐
这个东西通常是结构体定义的时候,比如下图我们定义了三个char型变量 三个short型变量,还有一个short型变量,若是按照边界不对齐的方式,我们读取第一个short变量的时候需要两次访问并进行拼接,而上边界对齐则一次访问便可,且不需要拼接,一种空间换取时间的策略
请添加图片描述

2.3.1 浮点数的表示

浮点数的作用和基本原理
定点数可表示的数字范围有限,但我们不能无限制地增加数据的长度
将一个数值用阶码和尾数来表示,这样表示的数值的范围就大大增加了,
请添加图片描述

浮点数规格化
尾数的最高位是无效位会丧失精度,规定尾数的最高数值位必须是一个有效值
左规:当浮点数运算的结果为非规格化时要进行规格化处理,讲尾数算数左移一位,阶码减一
右规:当浮点数运算的结果尾数出现溢出,(双符号位为01或10,双符号位中的更高位表示我们当前数值的正负性)时,将尾数算数右移一位,新空出的位置与与双符号位保持一致,这里也就是零,最后阶码加一
采用双符号位,当溢出发生时候,可以挽救,更高的符号位是正确的符号位

请添加图片描述

浮点数的表示范围
这里要注意用补码表示的负数的尾数,我们为了计算机处理起来方便,我们规定数值位的最高位必须是0,正数依然是1,也就是当符号位为0的时候 数值位为1 当符号位为1的时候数值位为0,如下图右下的例题,我们知道负数的补码是补1的,并且规格化是需最高位为0的,所以也就需要算数左移三位,此时阶码值就要减3
请添加图片描述
知识点回顾
请添加图片描述

2.3.2 IEEE754

移码
我们上面说过阶码可以使用移码或者补码来,尾数也可以使用原码或者补码来表示,所以也就需要某些标准,
补码的基础上将符号位取反就能得到移码,注意移码只能用于表示整数
移码的定义:移码=真值+偏置值,此处8位移码的偏置值=128d=1000 0000B 偏置值一般取128D 此时移码=补码符号位取反,IEEEE754取的偏置值127时,此时对于真值-128=1000 0000B 移码=-1000 0000 +0111 1111=1111 1111(这里的计算时是发现被减数比减数要小,由于我们移码只有8bit,所以背后的这些加减运算都会进行mod128,我们可以在原有的基础上加上128,然后再减 此时得到的移码便是1111 1111)
请添加图片描述
IEEE754
这个表格需要记住,并且在计算时,可以将这个移码看成一个无符号数,然后用之前的计算方式 比如下图double中的蓝色部分的,可以看成无符号数128(移码)-1023(偏移量)
请添加图片描述
请添加图片描述
请添加图片描述
数值范围
之前我们说过-128(全1) -127(全0)有其他用处 所以这里阶码的最小值时-126,所以范围如下
请添加图片描述
虽然在偏置值为127 时,移码全0 事实上的对应的-127次方,但是这里下图我们会把它固定的视为-126次方,此时是正无穷还是负无穷是看其中的数符位
请添加图片描述

2.2.3 浮点数的运算

本节主要讲的是浮点数的加减法运算,以及强制类型转换
小阶向大阶靠齐是为了计算机内部硬件的实现方便

请添加图片描述
它的两个符号位是否相同 相同则没有越界,如这里的11 就没有越界请添加图片描述
舍入问题
除了右规的时候会面临舍入的问题,有的计算机可能会浮点数的尾数部分单独拆出来计算24bit->32bit 算完结果在经过舍入32bit->24bit再拼回浮点数
请添加图片描述
本节回顾
请添加图片描述

3.1 存储系统基本概念

存储器的层次结构
手机里面的辅存,也不是用磁盘来进行存储的,手机里面存储的软件什么的就是存储在辅存中的,但是cpu不能直接和辅存进行交互,当我们启动一个app,需要先将数据从辅存拿到主存中,这个时间是较长的,我们增加一个高速缓冲存储器是因为尽管我们的读写速度已经很快了,但是还是没有cpu 处理的速度快,所以计算机把那些有可能频繁访问的数据放在cache中,这样读取的速度也就更快
请添加图片描述
存储器的分类
存储不仅可以按照层次来进行分类
存储器也可以按照存储介质来进行分类以半导体器件存储信息,以磁性材料存储信息,以光介质存储信息,
还可以按照存取方式来进行分类,随机存取寄存器(RAM):读写任何一个存储单元所需时间都相同,与存储单元所在的物理位置无关,顺序存取寄存器(SAM)读写一个存储单元所需时间取决于存储单元的物理位置,直接存取存储器(DAM)既有随机存取特性,也有顺序存取特性,先直接选取信息所在区域,然后按顺序方式存取(磁头臂要前后移动,移动到要读写的那个区域,中间的马达带动磁盘进行转),后面这两种又称为串行访问存储器,读写某个存储单元所需要时间与存储单元的物理位置有关,这三种是根据地址来读写,还有一种是相联存储器:也可以按内容访问的存储器,可以按照内容检索到存储位置进行读写,“快表”就是一种相联存储器
按照信息的可保存性进行分类:断电后,存储信息消失的存储器,易失性存储器(主存,Cache,如手机关机后再开机很缓慢,这是因为本来信息丢失,重新将操作系统调入主存也是需要时间的,),断电后,存储信息依然保持的存储器——非易失性存储器(磁盘,光盘)
存储器的性能指标
1,存储容量:存储字数*存储字长(之前有提到过MDR位数反映存储字长,MAR又反映了存储字数是多少)
2,单位成本:每位价格=从成本/总容量
3,存储速度:数据传输率=数据的宽度/存储周期(数据的宽度即存储字长,存储周期,每个存储周期我们可以都或者写一个存储字这么多的数据)
请添加图片描述
知识回顾
主存——辅存:实现虚拟存储系统,解决了主存容量不够的问题
Cache——主存:解决了主存于cpu速度不匹配的问题
请添加图片描述

3.2.1 主存储器的基本组成

本节主要讲三个部分:半导体元件的原理,存储芯片的基本原理,如何实现不同的寻址方式,这里我们先学习半导体元器件存储0和1的原理,然后我们可以构成所谓的存储芯片,又因为存储芯片中存储了很多字的信息,所以存储芯片必须提供寻址的功能,最后我们来探讨不同的寻址方式如何实现
基本的半导体元件及原理
比如这里的MOS管,若是木有施加电压,或者施加的电压不足5V,那么这个MOS管就是绝缘体,就是不导电的,只有当上面接通的时候,这个电容才能存储电荷,如下图本来电容中已经存储了电荷,当我们施加一个五伏的电压的时候,此时这些0,或者1 就是顺着这条绿色的线导出,这样的一整行就是我们提到的存储单元,也就是一个存储字,所以一个存储子多少个bit具体要看存储体的具体结构是怎么样的,而多个存储单元也就构成了一个存储体,我们一次可以读出的就是一个存储字,就像下图的,这里的存储体只包含了两个存储单元
请添加图片描述

接下来我们要研究的就是如何根据地址来读或者要写那个存储字,这就涉及到译码器的使用,我们给出n位地址,就会对应2的n次方个存储单元,会根据地址将其转化成某一条字选线的高电平 然后根据这条绿色的线也就是数据线(位线),将其传送到MDR中,然后数据总线会从MDR中取走所有的数据,总容量=存储单元个数*存储字长
控制电路的作用,只用当MAR稳定之后,控制电路才会打开译码器的开关,同样的只有输出的信号稳定之后,控制电路才会认为此时的输出的正确无误的,另外存储芯片还需要向外提供一些线路 通常是片选线(作用是读指定芯片),通常是CS上一个扛 或者CE上一个杠,当然它是低电平的时候是有效的
请添加图片描述
寻址
现代计算机通常按字节编址(每个字节)即每个字节对应一个地址,按字节寻址,按字寻址,按半字寻址,按双字寻址
本节回顾
请添加图片描述

3.2.2 SRAM DRAM\

DRAM用于主存,SRAM用于Cache,所以本节我们首先来根据存储元件的不同来介绍为什么会出现不同的差异,还有就是DRAM的刷新,DRAM的地址线复用技术
存储元的不同
上面说过DRAM这种存储元所使用的栅极电容存储0或1的方式,但是当电容放电信息被破坏,是破坏性读出,读出后应有重写操作,也称“再生”,所以这种读出更慢,因为要重生,而且这个只需要一个MOS管,每个存储元制造成本更低,因此常被用来制造主存,集成度低,功耗高,并且电容里面的电荷也会逐渐流失,因此我们只有不断的刷新,并且由于集成度低,这里对应的行列地址的位数也比较少,所以我们同时把行列地址送过去便可
这里说一下双稳态触发器,A高B低是为1,A低B高是为0,这里我们可以根据左边或者右边那一条输出了一个低电平信号,就可以判断是0或者1,而这种双稳态则是非破坏性的读出,无需重写,这种读出快一点,所以常被用来制造高速缓存,这个需要6个MOS管,每个存储元制造成本更高,集成度低,功耗大,而DRAM 则需要分两次送(地址线复用技术)
DRAM的刷新
请添加图片描述
本节回顾
请添加图片描述

3.2.3 只读存储器ROM

RAM芯片–易失性,断电后数据消失
ROM芯片–非易失性。断电后数据不会丢失
许多的固态硬盘的存储单元是闪存,因为有多个存储单元,所以也需要控制单元
请添加图片描述
本节回顾
请添加图片描述

3.3.1 主存储器与CPU的连接

这小节我们主要讲单块存储芯片与CPU的连接,多块存储芯片与CPU的连接,分别是位扩展法,字扩展法,以及字位扩展法,本节的最后写了关于译码知识的补充
位扩展
将主存的存储字长扩展到了8bit
请添加图片描述
字扩展
CS若是同时工作,则两个存储单元的8bit的信息都会顺着数据总线传向CPU ,同时传就回导致一个数据总线的一个冲突,这里的一个方案是假如CPU有n条多余的地址线,也就只能有n个片选信号请添加图片描述

强调
位扩展可以使得存储器的字长变得更长,从而发挥数据总线的数据传输能力,字扩展可以增加存储器的存储字数,可以更好的利用CPU的寻址能力请添加图片描述

字位同时扩展
比如1号可以连接地址线的低四位,2号可以连接地址线的高四位,上面使用的是2-4 译码器
这也就导致使用的主存空间是连续的
请添加图片描述
本节回顾
请添加图片描述

3.3.2 双端口RAM和多模块存储器

之前说过DRAM是电容存取,并且会自动放电,所以每次存取都是需要恢复时间,并且现在手机都是多核的 当多个cpu访问的时候,怎么处理
请添加图片描述
双端口RAM
两个cpu就可以通过它的两个端口来访问RAM,这样就需要主板有两组完全独立的数据线,地址线,控制线,CPU,RAM 中也要有更复杂的控制电路
请添加图片描述
多体并行存储器
可以将其理解位四根内存条 体号表示的是选择的是M0 M1 还是什么,宏观上读写一个字的时间接近R,至于为什么讨论的是连续的空间,是因为许多的应用都是连续的存放于主存当中,且模块数=T/R的时候流水线的效率达到顶峰,同时存储体的数量最少,也就是成本最低,每个模块都有相同的容量和存取速度,各模块都有独立的读写控制电路,地址寄存器和数据寄存器,它们既能并行的工作,又能交叉工作,可以有选择的读取某个模块的某个字
请添加图片描述
单体多字存储器
当m=T/r的时候,两者的效率几乎差不多

请添加图片描述
本节回顾
请添加图片描述
实际用处
给自己的电脑插了两个内存条之后,给这两个内存条采用的是低位交叉编址的方案,这样几乎可以使得内存的吞吐量几乎翻倍,如果你买的是两个主频不一样的内存条 ,主频高的将进行降频处理,将会有所浪费,选择的如果不是相同容量的,低地址部分组成双通道的形式,高地址依然是单通道的形式,这样电脑的性能就不稳定

3.4.1 磁盘存储器

我们在磁性盘面上涂磁性材料的方式是一圈一圈的涂的,也就是磁道,这里绿色的圈就是磁道,为了方便主机对磁盘数据的读写,我们将磁道划分成一个个更小的扇区,每个磁盘有多个盘面 ,每个盘面也对应一个读写磁头,比如这里就是有四个盘面 ,相对位置上的磁道我们将其称为一个柱面,也就意味着一个磁盘上有多少个磁道就有多少个柱面,
请添加图片描述
尽管内侧较短,但是存储的位信息是一样的,这样就意味着越靠经内测的,它的位密度越大,越靠近外侧的它的位密度会越小,所以许多的工厂是受到这里规则的限制,旋转延迟时间也就是磁头定位到所在扇区所需要的时间,这里通常是转半圈所需要的一个时间,因为在任何扇区的概率是相同的,
请添加图片描述
请添加图片描述
无校验功能也就是当某些扇区上的数据发生损坏的时候,我们就不能恢复数据,镜像磁盘阵列也就是设置一个同样的磁盘阵列,用于防止数据的丢失,但是也就意味着空间利用率只有一半 , 四位信息位对应的三位的海明校验码,就有纠正一位错 ,发现两位错的能力,这里的技术也就会用于比如百度云这样的公司
请添加图片描述
本节回顾
请添加图片描述

3.4.2 固态硬盘SSD

这些黑色的小芯片就是用于存储数据的,是基于闪存技术,每个闪存芯片是由多个闪存块组成,而每一个块又可以拆成一个个的页,若是数据存储与固态硬盘中,则系统要读或者写的逻辑块,也就对应这里的页,当我们要写入数据的时候,但是因为是以页为单位的,并且需要擦除,若是其中已有数据,这里我们就会先将数据进行迁移之后在进行写入,但是发生了数据迁移,这样也就许哟啊闪存翻译层进行重新的映射,这也就导致了固态硬盘读的速度远远高于写的速度
请添加图片描述

3.5.1 Cache的基本概念和原理

局部性原理
由于循环结构的存在,其中的数据比如说i,也是可能在时间上循环的存取,由于局部性原理,这也就意味着,当程序是按照列优先进行访问的时候,由于空间局部性较差,也就意味着所需要的时间更长
请添加图片描述
性能分析
请添加图片描述

请添加图片描述
知识回顾
请添加图片描述

3.5.2 Cache和主存的映射方式

之前我们说过Cache保存的是主存中某些数据的副本,映射方式探讨的就是这个主体,这节将会介绍三种方式,如下图,但是全相连映射也有一个问题,就是这里我们的标记使用的也是0,1 的bit,这也就也为着这个标记可能需要的bit也很大,并且开始的时候初始化都是0,这也可能不对,因为我们可能解析为主存上0的位置的信息,所以这里我们还需要另外一个有效位,主存地址的前nbit,对比Cache中所有的块的标记,若标记匹配且有效位=1 则Cache命中,访问块内地址为某某的单元,若是未命中或者有效位=0,则正常访问主存
请添加图片描述
全相联映射
请添加图片描述
直接映射
如下图 前面的19位可以作为Cache的一个行标记,后面的三位可以反映每一个主存标记可以放在哪一个Cache行
请添加图片描述
组相联映射
每个主存块的后两位反映了分组的组号是多少,这也就意味着后两位相同的主存块号一定是在一个组内的,这也就意味着我们标记位只需要20位即可
请添加图片描述
知识回顾
请添加图片描述

3.5.3 Cache替换算法

Cache很小,主存很大,如果Cache满了怎么办?
替换算法
这也就是本小节要处理的问题,若是直接映射,则不需要考虑替换算法,因为若是对应的位置非空,则毫无选择的直接替换即可,所以替换算法只会被用到全相联和组相联映射,这节我们主要学习四种替换算法,随机算法,先进先出算法,近期最少使用,最近不经常使用
随机算法
请添加图片描述
先进先出
这里没有考虑到局部性原理,如我们写C语言中,若是第一步就使用了print 后面也可能会用到print,抖动现象:频繁的换入换出现象(刚被提替的块很快又被调入)
请添加图片描述
近期最少使用算法
做题的时候,我们可以从当前访问的一个主存块号,往前看,看哪一个是最近被访问过的,没有出现的就是要被替代的主存号,这里比起高的没有加一,是因为既是不加1,它依然是最大的数,加一毫无意义,所以我们只有四个计数器的时候,我们最大值应为3,不会达到4,Cache块的总数是2的n次方,则计数器只需n位,且Cache装满后所有的计数器的值一定不重复,命中时,所命中的行的计数器清零,比其低的计数器加1,其余不变,未命中且还有空闲行时,新装入的行的计数器置0,其余非空闲全加一,未命中且无空闲行时,计数值最大的行的信息块被淘汰,新装行的块的计数器置0,其余全加1
请添加图片描述
不经常使用算法
经常被访问的主存块在未来不一定会用到,(如微信视频聊天相关的块) 并没有很好的遵循局部性原理,因此实际运行效果不如最近最少使用算法
请添加图片描述
知识回顾
请添加图片描述

3.5.4 Cache写策略

CPU修改了Cache中的数据副本,如何确保主存中数据母本的一致性?
Chche写策略
这节写策略分为写命中(全写法,写回法),以及写不命中(写分配法,非写分配法),
写命中
我们可以根据脏位来确定数据是否修改过,根据标记位来确定需要写回到什么位置请添加图片描述
全写法
当CPU对Cache写命中时,必须把数据同时写入Cache和主存,一般使用写缓存,访存次数增加,速度变慢,但是能保证数据的一致性,这里由于SRAM实现的写缓冲,所以cpu与写缓冲的交互式比与主存的交互要快的,并且有专门的控制电路控制下逐一写回
请添加图片描述
写不命中
请添加图片描述
多级Cache
请添加图片描述
知识回顾
请添加图片描述

3.6.1 页式存储

这个分页 更多的上是逻辑上的划分,而主存和Cache更多的是物理层面上的一个划分请添加图片描述
我们作为程序员只能是给出一个逻辑地址,而操作系统则可以根据这个逻辑地址去找相应的物理地址,下图是首先根据逻辑地址前两位找到相对应的操作系统被划分的0号页面,然后我们可以看出0号页面被划分到二号主存块中,然后根据主存块号,以及页内地址的拼接 转化成实际的物理地址,这个步骤中最重要的就是建立一个逻辑页号到主存块号之间的关系,操作系统会建立一个页表,cpu执行的机器指令中,使用的是“逻辑地址” 因此需要通过“页表”将逻辑地址转为物理地址,页表的作用:记录了每个逻辑页面存放在哪个主存块中,cpu中还会有一个重要的页表基址寄存器,这个寄存器指明了页表在主存中的存放地址,然后我们又知道每一个页表项的大小是固定的,这样我们就知道了每一个页表项所在的位置
请添加图片描述
快表的引入
类似于主存设置一个Cache,这里我们可以将页表中经常使用的页表项单独存放于一张块表中,可以加快地址的变换的速度,快表的作用是加快逻辑地址到物理地址的转化,而Cache则是加快对数据的访问

知识回顾
请添加图片描述

3.6.2 虚拟存储器

段式虚拟存储器
请添加图片描述
这里由于虚拟地址也是按照段号和段内地址来分的,但是由于段长不一样,这里我们需要将段表加上段长,我们的主存不会再进行分块或者分页,所以我们需要记录一下每一段的首地址
请添加图片描述
段页式虚拟存储器
请添加图片描述

4.1.1 指令格式

指令
是指示计算机执行某种操作的命令,是计算机运行的最小功能单位,一台计算机的所有指令的集合构成该计算机的指令系统,也称为指令集,一个计算机只能执行自己的指令系统中的指令,不能执行其他系统的指令
一条指令通常要包括操作码字段和地址码字段两个部分,并且一个指令中可能包含多个地址码,根据地址码的数目不同,可以将指令分为零地址指令,一地址指令,二地址指令
零地址指令
1,不需要操作数,如空操作,停机,关中断等指令
2,堆栈计算机,两个操作数隐含存放在栈顶和次栈顶,计算结果压会栈顶,(后缀表达式)
一地址指令
1,只需要单操作数,如加一,减一,取反,求补等
指令含义:OP(A1)->A1 完成一条指令需要三次访存,取指->读A1->写A1
2,需要两个操作数,但是其中一个操作数隐含在某个寄存器,如隐含在ACC中
指令含义:(ACC)OP(A1)->ACC 完成一个指令需要两次访存,取值->读A1 ,这里因为不需要再放回数据,而是放回到ACC 所以少了一次访存
二,三地址指令
请添加图片描述
四地址指令
请添加图片描述
指令字长
一条指令的总长度(可能会变)
我们所说的半字长指令,单字长指令,双字长指令是说是机器字长的多少倍,指令字长会影响取指令所需要时间,如机器字长=存储字长=16bit,则取一条双字长指令需要两次访问内存
定长指令字结构:指令系统中所有指令的长度都相同
变长指令字结构:指令系统中各种指令的长度不等
按操作码长度进行分类
请添加图片描述
按操作类型分类
转移操作本质上来说就是实现的程序执行流的变化,如if else 这个时候就不是顺序的 有可能会发生跳转,其实也就死改变PC的值
请添加图片描述
本节回顾
请添加图片描述

4.1.2 扩展操作码指令格式

我们讲的扩展操作码指令格式是定长指令字结构,可变长操作码
CPU读入是直接读入16位的但是根据前n位1的个数来确定式几位地址指令,如下图前四位全1 则是二地址指令,前六位是1 则是一地址指令,前11位全1 则一定是零地址指令
请添加图片描述
请添加图片描述
二地址12条中大于1011的数还剩下1100,1101,1110 ,1111,你会发现这四个数都是11 开头的,所以加下来如果前六个都是全一的也就超过来二地址指令的范围,后面四bit又是一个地址,所以就留下了中间的六位用来表示操作指令,同样的若是比111101 大的也就是111110 此时前11位就是全1的,后面留有五位就是可以表示32种操作,
请添加图片描述
指令操作码
请添加图片描述

4.2.1 指令寻址

顺序寻址
这一节主要探讨指令是如何确定下一条指令的存放地址(始终由程序计数器PC给出),指令寻址可分为顺序寻址和跳跃寻址,因为有的是采用变长指令字结构的话,此时PC简单的加1 肯定是不行了,若是主存按照字节编址主存按字节编址,也就以为着每一个指令占据两个地址,则此时的PC应该是加2,若是采用变长指令字结构,读入一个字,根据前面的操作码,来确定是几地址指令,由此来判断此条指令的总字节数n 修改PC的值,此时也就是(PC)+n->PC,所以这个n 是根据指令字长和系统是按照字编址还是按照字节编址来确定的

跳跃寻址
由转移指令指出,如这里的JMP,类似C语言中的goto语句
请添加图片描述
本节回顾
请添加图片描述

4.2.2 数据寻址

观察上图你会发现上面是从0地址开始的,但是若是不从0开始 此时若是依然JMP 跳转到7这样不是很明显是错的吗,所以也就有了数据寻址:确定本条指令的地址码指明的真实地址,接下来我们会学习十种数据寻址的方式,然后知道用那种方式来解释这种地址码的含义,通常我们可以在地址码的前面加上这样的几个bit位,这里有十种,也就需要四个bit位便足够了,如这里我们中间加上几个寻址特征来确定寻址方式,若是有多个地址 自然每一个地址的方式也可能不同,这也就有可能有多种寻址特征、
实际应用中,往往是多种寻址方式复合使用
直接寻址

请添加图片描述
间接寻址
其实也就是相当于指针的形式,(A)依然是一个地址,若是真实的地址则是一次间址,若是(A)需要在看((A))则是二次间址
请添加图片描述
寄存器寻址
这个地址码指向的不是某一个内存单元而是指向了某一个寄存器,CPU会有许多的寄存器,每一个寄存器都有一个编号,直接去指向的这个寄存器找就可以了
请添加图片描述
寄存器间接寻址
比起之前我们提到的基于主存的间接寻址来说,这一次间接找地址的过程是不需要访存的,因此更快
请添加图片描述
隐含寻址
有的指令显式的给出一个地址,另外一个地址被隐藏的银隐含于ACC

请添加图片描述
立即寻址
直接寻址放的式操作数的地址,而立即寻址则存放的是操作数,寻址特征中我们写了一个# 号也就意味着后面跟的形式地址就是一个立即数,
请添加图片描述

4.2.3 偏移寻址

以某个地址作为起点 形式地址视为偏移量,这节我们主要学习三种,相对寻址(以程序计数器PC所指地址作为起点),基址寻址(以程序的起始存放地址作为起点),变址寻址(程序员自己决定从哪里作为起点)
基址寻址
优点是便于程序“浮动”方便实现多通道程序并发运行,所谓浮动就是指可以从内存中任何一个地址作为一个起始地址,每一个程序运行之前CPU的基址寄存器的值通常都是存放于程序控制块PCD中的,基址寄存器是面向操作系统的,其内容由操作系统或管理程序确定,在程序执行过程中,基址寄存器的内容不变(作为基地址),形式地址可变(作为偏移量),普通程序员可以使用汇编语言来直接操纵某一个通用寄存器中的值,读或者写都行,但是当某一个寄存器被指定作为一个基址寄存器后,那么这个寄存器中的值也是不能修改的,其内容会由操作系统进行管理,同时由于基地址的位比较长,也可扩大寻址范围
请添加图片描述
请添加图片描述
变址寻址
这种变址寻址在循环中有很大作用,在数组的处理过程中,可设定A为数组的首地址,不断改变变址寄存器ix的内容,便可很容易的形成数组种任一数据的地址,特别适合编制循环程序
请添加图片描述
相对寻址
是相对于下一个指令地址的偏移量,这个偏移量可正可负,用补码表示,因为当cpu取出一条指令之后,pc一定是自动加n的,自动指向下一条指令,优点:操作数的地址不是固定的,它随着PC的值变化而变化,并且与指令地址之间总是相差一个固定值,因此便于程序浮动,(一段代码再程序内部浮动,直接寻址的浮动是整段程序的浮动,而这里是一段代码的浮动)但是这里也就有了一个问题,若是修改程序段,数组始址不再是存放于7这个位置,这里一种解决方法就是将数据段,程序段分开
请添加图片描述
请添加图片描述
本节回顾
注意这里的偏移量是相对于下一个指令的偏移量,这里两个数进行比较是通过相减,相减的结果结果信息会记录再程序状态字寄存器中PSW,根据PSW的某几个标志位进行条件判断,来决定是否转移
请添加图片描述

4.2.4 堆栈寻址

堆栈指针存放于一个寄存器中,也就意味着我们不需要一个显式的操作地址,它的操作地址是隐藏于SP这个寄存器中的
软堆栈:从主存中划分一部分区域作为,也就意味着弹出一个元素 或压入一个元素都是需访问主存,所以没有直接放在寄存器的快
出栈时之间EA(有效地址)便可,但是入栈的时候需要先加一或者减一才能入栈
请添加图片描述

汇总

取值的时候是需要访存的,但是这里指的是指令执行期间
请添加图片描述

4.3.1 高级语言与机器级代码之间的对应

请添加图片描述
以mov指令为例
如下图,蓝色标注的是寄存器,紫色标注的是立即数,绿色标注的同时打一个中阔号这是指一个内存地址,而在其前面的红色字体的dword和byte则表示的是内存中读取几个字节,如下中我们在寄存器中直接指明了两个名字的寄存器进行操作,这是不是就是寄存器寻址,第二句中,前部分就是寄存器寻址,后部分就是立即寻址,第三句中后面的那个操作数就是直接寻址
请添加图片描述
寄存器
如下图你会发现寄存器的都是以E开头的,在x86的cpu中寄存器是以E开头的那么这个寄存器的总长就是32bit,通用寄存器都是以X进行结尾
请添加图片描述
相对于变址寄存器和堆栈基指针,堆栈顶指针相比,通用寄存器更灵活,我们若是名字使用的时候去掉E也就是AX,BX,CX,DX 则表示使用的是低16bit,甚至我们可以划分的更小一些,划分8bit也是可以的
请添加图片描述
之前我们说过中括号里面的是主存地址,但是下面这个图中你会发现中括号中的是一个寄存器,若是你能联想本章的前部分,你可能会想到这里是寄存器间接寻址,h的后缀表示是一个16进制的
请添加图片描述
本节总结
此图对应开头的两个问题,并做出了回答
请添加图片描述

4.3.2 常用的X86汇编指令

本节探讨的常见的指令有哪些,每一个指令是对数据进行什么样的处理,这里主要讲的算数运算,逻辑运算
d:destination目的
s:source来源地
这里需要特别注意一个除法,你会发现只有一个操作数,这里的是除数,而被除数是被提前存放于edx和eax中,这里也就是隐含寻址,edx:eax的意思是有的时候需要进行位扩展,进行除法运算
请添加图片描述
王道书上讲解
这里同样需要注意左边这个数不能是常量,还有就是X86中不允许两个操作数同时来自于主存,因为访问主存的次数越多,速度自然也就越慢
请添加图片描述

4.3.3 ATu0026T格式和Intel格式

之前我们学过的X86汇编语言,分为两种格式,前面学习的就是intel格式(Windows的常用格式),这里讲一下AT&T格式(Unix,Linnx的常用格式),最大的一个区别是源操作数和目的操作数的位置是相反的
请添加图片描述

4.3.4 选择语句的机器级表示

ip计数器其实也就是程序计数器PC ,jum指令和我们之前学过的指令是一样的,这个地址就是jum的操作数,而这个操作数无非就是来自于寄存器,主存,常数,但是程序员怎么能知道最终这个操作数被存放于什么地址,就算知道书写也太过麻烦,而且不方便挪动代码,一个解决方案就是用一个标号去锚定一个位置,就是有点像C语言中的goto语句,
请添加图片描述

条件转移指令
通常条件转移指令要配合cmp来一起使用
请添加图片描述

4.3.5 循环语句的机器级表示

请添加图片描述
除了循环之外在X86中还有一个loop指令,这个指令特殊之处在于会自动的对ecx进行减减的操作,所以这里不能使用其他的寄存器来代替ecx,用ecx中的值来判断是否需要继续进行循环
请添加图片描述

4.4 CiSC和RiSC

这两个有些类似一个只给你提供了一个简单的语句,另外一个给你提供许多封装好的函数
CISC复杂指令集系统:一条指令完成一个复杂的基本功能
RISC精简指令集系统:一条指令完成一个基本“动作”多条指令组合完成一个复杂的基本功能
这里如下图想到之前我们提到的 直接寻址使用的就是CISC的指令系统,
指令流水线:因为CISC中各个指令的执行时间相差较大,指令流水线的实现比较复杂,但是也可以通过一定的方式实现,RISC各个指令执行时间在一个周期基本上都能完成,也就实现流水线比较方便,并且效率会更高,
请添加图片描述

5.1 CPU的功能和基本结构

cpu的功能
请添加图片描述
运算器和控制器的功能
请添加图片描述
运算器的基本结构
之前我们说过运算器的核心部件是ALU,但是ALU,我们提供操作数,通过ALU 这个逻辑电路的处理可以输出数据,很多时候我们需要把参与的数据提前存放于通用寄存器中
堆栈寄存器SP 保存了堆栈指针,堆栈指针的作用是函数的运行过程中可以会发生函数的调用,程序的执行流发生改变,为了能够使得程序间的相互调用能够完成 堆栈指针指明了当前正在运行的地址在什么位置,因为R0既可以从A输入数据又可以从B 输入数据,所以需要两个线,若是寄存器可以存放16bit的数据,应该是通过十六个线并行的送到ALU的端口的,这种就是称为专用数据通路方式,但是这样也就意味这电路太多,并且可能会有一种情况就是多个寄存器同时并且一直向ALU传输数据,解决方法1,使用多路选择器,根据控制信号选择一路输出,
请添加图片描述
CPU内部总线方式
将所有寄存器的输入端输出端都连接到一条公共的通路上,可以从数据总线上获取输出数据,但是也有一个缺点若是同时通过总线送,则会导致ALU无法判断A,与B的值,一个方法就是设置一个暂存寄存器,先把一个数据送到暂存寄存器中存储起来,不能读入其他通用寄存器是因为其他通用寄存器也可能存放后面需要使用的数据,同时R0给的输入信号不稳定之前,ALU 就会输出信号,此时都在数据总线上 可能会发生冲突,我们的方法是ALU的输出端再加一个暂存寄存器,先把计算的结果放在暂存寄存器中,同时运算器内部还需要一个计数器,如乘的时候需要控制加的次数
请添加图片描述
控制器的基本结构
我们取出一个指令之后要把这个指令存放于IR中,把指令的操作码部分作为指令译码器的输入,然后经过指令译码器中的逻辑电路就能判断出当前是什么指令,然后产生微操作序列,然后我们还需要一个时序系统来产生一个时序信号,注意mar的连线只有一个输入的连线没有输出的连线,当有一个地址信息来到MAR中,这个地址指明了在主存中的地址,我们需要外部的地址总线传送给主存,然后通过外部的数据总线将数据存放于MDR中,我们注意到MDR中加E的表示从外部数据总线 上的输入输出是有效的,不加E的是内部输入输出有效的
用户可以通过条件转移指令或者无条件转移指令来修改PC的值,我们之前说过之前条件转移的时候就使用到PSW的值 ,或者使用CMP比较两个数的时候也会直接影响PSW的值
请添加图片描述

5.2 指令周期的数据流

这一小节中我们对指令的阶段进行一个细化,我们会分析每一个阶段数据流的流向,并且如何安排多条指令的执行
指令周期
取指令是需要访问内存的,也就需要而时间较多,分析指令是cpu来处理的,也就会很快能够完成指令的译码,有的执行指令需要访存 有的不需要,所以导致执行指令的时间差别很大,一个机器周期完成一个较小的子工作,一个指令周期又会包含多个机器周期,并且包含的机器周期数也可能不一样请添加图片描述
如下图左部分 cpu为了区分这四个阶段,也就是设置四个触发器
请添加图片描述
取指周期的一个数据流向
请添加图片描述
间址周期
这里Ad(MDR)->MAR能成功是因为我们取指的时候是先将MDR中的地址先放在MDR中,然后IR在复制一份的,所以MDR中存储的是当前执行的指令的一个信息
请添加图片描述
执行周期
执行周期的任务是根据IR中的指令字的操作码和操作数通过ALU操作产生执行的结果,不同的指令的执行周期操作不同,因此没有统一的数据流向
中断周期
之前我们就说过在每一个进程,每一个程序运行的过程中,操作系统都会给程序在主存中开辟一个空间作为运行堆栈,堆栈指针SP会指向当前的栈顶元素,这里与数据结构中有区别,数据结构中地址是从下往上画的,但是操作系统是从上往下画的,也就是我们的栈顶指针是指向低地址部分,所以我们要将一个数压入栈中,就需要先减,此时我们是想把pC的值写入栈顶,CU 通过控制总线启动主存做写操作
请添加图片描述
指令执行方案
单指令周期:对所有的指令都选用相同的执行时间来完成,时间较短的会导致浪费较长的时间,从而导致效率低
多指令周期:其实也就是一个指令执行完了就执行另外一个,
流水线方案:不同指令在不同的时间用到的部件可能不同,所以并行也是存在可行性
请添加图片描述
本节回顾
请添加图片描述

5.3.1 单总线结构

无论我们执行的是什么操作,数据的流向都是不外乎三种,寄存器与寄存器之间,寄存器与主存之间,寄存器与算术逻辑单元之间进行数据交换,无论是数据的输出还是输入操作都是由这个微操作信号发生器来控制的,之前我们说过的一种CPU内部单总线方式,这种也就意味着同一时刻内部总线只允许两个部件之间进行数据交换,为了解决这个问题,有的计算机就设计三个总线,或若是两个会进行数据交换,则在此部件之间设置一个专用的数据通路方式,这里选哟注意执行算数运算的时候,ALU需要两个输入信号必须同时有效,而我们CPU的内部总线同一时刻只能有一个输入信号,我们只有将一个操作数存放于暂存寄存器Y中,若是使用多总线则可不设置暂存寄存器
请添加图片描述

5.3.2 专用通路结构

也就是假如元件之间有数据的交流,则其中的控制信号有效就好,这里用灰色是因为有的并不会给你指令寄存器到cu的通路
请添加图片描述
多路选择器:如下图中的MAR,当有多个输入的时候,可以接一个多路选择器,选择让哪一个输入通过,还有就是使用三态门,只有微操作信号发生器发出一个信号之后,输入的通路才会被导通,
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
本节回顾
请添加图片描述

5.4.1 硬布线控制器的设计

节拍信号是通过一个节拍发生器来发出的
请添加图片描述
硬布线控制器的设计步骤
请添加图片描述
安排微操作时序的原则
原则一:微操作的前后顺序不能随意修改,这里的前后关系指的是前后依赖关系,
原则二:操作对象不同的微操作,尽量安排在一个节拍内完成;因为对元器件的使用不同,所以每一个微操作使用的时间都是一个节拍
原则三:占用时间短的微操作,尽量安排在一个节拍内完成,并允许有前后顺序
但是这里(3)的后面不能再存放(4)是因为(3)需要访问内存所需要的时间较长 所以必须要给他分配一个节拍
请添加图片描述
组合逻辑设计
这里的i表示状态条件,在I上一个杠则表示I取反,下图也就表示当I这个条件满足的时候,我们将1放入IND(表示是否处于间址周期的触发器)这个触发器中,这就表示接下来要进入间接寻址的阶段,若是没有间接寻址的这个特征位,就将1放入EX这个触发器,也就直接进行执行阶段,上面的字母表示要进行的指令,下面的1 表示此指令可能需要的微命令,需用则用1
请添加图片描述
间址周期
这里同样需要注意这个IND上面一个杠的这个状态条件,当我们进行间接寻址,我们可能进行多级间接寻址,只有当这个标志信息为0的时候才已经完成了最后一级的间接寻址,这个时候才可以进入执行周期,若是为1,则下一个机器周期继续进行间接寻址
请添加图片描述
微操作信号综合
也就是确定一个微操作命令在取值周期,间址周期,以及执行周期中那些是需要此微操作命令信号,并用这些来写出微操作命令的逻辑表达式,表达式中+是或,*是且
请添加图片描述
本节总结
请添加图片描述

5.4.2 微程序控制器的基本原理

微操作序列之于指令相当于指令之于程序,用指令处理的这种思想来处理这些微操作序列一个微指令中可能包含多个微命令,一种机器指令会对应一个微程序,一个微程序又会有多个微指令序列来构成,在一个微程序中可能有多种微指令,每一个微指令需要有一个操作控制的字段,用若干个bit来表示当前这个指令的微操作是那几个,并且需要一个顺序控制的字段,用来指明下一条微指令的地址,这些微指令序列也是存放于一个控制器中一个特殊的存储器中的,所以是有一个地址的
请添加图片描述
微程序控制器的基本结构
这里的控制寄存器是用来存放微指令序列的,每一种机器指令对应一个微程序,而每一个微程序是由多种微指令序列组成,这些微指令序列在这个控制存储器中是顺序存放的,ROM的读取速度非常快,比RAM快,且ROM是一种非易失的芯片,断电之后存储的指令是不会丢失的,为了指明接下来的微指令存放的地址,我们也就需要一个CMAR
(在CU内部也就是MAR和PC的一个结合体),这里也同样需要一个地址译码器把CMAR中的地址转化为CM中对应的存储单元的控制信号,之前我们从主存中取到一个指令,我们会先将这个指令送到一个叫做MDR的寄存器,再送到IR指令寄存器,对于CU内部的微指令也是类似的,从CM中取出一个指令我们需要先将其送到CMDR中,微地址形成部件的作用根据机器指令的操作码来确定这个机器指令的一个首地址,顺序逻辑:用于控制微指令的执行顺序的,因为微指令序列并不是一条一条的顺序往下执行例如若是有中断发生 到底要发出上面信号是根据CMDR来确定的
请添加图片描述LDA是将X load进入ACC,15后面填0是因为若是没有中断周期就应该进入下一个取指周期,是否进入中断周期又要根据中断信号来进行判断,这里的转取指周期是指中断周期结束之后会进入下一个取指周期,若是告诉你某指令系统中有n条机器指令,则他们所对应的执行周期的微程序段也就不同,因此我们就需要n个微程序来描述,另外我们需要一个公用的取指周期的微程序,所以CM 中微程序段的个数至少是n+1个,若是我们把一个微程序看成是由取值,间址,中断,执行来看的话,那么一条指令对应一个微程序的说法也就是对的
请添加图片描述
本节回顾
请添加图片描述

5.4.3 微指令的设计

微命令与微操作一一对应,一个微命令对应一根输出线,有的微命令可以并行执行,因此一条微指令可以包含多个微命令,
请添加图片描述
微指令的编码方式
也就是如何用若干的bit来表示一系列的控制信号
互斥的放于同一段中,这样就一定不会并行的发出两个互斥的微操作,相容的微命令分在不同的段内,也就有可能并行发出微操作
请添加图片描述
字段直接编码方式
优点:可以缩短微指令字长
缺点:要通过译码电路后在发出微命令,因此比直接编码慢
请添加图片描述
字段间接编码方式
请添加图片描述
指令的地址形成方式
请添加图片描述
请添加图片描述
知识回顾
请添加图片描述

5.4.4 微程序控制单元的设计

对于硬部件控制器和微程序控制器有区别的在于最后这一步
在硬部线控制器中我们是把指令的操作码部分送给了指令译码器id,指令译码器会发出与这根线相对应的选通信号
而对于微程序控制器来说我们把指令操作码送给微地址形成部件,由微地址形成部件来指明微程序的执行地址
我们执行完微指令a之后还需要穿插一个微操作,就是要把当前的微操作的下地址信息送到CMAR,这个微操作的执行也需要一个节拍,也就是我们每执行完一个微指令之后,都是需要一个节拍来寻找下一个的地址,取值周期的最后一个事情,我们还需要再加一个节拍,在这个节拍内,把微地址形成部件当前所指明的首地址放入CMAR中,这里发现如下图所示,硬布线控制器需要三个节拍,微程序控制器需要五个节拍
请添加图片描述
微程序设计分类
请添加图片描述

5.6.1 指令流水线的基本概念

想要对指令的过程进行优化,一条指令的执行过程可以被分成多个过程,根据计算机的不同,具体的分法也不同,这里可以分成三个部分,取指,分析,执行,
取指:根据PC内容访问主存储器,取出一条指令送到IR中
分析:对指令操作码进行译码,按照给定的寻址方式和地址字段中的内容形成操作数的有效地址EA,并从有效地址EA中取出操作数
执行:根据操作码字段,完成指令规定的功能,即把运算结果写到通用寄存器或主存中
设取指,分析,执行,三个阶段的时间都相等,用T表示,按以下几种执行方式分析n条指令的执行时间
顺序执行方式
请添加图片描述
一次重叠执行方式
这里总耗时第一个需要3T,;后面每两个T完成一个指令所以剩下的n-1 需要(n-1)*T
请添加图片描述

二次重叠执行方式
在这种最理想的方式,某一个时刻可能同时在进行取指,分析,执行,这里是分成3个阶段,如果说分成4,5个阶段,并且若是我们能实现各个阶段所使用的部件相互独立,也就意味着同一时刻最多可以4,5个指令在执行请添加图片描述
流水线的表示方式
一种是指令执行过程图,主要用于分析影响流水线的因素,一种是时空图,如何度量指令流水线的性能 主要用的是时空图
请添加图片描述
流水线的性能指标
这里的任务数也就是指令数,为什么一般取德它T=一个时钟周期:按照之前的学习 一个指令被分成多个阶段,每一个阶段应该对应一个机器周期,而一个机器周期可能包含多个时钟周期,也就是多个节拍,但是理论上一个最理想的情况 一个机器周期也是可以包括一个时钟周期,既然我们这里探讨的就是理想情况,所以这里也可以取一个阶段等于一个时钟周期

吞吐率
请添加图片描述
加速比
请添加图片描述
效率
红色的表示利用这些设备的时间,蓝色的框表示整体的一个时间
请添加图片描述
本节回顾
请添加图片描述

5.6.2 指令流水线的影响因素和分类

上节中我们假设一个阶段到下一个阶段都是理想状态,有的时候指令流水线可能并不是那么完美,本节来分析一些影响流水线的影响因素,最后再来介绍一下指令流水线的分类
五段式流水线结构
这里有两个Cache,并且一个存放指令,一个存放数据,也就意味着可以并行的执行的,若是Cache没有命中,则会出现断流的情况
IF:取指令阶段,根据PC从Cache中取指令,放到这个功能段的锁存器里面,Cache会保留主存的一个副本,并且由于局部性原理,命中率很高
ID:指令译码阶段,指令译码阶段除了译码的阶段,还有就是需要取数,这里取数也是从通用寄存器中取,若是这个数来自于主存,那么这个数也一定是先存放于通用寄存器中,在从通用寄存器中取出这个数据
EX:指令的执行阶段,使用ALU 处理数据的,然后将数据存放于这个阶段的锁存器中,iMM中存放的是立即数,
M:需要进行访存的一个阶段,这里同样的也是存在一个Cache
WB:把最终的结果写回到通用寄存器
当然这五个阶段并不是必需的,比如有的就不需要访存这个阶段
请添加图片描述
影响流水线的因素
1,结构相关(资源冲突)
也就是操作系统中的互斥,某些资源是不能共享的
资源重复配置也就是上面的两个Cache,一个是指令Cache,一个是数据Cache
请添加图片描述
2,数据相关(数据冲突)
也就是操作系统的同步,不同的指令它们之间可能有一前一后的关系
如下图红色部分就是还未写入就使用数据,此时的数据是不正确的,NOP指令也同样需要5个周期
请添加图片描述
硬件阻塞
请添加图片描述

软件插入
请添加图片描述
数据旁路技术
在第一条指令,它的加法出来之后,我们会连出来一个数据旁路,将这个数据直接送到ALU输入端,作为下一个指令的操作数,这样我们就不需要上一个指令的写回操作
编译优化
若是后面某些指令不需要用到R1数据,我们就可以将后面的指令适当的修改位置,通过编译器调整指令顺序来解决数据相关
3,控制相关(控制冲突)
其实下图也即是如何控制指令进行if else 的转移指令
请添加图片描述
影响流水线的因素汇总

请添加图片描述
流水线分类
部件功能级的流水线:比如我们在指令的执行阶段,我们会将数据放于ALU,这里我们可以将ALU的计算再一次进行细分,也就是套娃,比如这里我们进行的是浮点数的运算,有四个子过程,也就是四个分段,并且每一个分段所使用的电路也是不一样的,所以也就又可以设计成一个流水线了,这里并不是指令流水线 而是功能流水线
处理机间的流水线:类似于每一个CPU专门负责一个工作 ,然后将结果传入下一个CPU 中
单功能流水线:是指实现一种专门的固定功能的流水线,如专门搞一个流水线单一来高浮点数的加法
多功能流水线:如指令流水线就是一个多功能流水线,因为可以完成多种指令,每一个指令所表示的功能也就是不一样的

请添加图片描述
静态流水线:我们在ALU内部实现一个浮点数加法的流水线,如果在ALU内部同一时间内只能完成浮点数加法的运算
动态流水线:次吃ALU中不仅进行着浮点数加法的运算,而且还有其它的电路也在进行其他的运算
非线性流水线:我们之前提过,我们解决数据冲突,我们可以直接将ALU中的数据重新接入到屁股上,作为下一个指令的输入信号,某些功能数次通过流水线可以理解为如使用加法来实现乘法,这个ALU只能通过多次的加法来实现
请添加图片描述
流水线的多发技术
在一个时钟周期内同时并发多条独立的指令,我们增加了多个部件可以支持同一时刻多个部件进行操作
请添加图片描述
超流水技术
进一步把一个时钟周期在分段,也就是时分复用技术
请添加图片描述
超长指令字
执行阶段有多个操作,当我们执行命令的时候 ,我们发现指令间潜在并行性,将多条整合成一条超长的指令,显然多种操作要同时进行,就需要多个处理部件
请添加图片描述

五段式指令流水线

本节主要这五个类型的指令 运算类指令,LOAD指令,STORE指令,条件转移指令,无条件转移指令,是如何使用这个五段式流水线来完成相应的工作的
加法注意
在加法指令中M是空段:运算的两个操作数一定是来自于寄存器,或者一个来自寄存器一个来自立即数,而且结果一定是存放于某一个寄存器而不是存于主存,因此对于精简指令集系统来说,访存类阶段是不需要做任何事情的,但这个时间是必须消耗的,我们之前说过为了方便流水线的安排,让所有的指令都统一的经过这样的五个阶段,即便其中的某个阶段是不需要做任何事情的,但是我们仍然需要消耗一样的时间
请添加图片描述
取数存数指令
RiSC处理器只有取数LOAD和存数SIORE指令才能访问主存,其他指令得到数据一定是来自于某一个寄存器,或者指令中包含一个立即数
注意LOAD 也是需要经过计算这个步骤的,因为我们需要根据基地址与偏移量才能得到有效地址,这里的M 阶段访问的是Cache中的数据,但是若是在Cache中没有命中,则一个时钟周期内,访问主存拿数据,这肯定是完成不了的,所以为了保证流水线的流畅工作,通常Cache 中是能命中的
请添加图片描述
请添加图片描述
条件转移指令
beq:当我们指向的两个寄存器相等的时候,就满足了这个条件,就需要转移到这个相对于相对位置偏移量的位置,这里的偏移量通常是指往前或者往后偏移多少个指令,而从下一个地址开始偏移,通常这pc加一通常在取值结束之后就自动加一了
bne:当两个寄存器中的值不相等的时 候,我们才会让程序的执行流进行改变
这里没有访问主存的阶段,同样的也没有写回的阶段,因为通常写回都是写回到通用寄存器,而pc这个寄存器不是通用寄存器
请添加图片描述

无条件转移指令
这里的偏移量通常用补码表示,可以是正或者负
请添加图片描述

5.7.1 多处理器的基本概念

SISD(单指令流单数据流):计算机组成原理中我们一直学习的就是这种,只有一个处理器,一个主存储器,一个控制单元,CU负责取指令,然后根据指令向执行部件发出执行信号,单指令流(同一时间段内只能处理一个指令序列),单数据流(同一个时间只能处理特定的一到两个数据)
请添加图片描述

SIMD(单指令流多数据流):CU每次取出一个指令,根据这个指令发出控制信号,并且可以同时向多个执行部件发出信号,各个执行部件在各自的局部存储器中处理各自的数据,这样就可以使得对各块数据的存储并行起来了
请添加图片描述
MIMD(多指令流多数据流)
线程级并行是指:每个核可以运行各自的线程,多个线程可以并行的执行,线程级以上也就是进程,之前我们说过Cache也是可以分级的,这里L1 L2这种更高的Cache就是专属某一个核 而L3就是共享的,共享同一个主存,以及最低一级的Cache
请添加图片描述
向量处理器
它里面的运算部件直接运算向量,同时里面的寄存器也可存取一个向量,一大特点就是以向量作为处理单位的,在普通的标量计算机中我们处理两个n维向量的相加需要执行n次 但是若是向量计算机我们就只需要执行一次
请添加图片描述

5.7.2 硬件多线程的基本概念

传统的不支持硬件多线程的切换
当我们从线程A 切换到线程B的时候,我们是不是需要将PC以及通用寄存器中的指放到主存中,当我们从线程B且换线程A的时候,我们需要从主存将数据进行恢复,这种保存恢复带来了不小的代价
请添加图片描述

支持硬件多线程的处理器
请添加图片描述
三种硬件多线程
同时多线程:对于线程A和线程B若是采用同时多线程的方式,那么一个时期内,我们会把A的指令取到左边,B的指令取到右边,A的这条指令与B的这条指令就可以并行的执行,我们在同一时刻在处理两个线程的指令
请添加图片描述

6.1.1 总线概述

之前我们提到过数据总线,地址总线,控制总线,一个总线内部可能其中包括多个信号线,所有的硬件部件都可以通过这根总线传递数据,可以并行的发送多个数据,同一时刻只能一个部件发送数据,但可有多个部件接受数据
请添加图片描述
总线的特征
这里传输方向的意思是比如这里CPU通过地址总线指明此次主存要读或者要写的内容,而主存并不给CPU地址,而数据总线确实双向的
有效电平范围:比如我们规定高电平4.8~ 5.0 低电平0~0.5,我们认为只有高低电平落到这样一个范围的时候才是有效的
请添加图片描述
总线的分类
我们可以从多个不同的维度对总线进行分类
按数据传输格式分
串行:每次只能传一位(USB)且抗干扰能力强,也就意味着在长距离传输中数据不容易发生跳变,并且因为只需要一个线,也会节省电路板上的布线空间,虽然我们是串行的发送的 但是我们依然需要转变成并行在发给CPU
并行: 每次可以传多位,当我们把多个信号线并在一起的时候,这些信号线在传递的过程中有可能会造成信息的干扰,导致二进制信息位的跳变,这也就限制了频率不能太高,所有有可能信息传输的速率并没有串行总线来的快
请添加图片描述
按总线功能(连接的部件)进行分类
数据总线:若是数据总线的位数或者说根数若是与机器字长相等的话,CPU可以通过一次的数据读入,就可以直接处理的那么多的数据,若是数据总线和存储字长相等的话,也就意味着每一次的主存读或者写操作 只需要主存进行一次的读或者写就可以
地址总线:当我们的I/O设备与主存选择统一编址的时候,I/O设备也会影响地址总线的数量
控制总线:有的控制心线是CPU 发向其他设备的,有些则是其他的硬件信号发送给CPU 的,所以对于单根的信号线来说信号的传递方向是单向的,对于整个控制总线来说传输方向是双向的
通信总线:网线就是一种
请添加图片描述

系统总线的结构
系统总线的结构分为单总线结构,双总线结构,和三总线结构
单总线结构
第六章主要讲的就是这个细分之后的系统总线的结构
这里所说的系统总线就是包括了数据总线,地址总线,控制总线的一组总线
这里的并发指的是同一时刻只能有两个部件之间进行数据的发送,不可能是多组部件通过总线进行数据的传递
请添加图片描述
双总线结构
通道:我们可以把通道理解为阉割版的CPU,但是这个功能部件是专门来管理各个I/O 设备的,因为通道的处理速度也很快,所以我们将CPU与通道通过快速的主存总线进行相连接,这样可以保证主存总线的性能发挥出来,I/O总线因为下方的I/O设备输入的较慢,这里也可以设计较慢,引入通道是为了缓和CPU与各种I/O设备的速度问题
突发(猝发):CPU指明一个地址之后,如果能从主存之中连续的读出多个数据能提高系统效率
请添加图片描述
三总线结构
DMA总线:磁盘是高速外设,而打印机 键盘就是低速的外设,我们对磁盘的读写是以块为单位的,我们将磁盘与主存之间的数据交换就是通过DMA总线进行,这样的好处是CPU与磁盘机不需要通过慢速的I/O总线进行数据的交互,这样也是为了缓和磁盘与CPU之间的速度关系,I/O总线的速度就慢一些,CPU就可以通过I/O总线与一些慢速的外设进行数据的交互
请添加图片描述
四总线结构
现代计算机更常使用的一种结构
请添加图片描述
本节回顾
请添加图片描述

6.1.2 总线的性能指标

一次总线操作所需的时间(包括申请阶段(这个阶段要做的就是总线仲裁),寻址阶段(主设备通过地址总线把要读或者要写的地址单元送到从设备) 传输阶段,结束阶段(释放总线的使用权))
时钟周期也就是节拍信号,
总线时钟周期和总线周期有可能是一对一,一对多,多对一的关系(如检测到电平信号从高电平变成低电平可以进行一次的总线传输,检测到电信号从低电平到高电平又会传输一次数据,这样一个时钟周期内上升沿和下降沿都进行了一次总线的传输,那也就意味着一个时钟周期内包含了两个总线周期)
最高传输速率:其中可以包含一些校验位,开头标准,结尾标志什么的,并不是都是有效信息
请添加图片描述
请添加图片描述
总线复用的时间成本会更高
请添加图片描述

列题
请添加图片描述
本节回顾
请添加图片描述

6.2 总线仲裁(408不考)

由于总线是一种贡献的设备,同一时间只能提供给一个设备,那么如何解决多个设备争用总线的问题,设备首先会通过控制总线中的某个线路向总线的控制器发出一个请求,请求总线的使用权,当总线的使用权分配给这个设备的时候,这个设备就是主设备,然后使用数据总线和地址总线进行数据的传输,选择与那个设备进行数据传输这是由当前的已经获得总线控制权的设备决定的,集中仲裁方式又可分三种方式:链表查询方式,计数器查询方式,独立请求方式
请添加图片描述
链式仲裁方式
这个总线控制器一般被集成与CPU内部 或者集成与桥接器里面,然后安装一定的优先级顺序,设备通过BR这个信号线上发送要给高电平信号,总线控制部件发出总线允许的信号,当设备收到这个信号的时候就会对总线进行控制,并截断这个BG控制信号向后传,同时往BS总线忙这个信号线上输入一个高电平信号,表示这总线已经被占了,当总线控制部件检测到BS这个信号的时候,就会撤销BG这个信号。会产生饥饿现象,也就是设备优先级高的若是一直请求使用,则低的一直使用不到,并且其中若是有一个设备损坏,信信号可能就无法向后传
用一个故事就是游戏机器的使用就是大儿子玩完才能给二儿子玩,然后是三儿子
请添加图片描述
计数器查询方式
首先这里控制部件里面会加一个计数器,当总线控制部件检测到有部件要使用设备的时候也就是有BR信号的时候,这个计数器会进行计数,会从0开始计数,然后这个设备地址(是有多组线)中传过来的数据就是0,表示它正在询问0号这个设备是不是你要使用
加的这两个控制线就是BS与BR这两个控制线
请添加图片描述
独立请求方式
每个设备与总线控制单元部件间不止有BR还有BG,当接收到多个设备的时候,排队器会决定将控制部件给那个设备,并且所有的信号线都会与总线忙这个信号线进行连接,当设备获得总线控制部件的控制权之后,就会发出一个BS信号,当总线控制部件检测到BS信号就知道已经成功分配,控制部件就会撤销BG这个信号,每一个设备都需要BG,与BR 所以是2n,同时所有的都连接到一个BS线上 ,所以是2n+1条控制线
请添加图片描述
集中仲裁方式小结
请添加图片描述
分布仲裁方式
当有多个设备请求申请总线的时候,每一个设备都将自己的仲裁号发送到一个地方,进行优先级比较,
请添加图片描述

6.3 总线操作和定时

如何使得占用总线的一对设备进行数据传输
请添加图片描述
同步定时方式
相当于有一个马仔一直喊1234 1234 来搞节奏, 对于同步通信来说,我们不会留有时间让主从双方进行检验,所有可靠性较差

请添加图片描述
请添加图片描述

异步定时方式
请添加图片描述
请添加图片描述
请添加图片描述
半同步通信
比起同步方式,半同步方式会加一个WAIT的信号线,首先主设备在T1这个发出一个 地址信号,T2的前沿又会发出一个读命令,若是按照同步定时方式再T2这个节拍再往后的一个节拍,是不是意味着从设备需要准备数据,但是有的从设备速度跟不上这个节奏,此时就会通过这个控制线路给这个总线的控制器一个反馈,让总线的控制器等自己几个节拍,也就是后面的这两个Tw从设备准备数据,到了T3这个时候从设备就把数据发送给主设备,T4这个时候会撤销这个读命令和地址信息,之前所说的同步方式,每一个总线传输周期都是定时的,都是4个总线的时钟周期,但是这种半同步通信,就是增加了一个等待信号,这样就可以动态的调节总线的传输周期中包含的时钟周期数
请添加图片描述

分离式通信
这如下图三个阶段中,第二个阶段是可以优化的,当慢速的从设备在 准备数据的时候,这个时候是不需要使用总线的,但是这个时候主从设备依然占据着使用权,
请添加图片描述
本节回顾
请添加图片描述

7.1.1 输入输出系统和IO控制方式

i/O接口是一个电子部件,会被集成与主板中,而I/O设备则是你看得见摸得着的那些设备,你的I/O设备要和你的主机进行数据的交互,控制信息的传输都需要经过i/O 接口的一个处理
请添加图片描述
I/O接口中包含数据寄存器(主机要输出往外设的数据,或者外设要输往主机的数据),控制寄存器(存储的数据能反映具体的外设要做什么动作),状态寄存器(反映了当前外设的一个状态),但是下图这种程序查询方式是不好的,因为CPU需要不断地检查状态寄存器,在此过程中CPU是一直被占用的,所以提出了程序中断方式,使用这两种方式,我们每输入或者输出一个字,就需要CPU介入一次,CPU就作为中转站作为IO设备和主存之间的中转
请添加图片描述
程序中断方式:CPU执行某个程序 中间若是需要某个I/O操作,I/O设备在这数据准备阶段,CPU是可以去做其他的事情的,不需要进行忙等,I/O操作结束之后,会向CPU发出一个中断请求,CPU在每一个指令结束的末尾都会执行一个中断检查,此时有没有中断请求的到来,若是有此时就会转向去处理这个中断请求,CPU处理完这个中断请求会去继续处理之前的那个指令,或者继续发出一个I/O指令,
请添加图片描述
DMA控制方式
下图也是我们第六章提出过的三总线的结构,其中的DMA 接口(也是一种I/O 接口)就是来管理高速的外部设备的,引入DMA之后,若是CPU向外设发出一次读写命令,指明此次要读或者要写的数据在哪,英爱转存到哪,在那个位置,发出这个指令之后,CPU就会去作其他的事情,I/O设备就去准备数据,然后将数据放在DMA控制器中。每准备好一个字的内容,DMA控制器就会发出一个DMA 请求,接下来DMA控制器会占据一个存取周期,往主存的对应位置写入一个字的数据,若是在存取周期内CPU也想访问主存,要等DMA结束,但一个存取周期一定是比这个CPU执行中断程序的时间要短
请添加图片描述
请添加图片描述
若是中型机,大型机上连接着超级多的I/O 设备,每一个I/O设备每传完一个数据之后,都会向CPU发出一个中断请求,这样效率也就不高,
通道控制方式
之前介绍的DMA方式我们只能连续的读或者写一整块的数据,传送完一整块的数据都需要CPU的介入,引入通道之后,我们对数据的存取位置应该输入到那个位置,这些都会变得灵活,只需要提前编好通道程序就可以,只有通道完成一大堆工作之后才需要CPU的介入
请添加图片描述
I/O 系统基本组成
主存中即保存通道要执行的程序,又保存CPU要执行的程序,I/o 指令是有指令码的,普通的指令是没有命令码的
请添加图片描述
本节回顾
请添加图片描述

7.1.2 外部设备

显存带宽指的是显存的写入速度,现在我们使用的计算机VRAM 一般比较大的原因是显存中除了作为当前显示侦的缓存,还会用于保存即将渲染的图像数据,对于没有独立显卡的计算机来说通常这个显存没有一个单独的存储芯片,而是分配一片内存作为显存,若是带有独立显卡的电脑,独立显卡内就有一个内存作为显存来使用
显示器
请添加图片描述
请添加图片描述
请添加图片描述
阴极射线管显示器的原理
如下有一个接口电路(也就是I/O接口)键盘输入的信息 或者主机想要显示的信息,先把这些字符的ASCII码写入到显存里面(若是汉字则将机内码)接下来在CRT的控制器的控制下,显存中的数据一个个的发送到字符发生器中,这个自行发生器不仅有控制器而且有一个ROM(用来存放每一个ASCII对应的字形码) 然后将字形信息存放于输出缓冲寄存器中,我们将ASCII转化成字形信息就需要这个字符发生器的作用
请添加图片描述

请添加图片描述

打印机
击打式打印机:发票什么的,银行,一般是蓝色的墨,因为是物理打印,所以会留下物理印记,不易仿制
请添加图片描述
按工作方式分类
请添加图片描述
本节回顾
本机主要是注意显存容量的计算,以及显存带宽的计算,
请添加图片描述

7.2 IO接口

之前我们知识说了IO接口有三个寄存器,这里我们继续给它进行细化,
王道书上说主机测(系统主线)数据的传输方式只能是并行传输的,正确是因为2000年之前都是并行,但是现在正在朝串行转化,一个IO接口时可以连接多个设备的,每一个设备所能识别的命令码是不一样的,只有厂家才能知道它们的设备能识别什么样的命令码,所以通常发出这个命令需要驱动程序的协助,CPU可以使用一种比较笨的方式,不断轮询检查的方法检查这个状态寄存器,也可以通过控制线给CPU 发送一个中断信号,当CPU 检查到一个中断请求信号之后,再来处理这个中断请求,这里将状态寄存器和控制寄存器写道一起是因为当CPU要控制一个设备的时候,CPU 要向设备发送一个命令,我们可以先把这个命令信息放到这个控制寄存器中,当IO控制逻辑取出这个控制寄存器中的信息,我们就没有必要让信息一直存放于控制寄存器中,IO控制逻辑取得设备控制之后,随时向cpu 反映一些工作的状态,因此是同一个寄存器,我们就能重复的利用,有的教材也将命令字也叫做控制字
中断类型号:工作完成和故障的中断类型类型肯定不一样,
请添加图片描述
接口与端口
由于接口内部会有多个寄存器,会有多个端口,为了确定CPU 访问的是哪一个端口,哪一个寄存器,那么我们也就需要将端口进行编号
请添加图片描述
统一编制与独立编制

请添加图片描述
请添加图片描述

请添加图片描述
IO接口的分类
请添加图片描述
本节回顾
请添加图片描述

7.3.1 程序查询方式流程图

这里的IO端口就是一个一个的寄存器
这里的预置传输参数 相当于设置一个寄存器,来表明此时有多少字符是未传的,
CPU与I/O 设备时串行工作的,IO设备在干工作的时候,CPU一直在轮询,等工作干完,再次就绪时候,CPU 才可以进行下一次工作
请添加图片描述
例题
这种程序查询方式若是对慢速的IO设备,整体的CPU性能不会有太多的影响,若是快速的IO设备就可能大量的占据CPU的查询时间
请添加图片描述
本节回顾
请添加图片描述

7.3.2 中断的作用和原理

中断的基本概念
程序执行指令就是使用一个PC指向当前要执行的指令的地址,取出这个指令之后要让这个指令加一,指向下一个要执行的指令,因此正常情况下CPU对指令的执行是顺序执行的,除非遇到跳转指令或者函数调用的指令,即便是跳转指令或者函数调用指令,但是依然是属于同一个进程,若这个进程的指令序列开始上CPU运行了,那么也就意味着这个进程会一直霸占着CPU 除非这个进程自主的结束,但是根据我们使用经验来说CPU除了处理当前正在运行的进程 还要处理我们的输入输出设备发来的信号, 这正是因为有中断系统,CPU每执行往一个指令之后,都会在这个指令末尾进行一次检查是否有中断请求信号 ,然后去处理这个中断服务程序,对于不同的中断请求,我们要使用不同的中断程序来处理
关中断:当CPU处于关中断状态时,是不会处理中断程序的(这个关中断状态会被记录于PSW中,执行原子操作(几个语句不可分割)的时候就可以在第一条中加上一个关中断指令,将PSW中的IF变为0,但是也有一些指令在关中断时也需要被响应,比如关机)
中断隐指令:把CPU的指令执行流转移到正确的一个中断服务程序,本质上就是修改一个PC的值,让PC指向这个中断服务程序的第一个指令
请添加图片描述
中断请求标记
检测到一个中断请求,应该如何判断是哪一个IO设备发出来的?这里解决方式是设置一个中断请求标记寄存器,这个寄存器是由一个个的触发器组成的,但是有的时候会有多个部件发过来的请求信号,
请添加图片描述
中断判优
请添加图片描述
中断判优,优先级设置
第4个:高速设备你响应的越慢,越耽误工作,低速设备的反而没有事情
第5个:键盘输入信息放在缓冲寄存器中,若是不及时取走的话,可能会数据覆盖,
请添加图片描述
中断处理过程
当程序执行流需要改变的时候,我们需要保留PC的值,这个操作可以交给中断隐指令(是多个指令,不是一个指令),保存原程序的PC值,并让PC执行中断服务程序的第一条指令,这里有两个问题,首先保存的PC值保存在哪里,还要就是是如何找到的中断服务程序的第一条指令(两种方式,软件查询法,硬件向量法)这里我们主要分析硬件向量法,我们可以给每一个中断请求信号进行编号,之前我们说过通过排队器(也就是多个触发器的那个)判断是那个中断源发来的信号,经过中断向量地址形成部件会形成一个向量地址,中断向量指的是函数的指针 如这里的JMP 后面的200 对应入口地址200,向量地址可以理解为指针的指针,你可能回想为何向量地址不直接与入口地址对应,若是直接与入口地址对应,那么中断服务程序的长度也就不能变化了,若是使用二级指针,我们的中断类型是一定的,并且一一对应的关系好确定,我们也只需要修改JMP 后面的便可
请添加图片描述
请添加图片描述
本节回顾
这里中断服务程序中也是有一个关中断,一个开中断,这也就保证了中断服务程序是一气呵成的,这也就是单重中断
请添加图片描述

7.3.3 多重中断

也就是在执行某个中断程序的时候,依然允许执行其他的中断服务程序
如果我们把开中断安排在保护现场的前面,也就有可能主程序的现场我们只保存了一半,又被新的中断程序中断了,导致主程序的以前的运行现场丢失
屏蔽字:用来屏蔽某些中断的,本质上也是来出来优先级的问题

中断屏蔽字
请添加图片描述
例题
请添加图片描述
本节回顾
请添加图片描述

7.3.4 程序中断方式

引入中断系统之后,如何控制IO 设备的读写工作,假设CPU正在运行一个外部设备,而这个设备正在等待输入,CPU需要通过IO指令发出启动输入的命令,外部设备就去准备CPU所需要的信息,若是对于程序查询方式,CPU需要不断轮询IO设备是否需要已经输入工作
而引入了中断系统之后,CPU会继续干以前的事情,当IO设备完成工作之后,IO设备会给CPU发送一个中断请求信号,假设之前CPU运行的那条指令的地址是K ,在K这个指令的末尾 检测到了中断请求信号,此时就要对中断请求信号进行处理,当CPU处理完这个中断之后,就会到K+1这个地址,其中的中断处理的过程,需要一个中断隐指令完成一系列的操作
在中断服务程序中,首先需要保存以前的现场(各种寄存器的值,还有屏蔽字),然后正式的对中断服务进行处理,在这时间,CPU已经取走了第一个数据,然后继续给IO设备发送输入指令,引入了中断服务程序之后,CPU与外部设备就可以并行
请添加图片描述
本节回顾
请添加图片描述

7.3.5 DMA 方式

使用这种程序中断方式,每一次IO设备准备好一个字,CPU 就需要执行一次这个中断服务程序把这个字转存到主存中,CPU执行这个中断服务程序所需要的时间开销就非常大,DMA控制器通常用来控制快速设备的,以块为单位进行读写的设备,如磁盘,也就是一次读入许多字
下图单总线结构 DMA是否能访问主存是由CPU说了算的
请添加图片描述
DMA内部结构细化
每传送完一个字,主存地址计数器以及传送长度计数器都会自动加一,中断机构与传送长度计数器之间是有一个溢出信号,意思是传送长度计数器所能表示的范围是有限的,当溢出的时候就会发出一个溢出信号,然后就会有中断请求
请添加图片描述
DMA 传送过程
预处理阶段DMA控制器指明接下来要读或者要写的内容应该存放在主存的什么位置,主存的读写寄存器(AR),还有一个用于指明设备的地址英文名叫做DAR,此外还需要指明多少个数据WC,接下来就有DMA控制器控制着数据传送的过程,对于CPU 它可以继续执行之前执行 的程序,如果此时我们要输入一个数据,设备首先要将数据写入DR这个寄存器中,同时向DMA触发器发出一个高电平型号让其变成1,当控制逻辑检测到DMA 请求,他就会向CPU申请总线的控制权(HRQ),如果系统总线可以让给DMA控制器使用的话,会给一个反馈信号(HLDA)DAM获得总线的控制器就可以通过数据线 地址线,控制线向主存发出读或者写的命令,同时把数据缓冲器DR中的数据打到数据线总线上,把主存的地址信息打到地址总线上,这样就完成了一个字的传输,然后让主存地址与传送长度计数器自动加一,传输多个字之后就会发生长度溢出,中断机构检测到之后就会发送一个中断请求,DMA在对中断型号进行处理,DMA请求与中断请求是不一样的,DMA请求表示要传送一个字 中断请求则表示一整块的数据传送已经完成了,
请添加图片描述
DMA方式的特点
三总线结构才会出现DMA 与cpu 同时访存的情况
请添加图片描述
DMA与CPU 都可以与主存进行数据的交互,但是应该是先满足主存还是先满足CPU,也就提出了用下列三种方式解决冲突
访存冲突
第三种若是CPU与DMA同时访存的时候,IO 设备优先,因为输入可能会覆盖
请添加图片描述
DMA方式与中断方式
请添加图片描述
本节回顾
请添加图片描述

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

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

相关文章

【逗老师的无线电】骚活,GPS热点盒子自动上报APRS位置

逗老师最近整了个有意思的小活,组装了一个有4G网卡带GPS功能的热点盒子,让盒子基于GPS位置信息,自动上报APRS位置帧 全篇亮点 基于GPS和AGPS共同定位基于TCP直接上报APRS数据帧 别说,这小活整完之后,还是有点意思的&…

linux coredump

文章目录 是什么生成原理coredump 的“危害” reference: 一文读懂Coredump文件是如何生成的 GDB是什么? 是什么 简单的讲:当进程接收到某些信号而导致异常退出时,就会生成 coredump 文件 在程序发生某些错误而导致进程异常退出时&#x…

技术分析内核并发消杀器(KCSAN)一文解决!

一、KCSAN介绍 KCSAN(Kernel Concurrency Sanitizer)是一种动态竞态检测器,它依赖于编译时插装,并使用基于观察点的采样方法来检测竞态,其主要目的是检测数据竞争。 KCSAN是一种检测LKMM(Linux内核内存一致性模型)定义的数据竞争(data race…

亿发软件:中大型仓库进出货管理系统解决方案,定制软件让仓储作业高效便捷

中大型仓库出入库管理是传统厂家供应链管理流程的重要部分,直接关乎货物在仓库当中存储的安全,和员工工作的效率。一旦仓库管理当中出现了疏漏,那么货物的信息数据就会发生变动,导致实际与账目不符。人工带来的低效与不可控是传统…

软件测试行业到底有没有前景和出路?

我现在来跟你说说软件测试的真正情况。 首先一个软件做出来,最不能少的人是谁?不用说就是开发,因为开发是最了解软件运作的那个人,早期不少一人撸网站或者APP的例子,相当于一个人同时是产品、研发、测试、运维等等&am…

15-721 Chapter9 数据压缩

Background disk database的瓶颈在disk IO上的话(也就是说数据压缩的好处很大,可以比较放心的做),那么内存数据库的瓶颈是多方面的,其中包含cpu。所以我们要在计算量和压缩率(DRAM还是有点贵的&#xff0c…

需求管理实践四大流程的注意事项

需求管理实践包括四大流程:需求采集、需求分析、需求筛选和需求处理。 1、需求采集注意事项 需求采集需要通过多种形式对不同用户需求进行收集,并对需求的属性进行详细记录,并记录可追溯的反馈人员,以便后期跟踪修改。 需求管理实…

你不知道的Redis Search 以及安装指南

theme: orange 本文正在参加「金石计划」 这篇文章是为了使用Redis Search 的向量搜索功能提前做的环境准备工作。即讨论如何在准备生产的 linux 环境中安装 RediSearch 和 RedisJSON 模块。 什么是RediSearch? 根据RediSearch的官方文档 RediSearch是这样描述的。 …

线性表,栈和队列(2)

作者:额~我那个早过50了,忘记了 言归正传ca 什么是栈? 小李攒钱买了车,可是他家住在胡同的尽头。胡同很窄,只能通过一辆车,而且是死胡同。小李每天都为停车发愁,如果回家早了停在里面&#x…

pandas笔记:pandas 排序 (sort_values)

1 函数说明 DataFrame.sort_values(by,*, axis0, ascendingTrue, inplaceFalse, kindquicksort, na_positionlast, ignore_indexFalse, keyNone) 2 参数说明 by string或者一组string组成的list,根据什么进行排序 axis{0 or ‘index’, 1 or ‘columns’}ascendi…

其它 Composition API

1.shallowReactive 与 shallowRef shallow有浅的意思 首先在原有的页面上引入它,然后用shallowReactive包裹它 浅层次的意思就是像name,age这些是响应式的,而job就不处理,意思就是只处理第一层数据,像第二层的都不处理…

电气互联系统有功-无功协同优化模型

目录 1 主要内容 模型示意图 目标函数 程序亮点 2 部分程序 3 程序结果 4 程序链接 1 主要内容 本程序基本复现《“碳中和”目标下电气互联系统有功-无功协同优化模型》,文献模型提供了一个很好的创新思路,把常规电气互联系统的调度和有功无功优化…

【Linux】-关于Linux的指令(上)

作者:小树苗渴望变成参天大树 作者宣言:认真写好每一篇博客 作者gitee:gitee 如 果 你 喜 欢 作 者 的 文 章 ,就 给 作 者 点 点 关 注 吧! TOC 前言 今天我们来讲关于Linux的基本指令,博主讲的指令会对应着Windows…

Java 8中新特性Stream的详细理解和使用

Java 8中新特性Stream的基本理解和使用 Stream基本概念 Stream流是来自数据源的元素队列并支持聚合操作 **元素:**是特定类型的对象,是数据源形成的一个队列。Java中Stream不会存储元素,而是按需计算 数据源:Stream流数据的来…

自定义函数 | R语言批量计算组间差值

批量字符替换、数值大小比较并重新赋值 cal_repeat()函数的实际操作1.不考虑处理变量。考虑多变量和指定2列变量的情况(长数据):2.考虑处理变量。考虑多处理,多变量的情况(长数据):3.考虑处理变…

Node【Global全局对象】

文章目录 🌟前言🌟Global全局对象🌟Global对象属性与方法🌟Global对象属性🌟process🌟Buffer类🌟console 🌟写在最后 🌟前言 哈喽小伙伴们,新的专栏 Node 已…

华为OD机试真题(Java),最优策略组合下的总的系统消耗资源数(100%通过+复盘思路)

一、题目描述 在通信系统中有一个常见的问题是对用户进行不同策略的调度,会得到不同系统消耗的性能。 假设由N个待串行用户,每个用户可以使用A/B/C三种不同的调度策略,不同的策略会消耗不同的系统资源。 请你根据如下规则进行用户调度&…

netty源码阅读--服务启动

背景 netty是一个非常成熟的NIO框架,众多apache的顶级项目底层通信框架都是用的是netty,本系列博客主要是记录自己复习netty源码的过程,重在理解netty的关键如:如何启动,如何接受网络数据、netty的内存管理机制以及编解码器等&am…

【KingSCADA】如何建立硬件系统及相关变量

小伙伴们大家好,我是雷工! 本篇学习了解KingSCADA3.8如何建立硬件系统及相关变量,以下为学习过程和操作记录。 一、前言 本篇主要讲解如何定义设备,如何定义变量。 KingSCADA3.8的采集系统是指负责和现场设备进行通讯&#xff0…

通过azure学生认证拿到一年服务器使用权

通过azure学生认证 因为国内备案被迫找其他服务器 开始我买了一个华为的服务器,大家都知道,在国内,服务器是需要备案的。如果你备案过的话,就知道这个是非常麻烦的事情。时间久不说。过程也是非常的繁琐。这个繁琐的过程&#x…