计算机系统概述
计算机硬件基本组成 冯诺依曼机 1 2 3 4 5 6 1.计算机由五大部件组成 2.指令和数据以同等地位存于存储器,可按地址寻访 3.指令和数据用二进制表示 4.指令由操作码和地址码组成 5.存储程序(将指令以代码形式事先输入计算机主存中,然后按程序规定顺序执行) 6.以运算器为中心
现代计算机 1 2 3 4 1.由于以运算器为中心存取效率低,改为了以存储器为中心 2.CPU=运算器+控制器 3.CPU+主存储器=主机(注意这里的主机与平时说的主机有区别,不包含硬盘、风扇) 4.辅存,就是硬盘归于I/O设备,App存储在辅存,只有运行时,才会将代码读取到主存运行
CPU结构 1 2 1971年之后,Intel发明微处理器后,将MAR MDR集成到CPU里 在那之后CPU=运算器+控制器(包括了MAR+MDR)
各个硬件工作原理 主存储器 1 2 MAR:存储器地址寄存器,用于存放所要访问的主存单元的地址。与存储器空间有关。 MDR:存储器数据寄存器,用于存放向主存写入的或从主存中读出的信息。与存储字长相等。
1 2 3 4 存储体 1byte字节=8bit比特 1B=1 byte 1b=1 bit
运算器 1 2 3 4 5 6 乘积高位:两个16位数相乘,结果可能会有32位,那左半部分的16位就是乘积高位,存储到ACC中,右半部分的16位就是乘积低位,存储到MQ中。 ACC - X = 差 被减数-减数=差; ALU:隔在ACC 与 x之间,存储逻辑运算单元
控制器 1 2 3 IR:指令寄存器(从主存储器取出的指令存在这里) PC:程序计数器,存放下一条指令地址(0,1,2,...) CU:控制单元,分析指令,给出控制信号
计算机的工作过程
1 2 3 4 5 6 7 8 9 10 11 1.pc=0指向第一条指令的[主存地址]0,并将0地址放入MAR 2.同时 控制器 通过控制总线 告诉主存储器进行读操作 3.主存储器根据MAR里的地址0取存储体里面的 指令内容(操作码+地址码000001 000000101)放 到MDR 4.然后控制器从MDR取走指令(地址码+操作码),存在IR中 5.IR将指令的[操作码]送给CU分析,是[取数]操作;IR将[地址码]送到MAR,导致MAR=0000000101=5 6.主存储器根据MAR=5,将对应数据放到MDR=0000000000010=2 7.在控制单元指挥,MDR中数据放到ACC中,ACC=2 基本流程 由pc地址,获取指令-->IR存放并拆分指令-->CU分析操作码指令;获取地址码数据
小结 1 现代计算机通常把MAR、MDR也集成在CPU里面
计算机系统层次结构
三种级别的语言 1 2 3 4 5 6 编译程序 1.分别经过编译器(翻译为汇编),汇编器(翻译为二进制) 2.一次性全部翻译,无许再次翻译(下次执行可以执行编译好的文件) 解释程序 1.只经过编译器(直接翻译为二进制) 2.翻译一句,立即执行,接着翻译下一句,且不保存(下次执行还需编译)
程序转换过程
1 每个模块都有一个相对地址(以自己为参照物),链接为可执行文件.exe后装入的是磁盘当中,并且获得一个虚拟的内存地址(因为磁盘不是内存)
1 2 装入-->执行时装入 是将磁盘中的可执行文件在需要运行用到的时候才装入内存,这里有个地址转换,虚拟地址变成真实的物理地址
习题 1~8 9 10 11 12 13 14 15 16 17 18 19 20 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 1.完整的计算机系统应包括(D) A.运算器、存储器、控制器 外部设备和主机 C. 主机和应用程序 D. 配套的硬件设备和软件系统 解析:A是计算机主机的组成部分,而B、C只涉及计算机系统的部分内容,都不完整。 2.冯·诺依曼机的基本工作方式是(A)。 A.控制流驱动方式 B.多指令多数据流方式 C.微程序控制方式 D.数据流驱动方式 解析:数据驱动方式分为:控制流驱动、数据流驱动 控制流驱动:指令-->数据 (计算机先取出指令,指令告诉我们需要什么数据,然后操作) 数据流驱动:数据-->指令 (首先直到想要什么数据,然后取出指令,对数据进行操作) 3.下列(B)是冯诺依曼机工作方式的基本特点。 A.多指令流单数据流 B.按地址访问并顺序执行指令 C.堆栈操作 D.存储器按内容选择地址 解析:A冯诺依曼机是单指令但数据流 BD其他机器也有 C即存储程序特点 4.以下说法错误的是(D)。 A.硬盘是外部设备 B.软件的功能与硬件的功能在逻辑上是等效的 C.硬件实现的功能一般比软件实现具有更高的执行速度 D.软件的功能不能用硬件取代 解析:C硬件执行速度比软件快,比如C语言需要编译在执行,而硬件可以直接执行,速度更快 D软件的功能都能有硬件取代 5.存放欲执行指令的寄存器是(D)。 A.MAR B.PC C.MDR D.IR 6.在CPU中,跟踪下一条要执行的指令的地址的寄存器是(A)。 A.PC B.MAR C.MDR D.IR 7.CPU不包括(C)。 A.地址寄存器 B.指令寄存器(IR) C.地址译码器 D.通用寄存器 解析:地址译码器是存储体里面的用于识别地址的部分,不属于CPU里 8.在运算器中,不包含(D), A.状态寄存器 B.数据总线 C.ALU D.地址寄存器 解析:D选项MAR集成在CPU中控制器里,不在运算器中
1 2 越靠近CPU存取速度越快。 Cache是高速缓冲存储器,使得主存中部分数据存储在Cache中避免每次都从主存中找,提高存取速度
1 2 A数据通路是数据在部件之间的传送路径 C程序运行时如果存储在硬盘当中,那么读取数据的速度就会非常慢,所以不会在硬盘当中
1 2 3 4 软件分为系统软件和应用软件。 - 系统软件:直接和底层交互,保证计算机正确高效运行的基础软件(操作系统、数据库管理系统、语言处理系统..) - 应用软件:为了解决某个应用领域问题特意编写的软件(Pr、youtub、数据库系统..)
1 2 3 - 编译程序:例如编译器,将高级语言编译为汇编 - 连接程序:例如程序中引用别人的库函数需要连接程序 - 两者都输系统软件
1 2 3 4 5 6 翻译程序有三种: - 汇编程序:汇编语言-->机器语言 - 编译程序:高级语言-->机器语言(部分高级语言会先编译为汇编语言,在汇编为机器语言) - 解释程序:高级语言-->机器语言 链接程序只负责逻辑块顺序的调整
1 2 因为指令和数据都用二进制表示,所以计算机如何区分指令和数据呢? - 根据指令周期,根据指令和数据确定指令周期,在这个周期里取的的一定是指令或数据
计算器的性能指标 存储器性能指标 1 2 3 4 MAR:32位(能存储32个二进制位)-->2^32个地址 MDR:8位(存储字长=每个存储单元大小) 1个MAR 对应 1个MDR-->容量(总字长)2^32*8 bit =4GB
CPU性能指标 1 2 3 4 5 6 7 8 9 10 11 12 13 CPU主频:1s内脉冲信号的次数,单位Hz,10Hz表示每秒10个脉冲信号 CPU时钟周期=主频周期=节拍:1个脉冲信号所需时间 = 1/CPU主频 CPI:执行1个指令所需时钟周期数 CPU执行时间:程序执行时间=(CPI*指令条数)/主频 IPS:每秒执行多少指令=主频/CPI FLOPS:每秒可以进行多少次浮点操作 通常会给IPS、FLOPS加数量单位K M G T (注意:与内存大小表示数量级不一样) 描述存储容量、文件大小时:K=2^10,M=2^20,G=2^30,T=2^40 描述频率、速率时:K=10^3,M=10^6,G=10^9,T=10^12
系统整体性能指标 1 基准程序(跑分软件):是用来测量计算机处理速度的一种实用程序,以便于被测量的计算机性能可以与运行相同的其它计算机程能进行比较
习题 1 2 3 4 5 6 提升CPU性能主要途径是采用并行技术,是CPU空闲部分运作起来 计算机结构主要分两种结构 - 冯诺依曼结构:存储程序 - 哈佛结构:程序数据分开存储
1 2 3 4 5 - 寄存器的基本单元是D触发器 - D是输入、CP是控制信号、Q是输出 - 只有当CP信号为1时,才能接受保存D输入信号(0/1); - 计算机数据处理时,一次存取、加工和传送的数据bit位数长度,称为“字”
1 2 3 4 - 存储字长: 等于MDR位数 - 指令字长 - 机器字长:计算机一次能直接处理的二进制位长度=内部存储器位数 - 数据字长:计算机数据总线(数据传输线),一次能并行传送信息的位数,与MDR没有直接关联,加 入MDR存储字长是16bit,数据字长4bit,那么数据总线需要分4次传输。
1 32/64位微机,指的是,机器字长32/64,也就是一次性直接处理二进制数据位数
1 科学计算的计算机,涉及到很多浮点运算,所以,MFLOPS是衡量参数
1 CPU周期,也称为机器周期,因为CPU执行速度很快,但是从主存中存取数据很慢,所以以从内存中读取一条指令的最短时间来定义机器周期
1 2 CPI 一条指令所需要的时钟周期个数 提高时钟频率,程序执行变快,也就是一条指令所需时间变短,但是由于周期也变短,所以周期个数还是一样的
数据的表示和运算 进位计数制 进制转化 1 2 3 八进制 0,1,2,3,4,5,6,7 十进制 0,1,2,3,4,5,6,7,8,9 十六进制 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
1 2 3 4 5 6 7 8 9 10 11 二进制一>八进制 3位一组,每组转换成对应的八进制符号 二进制一>十六进制 4位一组,每组转换成对应的十六进制符号 八进制一>二进制 每位八进制对应的3位二进制 十六进制一>二进制 每位十六进制对应的4位二进制
1 2 3 十进制-->二进制 整数部分 /2 小数部分 x2
进制常见书写方式
BCD码 1 2 BCD码是二进制编码的十进制数的表示方式 分为:8421码、8421余3码、2421码
8421码 1 2 3 8421码 - 四个二进制位表示十进制数的基本数字1~9(有6个冗余) - 8、4、2、1分别对应每一位的权值
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 0 1 2 3 4 5 6 7 8 9
1 2 3 但是当数字>9时,虽然四个二进制位能表示,但是比如13-->1101,但是却不在映射表里,1101没有意义 所以+6校正,1101+0110=19=10011=>0001 0011 后半部分3,前半部分可以看做10,虽然在二进制位上是19,但是这样表示13更加有规律
余3码 0011 0100 0101 0110 01111 1000 1001 1010 1011 1100 0 1 2 3 4 5 6 7 8 9
2421码 1 2 3 2421码 - 改变权值定义,四位二进制位权值改为2、4、2、1 例如:1101-->1x2 + 1x4 + 0x2 + 1x1 - 为了避免歧义(例如5表示可以是0101 ,也可以是1011),规定5以上的数字首位为1
0000 0001 0010 0011 0100 1011 1100 1101 1110 1111 0 1 2 3 4 5 6 7 8 9
小结
无符号整数的表示和运算 无符号数表示 1 2 3 1.无符号数,寄存器bit限制,超出寄存器大小,强行硬塞,数据丢失 2.对于无符号数,表示的都是非负整数,无原码、补码、反码一说 3.n bit 无符号数表示范围0~2^n -1
无符号数的运算 1 2 加法运算:从低位到高位按位相加 减法运算:计算机只能加法运算-->2-5=-3;对5取反+1,再与2相加
带符号整数的表示和运算 1 2 3 1.原码、补码、反码都是对一个带符号数的不同表示方式 2.n+1个bit位,最高位0/1表示正负;剩余n-1bit表示数值真值;
原码表示 1 2 3 1.对于真值0分为[+0]:0000 0000 ; [-0]:1000 0000 2.缺点是符号位不能参与运算,导致原码无法进行+-之间加减运算 3.带符号数的原码表示范围:-(2^n - 1)~2^n - 1
补码表示 1 2 3 4 - 正数 原码-->补码:不变(正数,原码、反码、补码一致) - 负数 原码-->补码:符号位不变,数值位取反(先转反码);然后+1(转补码) - 负数 补码-->原码:符号位不变,取反+1 - n+1个bit补码表示范围:-(2^n)~2^n - 1
1 2 - 手算,负数 原码转补码:从右往左找到第一个1,这个1左边的所有“数值位“按位取反" - 逆向转换方法一样
补码加法运算
补码减法运算 1 2 3 4 将减法变加法 A-B --> [A]补-[B]补 --> [A]补 + [-B]补 [B]补 <--> [-B]补 将全部位按位取反,再+1
各种码性质总结 1 2 3 4 5 6 7 8 9 为什么补码0只有0000 0000 一种表示方式?为什么1000 0000不表示-0,而表示-128? 1.因为, [+0]原=0000 0000 -->[0]补=0000 0000 而 [-0]原=1000 0000 -->[-0]补=1111 1111 + 1 =0000 0000 所以[+0]原,[-0]原 对应补码都是0000 0000,那么 [0]补 只有一种表示方式 2.因为补码是一种取模的运算 ...如下图
bit数 3bit 4bit 8bit 二进制补码最小值 100 1000 1000 0000 对应真值 -4 -8 -128
移码 1 2 - 移码:补码的基础上将符号位取反。注意:移码只能用于表示整数 - 如果机器字长n+1bit,那么移码表示范围-(2^n - 1)~2^n -1,与补码表示范围相同
定点小数 定点小数概念 1 2 3 4 5 6 7 定点整数(带符号整数) - 小数点默认位置在最后面 - 能由原、反、补、移码表示 定点小数 - 小数点默认在符号位之前一位 - 能由原、反、补码表示
定点小数表示范围
定点小数扩展 1 2 定点小数扩展,是往小数点后面扩展bit位 定点整数是往小数点前扩展bit位
定点小数加减法运算
习题
1 2 3 4 - 16进制表示符号:0x --> 前标 ; H -->尾标 - 16进制表示,为了区分16进制和二进制,例如 11无法区分是16进制的11 还是二进制的3 - 10进制标识符号:D --> 尾标 - 2进制标识符号:B --> 尾标
1 2 3 4 精度低的无法表示精度高的单位,所以存在有的十进制小数转换为二进制的时候 例如: 10进制:0.3 -->二进制位数会无限循环下去,无法完全表示 十进制:高精度(一位分为0~9) 二进制:低精度(一位分为0,1)
1 2 3 移码是将补码的符号位取反 由于补码对0只有一种表示 所以移码也只有一种表示
1 2 二进制能表示2^N个数 十进制能表示10^N个数
1 发现,规律,当数字为2的n次方时,对应二进制补码就是1000...
1 二进制转为16进制,将二进制位4个一组,最后加H标注16进制
1 2 补码表示范围-128~127 移码0000 0000 -->补码1000 0000 (128),-->[-x]=128,超出补码范围,所以-->移码也表示不了
运算方法与运算电路 最基本逻辑运算 1 2 3 4 5 6 7 8 9 10 11 12 与、或、非 其中 与 或 是双目运算符(3个数参与运算);非 是单目运算符(只有一个数参与运算) 与:相当于数学中的乘法运算 或:相当于加法运算 两者符合分配率、结合律 利用这一点可以将实际中的电路问题-->用数学表达式描述出来-->化简表达式-->化简电路 逻辑表达式,实际上就是对电路的数学描述,对表达式的简化,就是对电路的简化,省钱
复合逻辑 1 2 3 4 与非: 先与后非 或非: 先或后非 异或:两边不同输出1,两边相同输出0 同或:两边不同输出0,两边相同输出1
电路的加法器设计 一位全加器FA 1 2 1.Si:本位的和,当Ai Bi Ci-1 其中只有1个1时,Si才会为1 2.Ci:本位的进向下一位的进位,当Ai Bi Ci-1存在两个1时才为1
串行加法器 1 2 1.串行加法器:只含有一个全加器,外加一个进位触发器(用于存储进位信号,参与下一次运算) 2.由于串行加法器的特点,只能一位一位的进行运算,运算效率较低
串行进位的并行加法器 1 2 1.并行加法器:将n个全加器串接起来,就尅进行两个n位数的相加 2.但是,这种只有当低位运算完进位之后,才能进行下一位的运算,这中间进位数据的传输比较慢,影响效率
并行进位的并行加法器 1 2 3 4 5 6 7 8 9 10 1.并进进位的并行加法器 - 首先将每一位对应的Ai Bi 存入一位全加器中 - 再同时运算Ai Bi得到Gi Pi,然后低位将Gi Pi 传给所有高位 - 这样所有位就同时拥有了所有需要的数据 - 然后再同时进行加法运算,得到结果 优点:非常快,几乎进位都是同时产生的 缺点:位数越高的电路设计越复杂(逻辑表达式很长-->电路就复杂) 所以最多套到C4,也就是最多将4个FA 并行串联
补码加减运算器 1 2 3 4 5 6 - Sub:加减法控制信号;0-->加法 1-->减法 - 多路选择器接收Sub控制信号,0(加法),补码直接传入;1(减法),补码全部按位取反,输入 - 同时Cin接收Sub信号,0(+0) ,1(+1,实现取反+1) 同样也能实现有符号数的+ - 运算;加法直接按位相加,减法取反+1
标志位的生成
OF:Overflow Flag 1 2 3 4 5 6 - OF判断有符号数是否发生溢出,OF=1,溢出 - OF=最高位进位⊕次高位进位 1011 + 1001 = 1 0100 --> 只有符号位进位 溢出 0100 + 0100 = 1000 --> 只有次高位进位 溢出 1111 + 1100 = 1 1011 --> 符号位和次高位都进位,不溢出 - OF对无符号位加减法无意义
1 进位都是1的情况,任然1⊕1=0,没有溢出,如下
SF: Sign Flag 1 2 3 - SF符号标志位,SF=最高位本位和,SF=0表示正数,SF=1表示负数; - 起始很好理解,当补码运算完得到的结果,依然是补码-->原码(转换过程符号位不变,所以补码正负就是原码正负) - 同样只对有符号数有意义
ZF: Zero Flag 1 2 - ZF标志运算结果是否为0,ZF=1说明结果为0 - 对有符号数和无符号数都有意义
CF: Carry Flag 1 2 3 - 进位/借位标志位,表示无符号数的加减法是否发生了进位或借位(溢出) - CF判断无符号数是否溢出,CF=1时说明无符号数发生溢出 - CF=最高位产生的进位⊕Sub
定点数的移位运算 算数移位 原码的移位 1 2 原码的移位--符号位保持不变,仅对数值位移位 右移高位补0,低位舍弃;若舍弃位=0,则相当于÷2;若舍弃位=1,则精度丢失
1 左移低位补0,高位舍弃,若舍去位=0,则相当于x2;若舍弃的位=1,则出现严重误差
反码的移位 1 2 3 反码移位 - 正数反码=原码,所以移位与原码一致 - 负数反码 右移高位补1,低位舍去;左移低位补1,高位舍去
补码的移位 1 2 3 补码移位 - 正数补码=原码,所以移位与原码一致 - 负数补码 右移高位补1,低位舍去;左移低位补0,高位舍去(想象成转为原码移位,有一个取反+1的操作)
逻辑移位
循环移位 1 2 不带进位位:左移时将最高位同时送往最低位和CF符号标志位 带进位为:左移将最高位送往CF,同时将CF原来的数送往最低位
定点数的乘除运算 原码乘法运算 手算乘法(二进制) 1 2 1.乘法要错位相加,原因是位权不同 2.二进制乘法与十进制乘法基本一致
原码的一位乘法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1.X存放被乘数;MQ存放乘数 2.ACC开始前置为0 3.MQ每一次将最低位 与X相乘,得到的数与ACC相加 4.例如开始时,ACC=00000+1*01101=01101 5.接着MQ右移一位,ACC也右移一位补在MQ高位;此时ACC=00110 ;MQ=10101 6.重复MQ最低位 与X相乘,得到的数与ACC相加 7.ACC=00110 + 1*01101=10011 8.循环上述过程,直至MQ乘数的符号位位于最低位 9.这样巧妙地实现了错位相加,也解释了为什么ACC存储乘积高位,MQ存储乘积低位 10.最后修改乘积的符号位 xs⊕ys=1⊕0=1,为负数 注意 - 乘数和被乘数的最高位为符号位,都设为0,也就是只有数值位参与运算,最后才通过异或逻辑运 算,改变ACC中乘积符号位
1 2 3 手算模拟 1.乘法过程中均为逻辑右移 2.部分积和被乘数要取双符号位
补码乘法运算 补码的一位booth乘法 1 2 3 4 5 6 7 8 9 10 11 12 1.为什么要采用双符号位补码运算? - 因为所有寄存器都统一使用n+2位,n个真值位,2个符号位 - 这里双符号位是ACC和X寄存器中使用;MQ是单符号位,最后一位对多一个辅助位(初始为0) 2.根据 [辅助位-MQ最低位] 确定加什么 - 辅助位-MQ中最低位=1时,(ACC)+[x]补 - 辅助位-MQ中最低位=0时,(ACC+0 - 辅助位-MQ中最低位=-1时,(ACC)+[-x]补 3.最后当MQ符号位处于最低位时,还要多一次加法运算(辅助位-符号位) 4.MQ符号位之前的n位,补位在ACC最终值后面
乘法总结 1 2 3 1.部分积和被乘数都采用双符号位 2.原码一位乘法累加n次(n为数值位);补码booth乘法累加n+1次(辅助位一直与前一位判断直到符号位,所以多一次累加) 3.位移次数都是n次
原码的除法运算 手算除法(二进制) 1 2 3 由于每一位的商只能是0或1 所以当除数>剩余部分,上0;反之上1 由于这里展示的机器字长最多5位,确定五位商就停止
恢复余数法 1 2 3 4 5 6 7 8 1.ACC 存储被除数或余数的真值(符号位=0);X中存储除数真值|y|; MQ中存储商 (默认初始都为0)。 2.MQ最低位作为上商位,先默认上商1 3.(ACC)+[-|y|]补 < 0 说明相减结果小于0,上商应该为0;(ACC)+|y| --》恢复余数 4.得到余数,余数末尾补0 5.ACC 和MQ统一逻辑左移一位; 6.MQ继续上商1,看余数是否<0;..逻辑左移..MQ上商... 7.最后符号位单独异或处理 8.ACC中存储的最终的余数实际=(ACC)x2^-n -->(n是数值位数,小数点左移n位)
加减交替法(不恢复余数) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 每次上商位1得到余数为负时,都需要加回除数的补码,这样效率低。 有没有当余数为负时,更加高效的算法呢? =>加减交替法 1.假设上商1,得到余数负数a,恢复余数加回除数补码b,即a+b 2.然后余数(ACC)左移一位(相当于x2),即2(a+b) 3.继续上商1,2(a+b)-b=2a+b; 1.假设上商1,得到余数正数a,无需回复余数 2.然后余数(ACC)左移一位,即2a 3.然后上商1,2a-b ==>发现当余数为负数时,MQ商先改为0,[恢复余数(a+b),再左移1位2(a+b)],下一轮商1,减去除数==>2a+b 直接就得到了下一轮新余数 ==>发现当余数为正数时,MQ商1不变,[无需恢复余数,将余数a左移一位(2a)],下一轮商1,减去除数==>2a-b 直接就得到了下一轮新余数
1 2 3 4 5 - 若余数为负则可直接商0,让余数左移1位再加上除数得到下一个新余数 - 若余数为正则商1,让余数左移1位再减去余数 - 最后一步如果余数是负数,那么无需再跳步,直接恢复余数--> +[|y|补]得到正确余数 - 最后正确余数的正负性=商的正负性
1 2 3 4 - 前面的加减法进行n+1次 - 每次加减确定一位商,左移n次,因为最后一位商确定后不需要左移 - 最后如果余数是负数,还要再进行一次恢复余数的加法 - 所以加减法总次数可能是n+1,也可能是n+2次
补码的除法运算
习题
1 串行进位的并行加法器,影响速度的关键主要是进位延迟,因为只有当低位运算结束产生进位信息之后高位才开始运算
1 2 进位生成信号g,由本位两位数相加生成的进位 进位传递信号P,由于上一位的进位传递生成的进位
1 2 3 4 参考补码的移位 注意 正数补码与原码移位相同; 负数时,左移低位补0(因为转换为原码时,有个取反+1操作);右移高位补1就可以了
1 2 3 单符号位判断溢出,是判断与输入的符号位是否相同 双符号位判断溢出,是判断两个符号位是否相同 两者都是异或判断
1 用两个二进制位来表示符号位,其余位与补码相同,【例如模2补码的-3为1101,模2用1位,这里是最高位表示符号位,剩下3位是3的补码,同样模4补码表示-3为11_101,模4用两位表示符号位,这里是最高两位11,其余3位为3的补码】总的说来就是符号位左边那一位表示正确的符号(_**这就说明了选择题里面存储模4补码只需要一个符号位是正确的,因为任意一个正确的数值,模4补码的符号位两个都是一样的,只需存储一个就行了),0为正,1为负;右边那一位如果和左边的相同,如 "00”表示正且无溢出,"11"表示负且无溢出。如果右边那一位与左边那一位不一样,则表示有溢出。
1 2 3 - 一位符号位判断溢出:参与操作的两个符号数相同,但计算结果与原操作数不同,则溢出了 - 双符号位判断溢出:两个符号位存储相同的符号数,当计算之后结果两个符号位不同,说明溢出 - 一位符号位+进位情况:符号位进位与最高位数值位产生的进位相同时无溢出,否则溢出
s1s2符号位 表示情况 s1s2=00 表示结果为正,无溢出 s1s2=01 表示结果正溢出 s1s2=11 表示结果为负,无溢出 s1s2=10 表示结果负溢出
1 最终乘积,2n+1位,n次移位,n个原本数值位数,1符号位
1 2 补码左移不出现错误,前提是最高位不保存信息 负数时,1表示无信息:正数时,0表示无信息
1 2 3 OF溢出标志-->什么时候会溢出? - 正数加负数永远不可能会溢出 - 溢出只可能是正数+正数=负数(过大);负数+负数=正数(过小)
1 2 - 该计算机存储方式采用小端存储-->从左到右,地址从低到高-->低位数据存储在低位地址 - 该计算机采用按边界对齐存储,一个字是32bit=4byte(字节) ,保证边界对齐即可如下
1 2 3 CF 借位标志:判断数值最高位有没有向更高位借位,表现为补码就是数值最高位有没有产生进位 只有当更小的数-更大的数的时候,才会发生借位
补码的移位 | 风起之时 (fqzs.netlify.app)
补码、模与运算 | 风起之时 (fqzs.netlify.app)
1 2 3 这题求A+B补码 方式1.将A、B转换成对应补码,然后将两个补码相加,然后取模(2^(n+1)) 方式2.手算将两个数运算结果算出来,-9-5=-14;接着-14转换为补码,然后取模
模4补码与模2补码 | 风起之时 (fqzs.netlify.app)
C语言中强制类型转换 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 short x=-4321 ; unsigned short y =(unsigned short )x;int a=165537 ,b=-34991 ; short c=(short )a, d=(short )b short x=-4321 ; int m=x; unsigned short n=(unsigned short )x; unsigned int p =n;
数据的存储和排列 大小端存储 1 2 大端存储:低位地址存储高位字节,高位地址存储低位字节 -->符合阅读习惯 小端存储:低位地址存储低位字节,高位地址存储高位字节 -->便于机器处理
边界对齐存储 1 2 3 4 5 6 7 8 9 10 现代计算机通常按字节编址-->也就是一个字节需要一个地址存放 寻找地址方式有多种 - 按字节寻址,无需序号转换,第几号字节就是对应第几号地址 - 按半字寻址,一个半字=2字节,需要序号转换,第几个半字转换为第几个字节-->序号x2 - 按字寻址,一个字=4字节,序号转换,第几个字转换为第几个字节-->序号x4 边界对齐方式-->访问同一个字/半字长度的数据-->只需要一次-->当这个字剩余空间无法存储一个完整数据时,就会浪费剩余空间,存储在下一个字里面(空间换时间) 边界不对齐-->访问同一个字/半字长度的数据时-->有可能分开存储在不同的字里面,需要两次读取,然后拼接--》没有空间浪费(时间换空间)
浮点数的表示与运算 浮点数的表示 1 2 阶码:例如2^8,阶码=8 尾数:常用原码或补码表示的定点小数
浮点数位数的规格化 1 浮点数,尾数数值部分,最高位必须是有效值(因为存储bit有限,所以尽可能将后面的有效数字记录下来,这样就尽量减少精度丢失)
1 双符号位,当溢出发生时,可以挽救,更高位的符号位是正确符号位
1 2 3 4 5 6 原码表示的尾数进行规格化过后(最高位数值位必须有效=1) 正数:最大值0.111...1;最小值0.10...0; -->表示范围1/2<=M<=1-2^n 负数:最大值1.100...0;最小值1.11...1; -->表示范围-(1-2^n)<=M<=-1/2 补码表示的尾数进行规格化后(最高位数值位必须有效,正数最高位=1,负数最高位=0) 正数:与原码一致(因为正数补码=原码) 负数:最大值1.01...1;最小值1.00...0 -->表示范围-1<=M<=-(1/2 + 2^-n)
IEEE 754标准 IEEE 754标准浮点数格式
阶码用移码表示 移码=阶码真值+偏置值 阶码真值=移码-偏置值 偏置值的公式为: 移码(这里的移码看作无符号数)的表示范围为: 尾数用原码表示 隐含最高数位1阶码全1和阶码全0用作特殊用途 IEEE 754规格化
IEEE 754标准 十进制转换成二进制浮点数` 二进制浮点数转换成十进制` IEEE 754规格化表示的浮点数范围 要表示的数绝对值要更小怎么办?1 2 3 4 5 6 7 8 IEEE 754标准 1.尾数部分原码表示;阶码部分用移码表示; 2.位数部分的数符放在最左端(阶码前面) 3.尾数部分默认最高位有一个1,如下,真实的尾数部分要加个1--> 1.M 4.阶码真值=移码-偏移量;如下 E-127 5.阶码全1,全0作特殊用途,不参与表示范围 6.这里规定移码的偏置值=2^(n-1)-1 7.移码1111 1111 表示-128 ;移码0000 0000 表示-127
十进制转换成二进制浮点数
二进制浮点数转换成十进制
IEEE 754规格化表示的浮点数范围
1 2 3 IEEE 754单精度浮点型能表示的最小绝对值、最大绝对值是多少? - 最小绝对值;尾数全为0(因为尾数部分默认隐藏了一个1),阶码的移码表示0000 0001,E-127=1-127=-126; 最小正数=(1.0)x2^-126 - 最大绝对值:尾数全为1,阶码的移码表示1111 1110,此时整体的真值为(1.11...11)x2^127
要表示的数绝对值要更小怎么办 1 2 3 4 5 6 7 周知,阶码全为0 表示的是-127,但是阶码规定全0用作其他用途 - 当阶码全0,固定视作阶码=-126,且尾数隐藏最高位是0(也就是说非规格化了,这样最高位是0,也就能表示更小的绝对值) - 当阶码全0,尾数M全0时,表示真值+-0 - 当阶码全1,尾数M全0时,表示正负无穷,具体正负看符号位 - 当阶码全1,尾数M不全为0时,表示非数值"NaN(Not a Number)"(如0/0,∞-∞这样的非法运算)
浮点数的加减运算 运算步骤
对阶: 小阶向大阶靠齐尾数求和 :对阶之后位数相加 规格化:使得形式为 x . mmm 舍入 : 由于存储字长有限,规定只能保留x为有效尾数 判溢出
1 2 3 4 5 6 7 舍入 1."0"舍"1"入法 采用双符号位,当对符号位产生进位时,低位的符号位产生变化,此时对整体进行算数右移,同时阶码+1,由于右移,最低位会舍去-->此时规定"0"舍"1"入,-->当最低位0直接舍去,当最低位为1,往高位进一位1,也就是移位后末尾+1。这种方法可能 2.恒置"1"法 尾数右移时,无论丢掉最低位时“1”还是"0"都是右移后的尾数末尾恒置"1",这种方法同样有使尾数变大变小的两种可能
浮点数强制类型转换 1 2 3 4 5 6 7 8 9 10 float : 1符号位 + 8阶码 + 23位尾数(最高位隐含一个1,实际有效24位) double尾数:1符号位 + 11位阶码 + 52位尾数(隐含一个1,实际有效53位) 32位: char-->short-->int-->long-->double float-->double 这些转换不会出现精度丢失 int:表示整数,范围-2^31~ 2^31-1 ,,有效位数32位 float:表示整数及小数,范围...如下 因为float尾数只有23位(实际24位有效)<int 31位 ,但是由于float有阶码,float可以表示范围更大的数字,所以int转float不会溢出,最多只是由于位数限制丢失部分精度
类型 32位(byte) 64位(byte) char 1 1 short 2 2 int 4 4 long 4 8 long long 8 8 float 4 4 double 8 8
习题 1 2 运算过程中自动会从低字节转换为高字节类型-->防止数据溢出 虽然long与dobuble都是8字节,但是double能表示的范围更大,所以转换为long
1 2 基数-->小数点每移动一位,数值扩大或缩小的倍数 所以基数越大,在尾数数量相同的情况下,表示的范围越宽,但是由于跨度大精度也低
1 2 浮点数的溢出: 之后规格化之后阶码超出所表示范围,才会发生溢出
1 2 3 4 5 6 7 8 9 10 11 12 double浮点数阶码: 移码=真值+偏置值(单纯看做无符号数进行加减) 阶码11bit -->阶码是用移码表示-->要求真值最大-->移码最大(单纯看做无符号数) 真值=移码的二进制数-偏置值(1023)=1111 1111 110 - 1023 = 2046 - 1023=1023 为什么移码不能是 1111 1111 111?这样不是更大吗? 因为移码全1用于表示无穷或者"NaN(Not a Number)".所以移码二进制数最大是 除了最低位为0,其他位全1 double浮点数尾数: 尾数有52为也就是 .111...1(前面隐藏了一个1实际为53位-->1.111...1= 2-2^-52 )
1 2 3 4 1111 00.. 0000 分别当做移码、原码、补码 、单精度浮点数 求大小排序? 分析:最高位为1,其中只有移码表示的是正数
1 2 3 4 A.并不能增加数据表示范围,数据表示范围主要有阶码决定 B.无论有没有规格化,浮点运算都需要对阶,所以并没有方便浮点运算 C.数据溢出是因为阶码超过表示范围 D.规格化可以使有效值尽可能往前靠,尽可能增加能表示的有效位数-->提高精度
1 2 3 4 5 6 7 浮点数的溢出: 上溢-->是指二进制绝对值超出机器能够表示范围,这里带上正负号就分为正上溢/负上溢 例如:机器只有8bit,能表示最大机器数 1111 1111,但是计算结果是 1 1111 1111就叫 上溢 下溢-->是指二进制绝对值小于机器能够表示范围,这里带上正负号就分为正下溢/负下溢 例如:机器只有8bit,如果要表示 0.000 0000 1 由于只有8bit 只能表示到0.000 0000 所以下溢统一表示成0
1 2 3 4 5 6 注意这里尾数是采用补码形式 采用的不是IEEE 754标准 ,所以尾数小数点前的那位数代表符号位 根据下面表格,要使得最高位必须是有效值(因为存储bit有限,所以尽可能将后面的有效数字记录下来,这样就尽量减少精度丢失) 基数为2 --> 阶码变化1能一次移动一位小数点,故最高的一位为有效数即最大精度 基数为4 --> 阶码变化1能一次移动两位小数点,故最高两位其中一位有效即最大精度 ...
1 2 3 舍入只当尾数右移时发生 1.右规时发生 2.对阶相加时发生
1 2 3 4 5 6 7 8 9 10 11 阶码(2bit符号位+3bit数值位); 尾数(2bit符号位+5bit数值位) X 7 -> 00 111 29 -> 00 11101 ->右移5位-> 00.11101 Y 5 -> 00 101 ->对阶+2-> 00 111 5 -> 00 00101 ->右移3位-> 00.10100 -> 再右移2位->00.00101 X+Y 尾数相加-> 00.11101 + 00.00101=01.00010->溢出->右规->00.10001 阶码+1->01 000->阶码溢出->最终结果溢出
1 2 II. 1.5678E3 = 1567.8 有小数转化为int小数部分会丢掉损失精度 IV. d+f对阶 , f小数点右移97位,尾数只有23位,右移97位数据完全舍去只有0
1 2 3 C800 0000H 转换为二进制 1100 1000 0000 0000 0000 0000 0000 0000 当表示为int型时,int是补码表示 ,因此转换为原码--> 1011 1000 0000 0000 0000 ... 当表示为float时,符号位1;阶码 10010000 ;尾数 000 0000 0000 0000 0000
1 2 3 如何判断某些小数能否被IEEE 754浮点数表示? 1.将小数转化为分数 2.看分母是否是2^k,如果是,分母就能被约掉,从而能精确表示
1 2 3 4 5 6 7 -0.4375 x2 --> -0.875 x2--> -1.75 符号位1,阶码值2,尾数值1.75 --> 阶码=2-127=-125-->0111 1101 --> 尾数=.1100 ...000(1隐藏了) 最终1 0111 1101 1100 ...000
1 2 注意这里是转换成普通浮点数类型,不是IEEE 754标准 所以尾数最高位是符号位(没有隐藏1),小数点后一位开始才是数值位最高位
1 2 3 4 5 6 两个规格化浮点数进行加减 - 尾数溢出时,采用双符号位的第二个符号位的值发生变化,此时就能判断需要进行一次 右规 - 尾数最高位数值位不是有效位时,需要进行左规,具体左规几次,看中间空着几位无效 位
存储系统 存储器系统基本概念 存储器的层次化结构 1 2 3 - 越靠近CPU的读取速度越快,造价越高,容量越小 - Cache——主存.解决了主存与CPU速度不匹配的问题 - 主存——辅存,实现虚拟存储系统,解决了主存容量不够的问题(app存储在辅存,运行时不 断将需要运行的部分代码搬入主存中)
各层存储器的速度与价格 1 固态硬盘比机械硬盘读写到内存的速度快很多,所以固态硬盘的电脑开机速度更快
存储器的分类 按层次分类 1 2 能被CPU直接读取:Cache 主存(内存) 不能被CPU直接读取:辅存、外存
按存储介质分类 1 2 3 半导体存储器:主存、Cache 磁性材料存储器:磁盘、磁带 光存储器:光盘...
按存取方式分类 1 2 3 4 - RAM(Random Access Memory) :随机存取存储器,读写任何一个存储单元所需时间相同,随机访问 - SAM(Sequential Access Memory):顺序存取存储器,读写一个存储单元时间取决于存储单元物理位置。例如磁带,想要读取后面的内容必须,等待磁带滚动到后面 - DAM(Direct Access Memory):既有随机存取又有顺序存取特性。例如留声机,唱片。可以随机放置唱针,决定其读取位置,又需要顺序播放 - CAM(Content Addressed Memory):相联存储器,按照内容访问的存储器,上面的3种都是按照地址访问的存储器
按照信息可更改性分类 1 2 - R/WM(Read/Write Memory):即可读,也可写。如;磁盘、内存、Cache - ROM(Read Only Memory): 只能读,不能写
按照信息的可保存性 1 2 易失性存储器:断电后信息消失,(主存、Cache) 非易失性存储器:断电后信息仍然保留--
存储器的性能指标
主存储器的基本组成 基本的半导体元件及原理 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 存储元由MOS管、电容组成 - MOS管:像是一种电控开关,只有当电压达到阈值x后,才会导电(半导体) - 电容:达到一定电压差时,两端电荷移动(给电容充电);根据电容是否保存了电荷来 存储0、1信息 - 如何知道保存的是0 or 1? 通过给MOS管一个阈值电压,使MOS管接通,然后,电容放点,如果保存了电荷,那 么在导线另一头能电测到电流说明信号"1".无电流则信号"0" 如图,由8给存储元组成一排,构成一个存储单元(存储字),同一根红色导线连接8个存储元的MOS管,这样只要给红色导线一个阈值电压,在绿色导线处读取电流信号,就能同时得知8个bit信息。 -->这也是为什么一次读取最多的bit位数被称为存储字,因为一个存储字,MOS管接通了同一根导线。 存储元:存储一个bit的0、1信息 存储单元:一整行的存储元。也称存储字 存储体:所有的存储单元,构成存储体
存储器芯片的基本原理 1 2 3 4 5 6 7 地址线:输送地址信号到MAR,每根地址线,输送1bit信号 MAR:存储了地址信息(0/1信号) 译码器:将地址信息转化为电信号,传递给字选线 字选线:连接了某一整个字的所有MOS管,字选线接通电压,存储单元内的信号被释放 MDR:存储 存储字给出 的 01信号 数据总线:和CPU连接,总线宽度=存储字长 CPU根据数据总线取的MDR 里的数据
1 2 3 4 5 6 7 8 9 10 11 12 另外除了上述构造外,还需要控制器来对芯片内部电路工作进行控制 - MAR 中存储的地址的电信号,电信号是不稳定的,控制器控制其只有在稳定之后,才会通过译码 器进行翻译. - MDR 中存储了数据的电信号,同时控制器,控制待其稳定之后,才会通过数据总线送入CPU 另外,控制器对外提供3种线路: - 片选线(CS/CE):头上划线表示该信号低电平有效。控制该芯片是否被启用 - 读控制线(OE):头上划线表示该信号低电平有效。控制此次操作是读数据操作 - 写控制线(WE):头上划线表示该信号低电平有效。控制此次操作是写数据操作 此外读写控制线另外一种设计方法: - 将读写控制线合二为一:低电平写,高电平度
1 2 3 n位地址-->地址占nbit-->需要n条地址线 n位地址意味着2^n种地址,总容量=2^n x 存储字长 1K=2^10 ,1M=2^20 ,1G=2^30
寻址
DRAM 和 SRAM存储芯片 1 2 DRAM(Dynamic Random Access Memory):动态RAM ,使用栅极电极 存储信息 SRAM(Static Random Access Memort):静态RAM ,使用双稳态触发器存储信息
1 2 3 - 栅极电容:1个MOS管接通后,通过一个电容放不放电,判断1/0 - 双稳态触发器:含有6个MOS管,通过A、B 两点的高低电平判断1/0; A电平由左线读取,B电平由右线读取。
1 2 3 4 5 - 栅极电容 读取是破坏性读取(读取完后放电),读出后应要有重写操作——>"再生",读写速度慢 - 双稳态触发器 读取是非破坏,无需重写,读写速度更快
类型特点 SRAM DRAM 存储信息 触发器 电容 破坏性读出 非 是 读出后是否需要重写 不用 需要 运行速度 快 慢 集成度 低 高 发热量 大 小 存储成本 高 低 易失/非易失存储器? 易失(断电后消失) 易失(断电后消失) 需要刷新? 不需要 需要 送行列地址 同时送 分两次送 常用作 Cache 主存
DRAM的刷新 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 由于DRAM是电容存储电信号,但是电容中的电荷会随着时间的流逝很快消失 ==>所以需要给电容中的电荷进行刷新。 - 多久刷新一次? - 刷新周期为2ms - 每次刷新多少个存储单元? - 以行为单位,每次刷新一行存储单元。 - 为什么一行有多个存储单元呢? - 为什么一行有多个存储单元? - 因为假如一行只有一个存储单元,那么假如MAR有20bit,意味着2^20种地址,那 就需要2^20条字选线,明显不太可能-->所以将多个存储单元放在一行-->行2^10 条字选线,列2^10条字选线,通过矩阵行列方式,大大减少了字选线的根数. - 如何刷新? - 有硬件支持,读出一行的信息后重新写入,占用1个读写(存取)周期 - 在什么时候刷新? - 因为2ms=2000us,而一个读写周期才0.5us,2ms内能完成4000个读写周期 加入DRAM内部排列成128字x128字,那么因为一次刷新1行,总共128行,2ms内 全部刷新也只需要128个读写周期,2ms内足够所有行都刷新好多次了。 - 刷新分为以下几种策略: - 分散刷新:每次读写完都刷新一行,读0.5us,刷新0.5us,-->使得存取周期 变为1us - 集中刷新: 2ms内集中安排一段时间专门用来刷新-->系统的存取周期还是 0.5us - 异步刷新: 2ms/128=15.6us,也就是每隔15.6us刷新一行
DRAM地址线复用技术 1 2 3 4 5 6 7 8 9 10 - 送行列地址同时送是什么意思? - 也就是行地址(蓝色),和列地址(红色),同时分别传输给行地址译码器和列地址译 码器 - 但是,如果地址bit位数很大,不如32位(16bit行地址+16bit列地址),所需地址线就需要32条,如何才能实现地址线复用? - 很简单,设置两个地址缓冲器,用于暂时存放行地址和列地址 - 然后只需要n/2条地址线,先将行地址送入行地址缓冲器,然后将列地址的送入列 地缓 - 最后,行列地址缓冲器,同时将行列地址分别送给行列地址译码器 - 所以DRAM送行列地址不是同时的,而是分为两次
ROM ROM的分类 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 RAM用作主存、Cache--易失性存储器 ROM只读存储器--非易失性存储器 ROM: - MROM - PROM - EPROM - 闪存(Flash Memory) U盘、SD卡 - 每个存储元只需要存储单个MOS管,位密度比RAM高 - 闪存需要先擦除再写入,所以写的速度比读要慢 - SSD(Solid State Drives) 固态硬盘 - 由控制单元+Flash芯片构成,与闪存区别在控制单元不一样 - 手机辅存也使用Flash芯片,但相比SSD使用的Flash芯片要集成度更高,功 耗低价格更高
BIOS芯片 1 2 3 4 5 - BIOS芯片也是ROM存储芯片 - 常说的主板就是主存,但是事实上主板上的BIOS芯片也是主存的一部分 - 逻辑上主存=RAM+BIOS,两者的存储区域是统一编址的 - 统一编址:主存RAM和BIOS统一编址是指,计算机的内存和BIOS芯片的地址空间是连续的,即内存和BIOS芯片的地址空间是统一编址的。这样做的好处是,可以让BIOS直接访问内存,从而加快计算机的启动速度 -
主存储器与CPU的连接 单块存储芯片与CPU的连接 1 2 3 4 5 单块存储芯片与CPU连接 数据总线=存储字长 但是如果数据总线>存储字长?要如何扩展?-->位扩展 地址总线根数n-->有2^n个数据地址 但是如果要扩存字数怎么办? -->字扩展
1 2 3 4 MAR MDR实际上是集成在CPU 里 MDR实际上是通过数据总线将数据往返于CPU与主存 MAR实际上是通过地址总线将地址从CPU-->主存
位扩展–增加存储字长 1 2 3 4 5 6 7 8 9 10 11 8k存储单元=8^10=2^13 每块芯片都有2^13个地址可以用来存储字,对应接入的地址总线也就有13根 假如单块存储芯片的存储字长只有1bit-->但是数据总线有8根(8bit宽)-->接入一块新的芯片 1.地址总线与前一块存储芯片一一对应(相当于地址线串联) 2.对两块存储芯片的片选芯片CS都输入相同的电平信号,表示同时启用或弃用 3.前一块的存储芯片的数据总线接入D0,后一块接入D1 4.对两块存储芯片WE读写控制芯片d都输入相同的电平信号-->同时读或写 -->这样就实现了两块1bit存储字长的存储芯片当做一块2bit存储字长的存储芯片使用 -->实现了1bit存储字长扩展为2bit -->重复接入8块芯片扩展为8bit与CPU数据总线宽度匹配
字扩展–增加存储字数 线选法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 上述位扩展只是扩展了字的位数由1bit-->8bit,但是数据容量(字的数量)还是8k,那么要如何扩展存储的字的个数呢?-->字扩展 1.如下图,单块存储芯片的字长已经满足了数据总线的宽度,利用率达到了最大 2.但是存储的字的数量只有8k=2^13个字;要想扩展字的总数量,可以再加一块8k的存储 芯片 3.前13条地址总线串联这接入两块芯片的对应地址线接口 4.A13~A15条空余的地址总线,其中A13、A14分别接入两块存储芯片的CS片选芯片 5.一次只让1块芯片工作,这样就相当于实现了存储容量的扩展 扩展之后为了只让1块芯片运行,不让数据信号产生冲突 1.A13接入第一块存储芯片的CS,信号为1时,工作 2.A14接入第二块存储芯片的CS,信号为1时,工作 3.当A13为1,A14就为0,为了避免两块芯片同时工作导致数据冲突 -->那么对于第一块芯片来说地址信号就 是01x xxxx xxxx xxxx -->对于第二块芯片来说地址信号就是 10x xxxx xxxx xxxx ==>这种方法导致地址信号 00x xxxx xxxx xxxx和11x xxxx xxxx xxxx用不了
片选法 1 2 3 4 5 6 7 8 有没有办法解决某些地址信号处于禁用状态的办法呢? 1.上述方式是将CPU多余的地址线接入CS-->没块存储芯片接入1根 2.换用另一种方式-->将一根地址线分为两条接入两个存储芯片的CS 3.对其中一个分路上设置一个非门,这样同样的信号分别到两块芯片就会变为不同的状态 实现一个开一个关 4.这样的第一块芯片的有效地址就变为1x xxxx xxxx xxxx到0x xxxx xxxx xxxx地址充 分得到利用 5.并且一根地址线可以接入两块存储芯片
1 2 3 4 5 6 7 这样的方法叫做译码器片选法: 上述译码器为1-2译码器(接入1条地址线-->产生2个片选信号) 假如有n条片选线,经过1-2译码器后就能产生2^n个片选信号 3-8译码器(接入3条地址线-->产生2^3=8个片选信号) 例如下方: 3条片选线信号为0 0 0 ;经过译码器1 0 0 0 0 0 0 0 3条片选线信号为0 0 1; 经过译码器0 1 0 0 0 0 0 0
1 2 3 4 5 6 换用2-4译码器 片选线信号 00 -->接入第一块芯片 01 -->接入第二块 10 -->接入第三块 11 -->接入第四块
字位同时扩展
补充:译码器 1 2 左边高电平有效 右边低电平有效-->片选信号端有个小圆圈,说明是取反,也就是低电平有效
1 2 3 4 5 6 7 8 除此之外,CPU还有一个比较重要的输出端MREQ(主存储器请求的信号) 1.当CPU想要访问主存的时候,就会发出MREQ信号(接线端有个圆圈,说明是低电平信号) 2.当CPU 没有发出请求信号时,G2B端(使能端)输出的就是1-->取反0-->取反1,也就是 说片选信号都为1,所有的芯片都不工作(低电平有效的) CPU 实际工作过程: 1.先是CPU通过地址线送出地址信号(包括低位地址信号+高位片选信号) 2.送出地址信息后,电信号还不稳定因此还要等待一段时间带他稳定 3.稳定之后再发出主存请求信号MREQ,低电平0,让某一个选通线变为有效
双端口RAM和多模块存储器 存取周期 1 2 3 4 5 6 7 8 9 10 存取周期是指: 存取时间+恢复时间 存取完不能立马存取下一个,需要等待恢复 所以存取周期是可以连续读/写的最短时间间隔 DRAM存取周期较长: 存取时间r,恢复时间3r 周期T=4r 既然有恢复时间,那多核CPU要访问存,怎么办?-->双端口RAM 主存的恢复时间跟不上CPU的访问速度怎么办? -->多模块存储器解决
双端口RAM 1 2 3 4 5 6 7 采用双端口RAM 实现多CPU同时访问内存条-->需要更复杂线路 两个端口同时对同一主存操作有一下4种情况: 1.两个端口同时对不同的地址单元存取数据-->ok 2.两个端口同时对同一地址单元读出数据 -->ok 3.两个端口同时对同一地址单元写入数据 -->no 4.两个端口同时对同一地址单元,一个写入数据,另一个读出数据-->no
多体并行存储器 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 多模块存储器解决存取周期恢复时间跟不上CPU访问速度问题 多提存储器理解为多根内存条,编码方式分为: - 高位交叉编址: - 低位交叉编址(实现连续访问): 当连续访问连续地址的时候-->采用低位交叉编址-->实现每个地址都分布于不同 的模块-->直接避免了访问完一个内存条之后处于的恢复时间 -->采用低位交叉编址的多体存储器连续存储n个存储字-->耗时T+(n-1)r (另外提一下,T=r(存取时间)+3r(恢复时间)) 用下图理解 - 连续访问的现实意义: 例如程序中的数组等都是需要用连续的内存空间存储,采用低位地址交叉编址, 极大提高访问速度
多体并行存储器应该取几个体? 1 2 3 4 设多路并行的存储体数量为m - m<T/r ,-->导致存取数据时,会需要等待时间r - m>T/r ,-->导致数据时,有闲置的时间r没被利用 - m=T/r ,-->最优,不会有等待时间,也不会有时间闲置
实际生活中应用 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 平时所说的双通道是什么? - 就是内存条实现了 低位交叉编址的多体存储器 这是两条计算机内存条的卡槽 - 分为黄色和绿色两种卡槽 那要如何插入内存条实现低位交叉编址呢? - 实现低位交叉编址:假如有两条内存条-->插入颜色一样的卡槽内(双通道,提升速度) - 实现高位交叉编址:假如有两条内存条-->分别插入颜色不一样的卡槽内(单纯的扩容) 假如有一条16G内存与两条8G内存,该如何选? 选择两条8G内存分别插入颜色相同的卡槽-->形成双通道-->访存速度比单条16G的更快 为什么买内存条要买相同主频和相同容量的两根组成双通道? - 相同主频是因为,假如一块高一块低。其中高的一块会主动降频,使得主频一致,这样 性能浪费 - 相同容量是因为,两条相同容量的内存组成双通道性能提升,如果是不同容量的内存, 系统会按照容量小的那一条进行组建。 比如4G内存和8G内存,8G会分出4G和单条4G内 存组成双通道,8G中剩余的4G则仍然是单通道。假如打游戏的时候有数据存储在了剩余的 4G单通道内存中,访存速度就变慢-->导致游戏一卡一卡
外存储器(辅存) 磁盘 磁盘最底层工作原理 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 计算机的外存也称为辅存存储器,目前主要使用磁表面存储器。 磁表面存储 ,如下图,把磁性草料薄薄地涂抹在金属或塑料表面上作为载磁体存储信息。 例如磁带的工作原理: 1.磁带上方有一个磁头,磁头是由一根铁芯和两组线圈构成 2.当写入数据时,根据数据01信号区分接通电流的方向写线圈通电流,根据电磁铁原理, 使得电磁铁不断改变N S 方向-->从而下面划过的磁带因磁场作用带上不同N S 极,这样 就写上了数据 3.当读数据时,磁带划过铁芯,由于磁带上带有N S极,使得铁芯切割次感应线产生电流 根据划过的N S磁感应线方向的不同,产生的感应电流方向不同,在根据从读线圈传出的 电流信号对应01信号,从而读出0\1两种不通的二进制状态 注意: 1.磁表面存储器每次只能1bit的读写数据 2.读写不能同时进行 优点: 1.存储容量大,位价格第 2.记录介质可以被重复使用 3.记录信息可以长期保存不丢失 4.非破坏性读出,读出时不需要再生(刷新) 缺点: 1.存取速度慢 2.机械结构复杂 3.对工作环境要求高(容易受到外部磁场的影响)
磁盘设备的组成 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 磁盘设备的组成: - 存储区域: 一块磁盘含有多层的记录面(磁盘是分层的),每个记录面划分为若干磁道(一圈一圈) ,而每条磁道又分为若干扇区,扇区(也称块)是磁盘读写的最小单位。 - 一些名词: 1.磁头数: 就是记录面数,表示硬盘有多少个磁头,磁头用于读写盘上信息,1个记 录面对应1个磁头 2.柱面数: 因为磁盘有多层,每层的记录面磁道互相之间形成一圈圈的柱面,柱面数反应了 磁道数 3.扇区数: 将以个盘划分为多块扇形区域,这样就将每条磁道也化为了多段 - 硬盘存储器: 由磁盘驱动器+磁盘控制器+盘片组成
磁盘性能指标 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 1.磁盘容量 一个磁盘所能存储的字节总数,分为: - 非格式化容量: 磁记录表面可以利用的磁单位总数 - 格式化容量: 留下来某些扇区作为备用扇区,以防止某些扇区损坏,平时不作为磁记录 2.记录密度 - 道密度 半径1cm所含磁道的数量 - 位密度 在一条磁道上单位长度上能记录的二进制代码位数 (注意每条磁道的记录位数一样的,所以,越靠近圆心的磁道为密度越大) - 面密度 单位面积记录的二进制代码位数 3.平均存取时间 =寻道时间+旋转时间+传输时间 一般做题时,寻道时间会给,旋转时间选转半圈时间(根据转速自己算),传输时间根据转 速算出
磁盘地址 1 2 确定某一个扇区号,需要给该扇区编一个唯一的地址 驱动器号+柱面号+盘面号+扇区号-->依次锁定位置
磁盘阵列 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 由于单个磁盘只能串行的访问信息,速度很慢-->为了解决这个问题,提出磁盘阵列RAID(磁盘冗余阵列) ,将多个独立的物理磁盘组成一个独立的逻辑磁盘,数据可以在多个物理盘上分割交叉存储,并行的访问 RAID - RAID0: 无冗余无校验的磁盘阵列 - 直接将数据分割存储在多块盘上的不不同扇区,做到并行访问。 - 无校验: 是指当一块磁盘扇区损坏,由于没有备份数据就永远丢失; 同时如果扇区没有完全损坏,数据发生跳变,由于没有信息对比,无法校验 - RAID1: 镜像磁盘阵列(有冗余) - 粗暴的存两份数据在两块盘上,既能并行访问,又能备份。同时其中当某一块 发生跳变,磁盘数据也能与另一块进行对比校验 - 有冗余:浪费一半空间镜像数据 - RAID3: 采用纠错的海明码的磁盘阵列 - 相比与镜像磁盘阵列,这种方法存储4bit信息,只需再存储3bit海明校验码就 能做到4bit数据的校验-->4:3 相比与镜像的1:1更节省空间 像百度云网盘,为了保证磁盘用户数据的准却不丢失,常采用磁盘冗余阵列的方式提升存储的安全可靠性以及传输率
固态硬盘
Cache(缓存) Cache的基本原理概念 Cache概念 1 2 3 4 5 6 7 8 9 10 由于CPU访问速度过快,主存跟不上,所以引入更高速的存储单元-->Cache Cache工作原理: 当微信程序运行时-->将微信相关的程序代码及相关数据送到主存当中-->但是CPU速度太 快主存存取数据速度跟不上-->引入Cache-->例如使用视频聊天功能-->将视频聊天的代码 复制到Cache中,这样速度矛盾就得到缓和 Cache体积: Cache是有SRAM实现,SRAM速度快,成本高,但是集成度低 -->Cache一般被集成在CPU中所以限制了其大小 -->又由于集成度低,导致容量小往往只有几M到十几M之间
局部性原理 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 局部性原理: - 空间局部性: 将来也要访问的数据在当前访问数据的周围附近 (例如数组元素,数据都是相邻的) - 时间局部性: 将来要访问的数据是当前时间访问的数据 (例如for循环,i可能重复使用) 二维数组实际是一行一行存储的: a[0][1] 与a[0][2]相邻存储,展开为列 但是 a[1][0] 与a[2][0]之间相隔了多个元素,地址不连续 下面两段代码: A-->是按照连续的存储空间依次遍历数组-->局部性较好-->容易被Cache命中-->快 B-->按照数组一列一列的遍历-->元素地址不连续-->间隔着访问跨度大-->局部性较差--> -->从Cache中找到元素的概率小
命中率 1 2 3 4 5 6 7 命中率H CPU想要访问的信息已经在Cache中的比率 Cache-主存系统的平均访问时间: 1.CPU同时访问Cache和主存 平均访问时间 Htc+(1-H)tm 2.CPU先访问Cache再访问主存 平均访问时间 Htc+(1-H)(tc+tm)
Cache-主存分块访问 1 2 3 4 5 6 7 8 9 基于局部性原理,Cache会把目前访问数据“周围”部分数据放到Cache,但是如何界定“周围”是多大呢? 将主存分块,例如没1kB为一块,主存与Cache之间就一"块"为单位数据交换 例如主存4MB=2^22B,每1KB分为1块-->2^22/2^10=2^12=4096块 这样就先对块号编址前共2^12块,那么前12bit对应块号;每块1KB=2^10,那么后 10bit对应块内位置 主存中块又被称作: 页/页面/页框 Cache中块又被称作: 行
cache和主存的映射方式 思考一个问题?如何确定将主存中的数据搬到Cache中后,数据在Cache中的存放位置?这就需要一个具体的映射方式来确定,一个主存地址中的数据在Cache中的存储位置
地址映射 :地址映射是一种规则,它指明了把主存地址空间映射到Cache地址空间所用的规则,即把存放在主存中的程序按照某种规则装入Cache。,由Cache的块数比主存块数少得多,因此需要加入主存字块标记和字块内地址
地址变换 :地址变换是一个过程,它是指CPU在访存时,将主存地址按映射规则换算成Cache地址的过程。
1 2 3 4 5 6 7 8 9 映射方式主要有以下三种 1.全相联映射: - 主存块可以放在Cache的任何位置 - 那如这样的话要怎么区分Cache块号数据对应主存数据的块号呢? 1.加一个标记,初始都为0,用于标记Cache块内的数据对应主存的块号 2.另外还要加一个有效位,用于表示对应的标记是否有效(因为标记初始 都为0)如果不加有效位,那么主存0号为的数据无法确定是哪一个。 2.直接映射 3.组相联系映射
全相联映射(随意放) 1 2 3 4 5 6 7 8 9 10 11 假设某个计算机的主存地址空间大小256MB,按字节编址,其数据Cache有8个Cache行,行长64B 1..因为Cache行也就是Cache块,一个Cache块有64B-->主存一个块也是64B 2..所以主存块有256MB/64B=2^22个,也就是块号从0~2^22-1 -->需要22个bit位 表示块号 3..主存块每块内存储64B,(由于1B编一个地址)每块内地址64个-->2^6-->需要 6bit位表示-->地址前22bit表示块号,后6bit表示块内地址 那CPU访问主存地址是如何进行呢? 访问1....1101 001110 1.将主存地址的前22位对比Cache中所有块的标记 2.若标记匹配且有效位为1,则Cache命中,访问块内地址为001110的单元 3.若未命中或有效位=0,则正常访问主存
主存地址结构
主存字块标记:指明当前Cache是主存中哪一快的副本。 字块内地址:由于Cachei块和主存块都是由若干字节组成的,当需要访问某一个字时,需要找到该字在指定的Cache块中的地址。
组相联映射 1 将Cache多个相同数量的块归为一组,虚拟地址就可以再多划分一个组号的字段,用于表示组号。于是对一个虚拟地址%组号 =所再组号,然后只需要再在该组中取比对主存块标记字段,就可以寻找到目标块
主存地址结构
主存字块标记:指明当前Cache是主存中那一块的副本。 组地址:指明存放在Cache中的哪个Cache块的组。 字块内地址:由于Cche块和主存块都是由若干字节组成的,当需要访问某一个字时,需要找到该字在指定的Cache块中的地址。 直接映射(只能放在固定位置) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 假设某个计算机的主存地址空间大小256MB,按字节编址,其数据Cache有8个Cache行,行长64B 1.通过上面的分析已经知道主存有2^22个块,块内有2^6字 2.直接映射: 主存块在Cache中的位置=主存块号%Cache总块数 3.这样做取余运算,主存的块放到Cache中就只有唯一的一个固定存放位置 4.同样我们需要对Cache块中的数据标记它在主存中对应的块号 能不能对标记进行一些优化呢? - 因为主存块号对8取余运算,所以块号的后3bit位就对应表示Cache中的块号 那么就不需要对主存块号的全部22bit进行标记,只需标记前19bit 那CPU访问主存地址是如何进行呢? 访问1....1101 001110 1.首先根据主存块号的后3位确定Cache行(块) 2.再比对主存块号的前19位是否与Cache中的标记匹配 3.若标记匹配且有效位=1,则命中,访问块内地址 4.若没命中直接访问主存
主存地址结构
主存字块标记:指明当前Cache是主存中哪一块的副本。 Cache:字块地址:指明存放在Cache中的哪个Cache块。 字块内地址:由于Cache块和主存块都是由若干字节组成的,当需要访问某一个字时,需要找到该字在指定的Cache块中的地址。
Cache替换算法 1 2 3 4 5 6 7 8 9 10 11 什么时候需要使用Cache替换? 全相联映射、组相连映射 为什么直接映射不需要考虑替换算法? 因为直接映射,主存块在Cache中的块的位置是通过取余得到的-->位置是固定的--> 所以无需考虑放在其他空位上的情况,只需要替换固定的位置上的,所以只要对应块号上 已经有数据直接替换就可以了 Cache替换算法: 1.随机替换算法RAND 2.先进先出算法FIFO 3.近期最少使用LRU 4.最近不经常使用LFU
1 2 3 4 5 随机替换算法RAND: - 只有Cache装满之后才进行替换算法 - 满了之后随机选择一个块进行替换,毫无规律 - 完全没考虑局部性原理,命中率很低,实际效果很不稳定
1 2 3 4 5 先进先出算法FIFO: - 类似队列,先放入的最先被替换(时间先后) 算法性能怎么样? - 没有考虑局部性原理,因为最先被调入的块,不意味着就用不到,也有可能频繁用到 - 有可能出现抖动现象,就是刚被换出的块,再此被访问放入,频繁的换入换出
1 2 3 4 5 6 7 8 9 10 11 12 最近最少使用算法LRU: - 当Cache满时,从当前访问的块开始,往前找n个块,看最近访问最少的将其替换 - 具体实现:设置一个计数器(对应每个块)记录多久没被访问 1.命中时,所命中的块的计数器清零,比其低的计数器加1,其余不变 2.未命中且还有空闲块时,新装入得块的计数器置为0,其余非空闲块全加1 3.未命中且无空闲行时,计数器的最大块的信息块被替换,新装入的块计数器置为0 其余全加1 算法性能怎么样? - 该算法遵循了局部性原理,近期被访问的主存块,在不就的将来也会被访问到 淘汰最久没被访问到的块是最合理的,Cache效率高 - 但是如果频繁访问到的主存块数量比Cache数量多,也会发生抖动现象,例如访问块号 {1,2,3,4,5...1,2,3,4,5}
1 2 3 4 5 6 7 8 9 最近不经常使用算法LFU: - 为每一个Cache块增加一个计数器,用于记录每个Cache块被访问过几次,当Cache块满 了之后替换计数器最小的 算法性能怎么样? - 该替换算法没有遵循局部性原理,因为经常被访问的主存块未来不一定会用到 例如:微信视频聊天,因为视频聊天会需要很频繁的访问与聊天有关的块,访问次数会 瞬间达到很大,之后不使用视频聊天功能,由于访问次数已经很大,当中的块就很难被 替换了 - 实际运行效率不如LRU
Cache写策略 1 2 3 4 5 假如CPU修改了Cache块中的数据副本,要如何确保主存中的数据也保持一致的修改? -->Cache写策略要探讨的问题 写策略根据Cache是否命中来讨论: - 写命中 - 写不命中
写命中 写回法 1 2 3 1.写回法: - 当CPU对Cache写命中时,,只修改Cache中的内容,而不立即写入主存,只 有当此块被换出时,才写回主存
有效位:1bit 用于判断该数据是否有效 脏位:1bit 用于标记Cache中数据是否被修改过
全写法 1 2 3 4 5 6 7 8 9 10 2.全写法: 当CPU对Cache写命中时,必须同时把数据写入Cache和主存(所以不需要脏位) -->这样写不会很慢吗?(因为主存是DRAM,地址分两次送) - 为了解决CPU写变慢的问题,推出了写缓冲(writer buffer) -->什么是写缓冲? - 写缓冲是SRAM芯片(与Cache相同),所以将数据写入Cache的时候,同时 写入写缓冲,当CPU干其他事时候,写缓冲就就将数据同步到主存里面 -->效果怎么样? - 当写入操作不频繁的时候-->效果很好 - 当写入操作很频繁的时候-->由于写缓冲容量有限,会导致缓缓从饱和CPU进入阻塞状态
写不命中 写分配法 1 2 3 4 3.写分配法: 当CPU写不命中的时候,会先把主存中的块调入Cache中,在Cache块中修改 修改完之后,只有当Cache块被替换之后才会将数据同步到主存中 -->写分配法常常搭配写回法使用(配合着完成写命中和写不命中的情况)
非写分配法 1 2 3 4.非写分配法: 当CPU对Cache写不命中的时候只写入主存,不调入Cache -->常常搭配全写法使用
多级Cache 1 2 3 4 现代计算机常采用多级Cache: 离CPU越近速度需要越快 -->所以Cache-Cache之间通常采用全写法+非写分配法 ,实现数据同步 Cache-主存之间通常采用写回法+写分配法,实现数据同步
页式存储器 逻辑地址(虚拟地址) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 地址: - 逻辑地址(虚地址): 什么是虚拟地址? 因为主存的容量有限,所以只能将需要运行的程序代码和数据放入主存块 中,因此为了匹配主存块的大小,操作系统将程序也划分为"页/块"(与主 存块大小相等)因此就出现了虚拟地址 虚拟地址有哪些部分? 虚拟地址包括 逻辑页号+页内地址 -->都是外存中的地址 - 物理地址(实地址) - 物理地址就是程序放入内存中实际的地址; - 其中块内地址与虚拟地址的页内地址对应 - 主存块号却不是与虚拟地址的逻辑页号对应,所以出现了一个映射表,存储 块号与页号的映射关系
页表 1 2 3 4 5 6 7 8 9 10 页表: - 为了将虚拟地址与主存中实际存放的地址互相映射,于是出现了页表 - 页表是存储在主存当中,所以CPU想要进行一次地址转换的时候就要先进行一次访 存 - 页表是一行一行的,每一行称为一个"页表项" CPU取变量x到ACC寄存器的机器指令:操作码+地址码(虚拟地址) - 000001(操作码) 00(逻辑页号)1000000011(块内地址) - 查页表 00<->10 转换地址 000001(操作码) 10(物理块号)1000000011(块内地址)
地址转换过程 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 CPU要将虚拟地址转换为物理地址 1.先进行一次访问,因为页表存储在主存当中,那如何知道应该访问哪一个地址呢? >首先访问页表基地址寄存器(存储了页表的起始地址) >然后根据逻辑地址页号从基地址往后找到目标"页表项"(因为页号地址是按页号顺 序编址) >接着将查得到 主存块号与块内地址拼接成 -> 物理地址 >然后CPU按照物理地址 先访问Cache后访问主存的原则寻找数据 2.如果是需要频繁访问的数据,每次访问都要先进行一次访存查页表,那会很慢,怎么办? >新增一个页表项的高速寄存器(快表TLB),用于存放有需要频繁访问的数据的页表项 3.地址转换过程增加-快表TLB >快表是SRAM所以访问速度比主存块很多,查询速度很快 >快表示一种"相联存储器"根据内容寻址 >CPU进行数据访问(地址转换)要先获得物理地址,会先访问快表,如果没有才访问内存 >快表容量有限很容易被存满,存满之后也需要进行替换 >快表TLB ,相当于主存与外存之间的"Cache"用于存放外存中页表的副本
全篇总结 指令上的地址都是逻辑地址,经过查找页表/快表得到主存块号,拼接成物理地址,送入MAR,然后根据物理地址从Cache中寻找数据(根据Cache与主存的不同映射关系,结合物理地址寻找到对应的Cache块),如果没找到就进入主存寻找。这就是完整的寻址过程
Cache块中存在着,主存地址与地址块数据之间的映射。页表或快表中存在着,虚拟地址与物理地址之间的映射。 理论上,Cache与快表都是为了方便映射而出现,是同一类东西。 都具备,全相连/直接/组相连映射。且都具备类似的页面替换算法。
习题 存储器的基本概述习题 1 2 3 磁盘是直接存取存储器DAM DAM不像随机存储器能直接找到数据,需要先确定柱面,然后确定盘面,最后确定扇区 DAM也不想顺序存储必须从头到尾依次访问
1 2 3 4 5 6 7 8 9 10 11 相联存储器是内容指定方式和地址指定方式相结合进行寻址的存储器 分为以下四种寄存器: 1.检索寄存器CR: 存储要检索的存储字 2.屏蔽字寄存器MR: 只有MR置为1时,才对对应该列的数据进行检索判断是否符合CR里的要求 3.符合寄存器RR: 将检索到符合要求的那一行数据信息置为1,不符合置为0 4.字选择寄存器WSR: 提前限定检索的目标(范围),将需要检索的置为1,即使RR中是符合要求的也不进行 检索
主存储器习题 1 2 读写控制线可以是1根或2根 注意当是DRAM时存在地址线复用的情况,到时候需要注意
1 2 不存在死区的只有分散刷新,实际上是将刷新时间整合进存取周期里面 对于其他刷新方式都存在独立的死区
1 2 RAM 就是易失性存储器 ROM 就是非易失性存储器
1 2 3 4 DRAM采用地址线复用技术,地址线只需要原来的一半,通过行列地址确定确定要取的那个存储字 --> 地址线5根+行列选通线2根+读写控制线2根+数据线8根 =17根 --> 为什么不需要片选线? 因为行列选通线起到了片选线的作用
1 2 3 4 1.采用高速DRAM 2.采用双端口RAM 3.采用多体并行存储结构 4.刷新存储器到显示控制器的内保部总线宽度加倍
1 2 3 4 5 6 7 8 9 - 单体4字宽度是什么意思? 是指把存储器的字长扩大为原来的4倍,实现的是一个单体4字结构的存储器,每次可同时 读出4个字的内容这样做的好处是有利于提高存储器每个字的平均读写速度,但其灵活性 不如多体单字结构的存储器,还会多用到集合缓冲寄存器 - 单体多字存储器就是位扩展吗? 不完全是。位扩展是指用多个存储器器件对字长进行扩充,比如用2个16K×4位芯片组成 16K×8位的存储器而把存储器改为单体4字宽度是指用一个存储器器件对字长进行扩充,比 如用一个16K×4位芯片组成4K×16位的存储器两者的区别在于是否需要多个存储器器件和片 选信号。
1 体冲突就是指访问完一个存储器,存储周期还没结束就再次访问造成访问不了
主存储器与CPU的连接习题
1 2 3 以4个字节为编址单位就是,一个地址存储4个字节 要构造32KB的存储体,首先判断需要多少容量 32KB/4B=8K,不需要字扩展 又因为一个地址存储4B=32bit,到哪存储芯片只有8bit,需要位扩展
1 2 可以是4块256x16bit芯片全部字扩展为为1024 也可以是4块512x8bit,其中两两箱位扩展为两块521x16bit ,再字扩展为1024x16bit
1 2 MAR地址寄存器:用来存放当前CPU访问的内存单元地址,或存储CPU要写入内存的单元地址 MDR数据寄存器:用来存放CPU从内存中读出的信息或写入内存的信息
1 2 芯片是64x64是指64行x64列,给出芯片规格,才能直到刷新总共需要多少次,一次刷新一行 总共需要刷新64次,2ms内异步刷新,只要保证2ms内恰好刷新完就可以那么刷新周期就是2ms/64
外部存储器习题
1 2 B.固态硬盘随机读写性高于磁盘,所以固态硬盘常常作系统盘,磁盘用作仓库盘 C.随机写比较慢,因为固态硬盘需要将已有的数据进行擦除,之后才能写
1 2 3 4 寻道时间8ms 延迟时间-->转到该磁道对应扇区,取转半圈时间-->4.17ms 传输时间-->有时题目会给读取数据量KB,然后会给传输速度MB/s;有时直接通过转速和扇区占 比来计算读取时间
高速缓冲存储器(Cache)习题
*128KB/16B = 8K(块)=2^13(块),组相连映射,每组8块,所以2^13/8=2^10(组),–>10bit表示Cache内组号
主存地址1234567H –>说明主存地址共4x7=28位,28-10-4=14(主存字块标记位数)*
逻辑地址与物理地址区别就是页号不同
Cache容量计算:数据部分+控制部分
没有告诉主存地址位数,只知道地址号数 通过逻辑右移·取余数得到低位部分数 就可得如组号是多少了
Cache一次缺失,就需要将一个主存块替换进Cache里面
1.做这题第一眼,忽略了写命中也要算进去 2.这里k=1000刚好是4的倍数,,因为一个块16B,可以存4个数组元素,所以替换到Cache中的数组都可以访问到不会遗漏,所以可以根据每8次缺失1次算 3.当k=10,时,只能访问到a[9],剩余替换到Cache块中的a[10],a[11]不会访问到,所以要按实际情况计算
*时间局部性:一条指令一旦被执行,在不久的将来可能会再次执行 典型代表:循环指令
空间局部性:一旦一个存储单元被访问,那么它附近的存储单元也很快被访问典型代表:数组,顺序指令*
比较器的作用:用于判断需要取的数据是否在Cache中已存在 1.由于一次存取只能存取一个数据,故一次存取先根据主存地址中的Cache组号,确定数据所在Cache组(一组8个Cache块) 2.在根据主存地址标志位tag(用于确定对应的主存块号),通过比较器将目的tag位,与该组中所有Cache块中存储的数据的tag位进行比对,如果匹配成功,说明Cache命中 3.所以比较器是用在确定组号之后,比较组内所有块的tag位,所以组内有8块,就需要8个比较器,tag位有20位,比较器位数就需要20位
(1) (2) (3)
(1) (2) (3)
(1) (2) (3) (4) 本题要点
(1)(2) (3) (4) *修改页面,是指改完主存中的内容后,再将主存中修改的内容写到辅存(外存)
Cache直写,是一并将修改写入Cache和主存,就是全写法,通过写缓冲实现*
LRU标记位需要3bit,用于标记各个块被访问的先后顺序,由于每个分组内只有8个块,先后顺序无非1~8,所以3bit位标记先后顺序即可 (1) (2) (3)
虚拟存储器 大纲已删
指令系统 指令格式 1 2 3 4 一条指令包括: OP操作码 A地址码 一条指令根据包含地址码数目不同分为零地址指令、一地址指令、二地址指令...
指令-按包含地址数分类 零级地址指令 1 2 3 零地址指令: 1.不需要操作数,比如空操作、停机、关中断等 2.堆栈计算机,两个隐含在栈顶和次栈顶,当扫描到操作符时,自动弹出两个操作数
一地址指令 1 2 3 4 5 6 一地址指令: 1.只需要1个操作数,如自加1,自减1,取反、求补码等 指令含义:OP(A1)->A1 ,完成该条指令需3次访存,取指令->读A1->将A1写回主存 2.需要两个操作数,但是其中一个操作数隐含在某个寄存器中(不需要访存) 指令含义:(ACC)OP(A1)->ACC,完成该条指令需要2次访存,取指令->读A1 (写回ACC,ACC不属于主存,不需要访存)
二地址、三地址指令 1 2 3 4 5 6 7 8 9 二地址指令: 涉及两个操作数 (A1)OP(A2)->A1 完成该一条指令需要访存4次,取指->读A1->读A2->写A1 三地址指令: 涉及三个操作数 (A1)OP(A2)->A3 完成该条指令需要访存4次,取指令->读A1->读A2->写A3 都是需要两个操作数,访存都是四次,区别是结果是写回原操作数地址还是另外的地址
四地址指令 1 2 3 4 5 6 7 四地址指令: 涉及四个操作数 (A1)OP(A2)->(A3) 完成该条指令需要4次访存 取指令->读A1->读A2->写A3 与三地址指令差不多,为什么说是四地址指令呢? 因为正常情况取指令结束后PC+1,指向下一条指令 四地址指令后,是将PC的值修改为下一条指令A4的地址(这样实现PC摆脱单调的顺序执行)
指令-按指令长度分类 1 2 3 4 5 6 指令字长: 就是一条指令的总长度 机器字长: 对CPU而言,一次整数运算所能处理的二进制数的位数,和ALU直接相关 存储字长: 一个存储单元中的二进制代码位数(通常与MDR位数相同)
1 2 3 按操作码长度分类: 定长操作码 可变长操作码
指令-按操作类型分类 1 2 3 4 5 6 7 8 9 10 11 12 13 14 按操作类型分类: 1.数据传送类: - 数据传送:进行主存与Cache之间的数据传递 2.运算类: - 算数逻辑操作 - 移位操作 ... ... 3.程序控制类: - 转移操作: 本质就是改变PC指向的指令,像是if else条件判断,来跳转执行代码 4.输入输出类(I/O): - 输入输出操作: 进行CPU和I/O设备之间的数据传递
扩展操作码的指令格式 1 2 3 4 5 6 7 8 9 10 11 12 13 当指令是定长时,由于位数限制 正常情况下:0001(操作码) 1000 0000(地址码) -->由于操作码只有4位,最多有2^4=16种操作码 有没有办法扩展操作码数量? 在指令定长的情况下,采用操作码变长 -->4位地址码时:是三地址指令,0000~1110 共15条操作指令 -->8位地址码时,是二地址指令,1111 0000~1111 1110 共15条指令 -->12位地址码时,是一地址指令,....15条指令 -->16位操作码时,是零地址指令,....16条指令 注意, 操作码低字节全1 ,1111表示扩展一字节操作码 意味着操作码扩展后只有最低字节是变化的,高字节都是全1 但当零地址操作码,由于无法再扩展,所以低字节1111也能表示一种操作码
指令寻址 顺序寻址 定长指令字寻址 1 2 3 程序计数器PC -->始终指向下一条要指向的指令 当系统采用定长指令结构&&指令字长=存储字长=16bit=2B&&主存按字编址 =>那么指令地址刚好是相差1
变长指令字寻址 1 2 指令的字长不确定,需要先读入一个字,根据操作码判断这条指令的字节数n 然后修改PC的值 (PC)+n
跳跃寻址 1 JMP 7 -->跳跃到7的指令 -->跳跃寻址-->直接改变PC的值
数据寻址 指令分为操作码和地址码,根据地址码寻找指令或者操作数有很多种方式。根据地址码找指令的叫做指令寻址,被寻找的指令为吓一跳欲执行的指令。根据地址码找操作数的叫数据寻址。今天着重讲一下数据寻址的几种方式。寻址方式对于对于编译原理很重要
寻址特征 指令有10种寻数据寻址方式,那机器拿到一条指令后如何知道用什么寻址方式呢?
我们在地址前面加入4个01数代表不同的寻址方式,我们称为寻址特征。 对于多地址指令,需要在每个地址前加一个寻址特征,分别代表他是什么寻址方式
间接寻址
指令的地址不是操作数的真正地址,而是操作数有效地址所在的存储单元的地址,也就是操作数地址的地址。
访存次数 取指令访存一次 取操作数访存两次 一共三次。 我们上述都是找的地址的地址,称为一次间接寻址,还有多次间接寻址。
如两次寻址,原理类似,就是嵌套次数不同。 这样增加了访存次数。为什么要有间接寻址呢? 1.扩大寻址范围,如果地址A的位数小于有效地址EA的位数,所以EA可以扩大寻址范围,可以找到更多的数。 2.如果一个操作数的地址会发生变换,间接寻址不需要修改指令。 多级间接寻址相比一级间接寻址有利于程序的多级调用,这里不再讲述。
寄存器寻址 1 2 3 4 5 6 指令中直接给操作数所在寄存器编号-->无需访存,访问寄存器 只需访存1次:取指令 优点:指令执行阶段不访问主存,只访问寄存器,指令字短(寄存器集成在CPU中不可能很多) 执行速度快 缺点:寄存器昂贵,寄存器数量有限
寄存器间接寻址 类比于间接寻址,寄存器间接寻址指令的地址是一个寄存器的地址,此寄存器存放的是操作数所在主存单元的地址
取指令访存一次,取操作数访问一次,总共访存2次,比间接寻址速度更快
隐含寻址 没有给出具体地址,而是指令中隐含操作数的地址 如图,指令中只给出其中一个操作数的地址,另外一个操作数隐含在寄存器ACC中 这样有利于缩短指令字长。
立即寻址 立即寻址的地址不是操作数的地址,而是操作数本身,又称为立即数 操作特征是“#”,就代表使用的是立即寻址,后面跟的就是立即数 取指令访存一次,这总共访存一次。
偏移寻址 EA:effective address BR: base address register IX: index register PC: 偏移寻址都是在一个地址基础上,通偏移量的方式来寻址。 偏移寻址分为:基址寻址、变址寻址、相对寻址。 区别在于偏移的地址起点的不同。
基址寻址 以程序的起始存放地址作为“起点”。将CPU中基址寄存器(BR)的内容加上指令格式中的形式地址A ,而形成操作数的有效地址,即EA=(BR)+A。其中BR可为专用基址寄存器,也可用通用寄存器作为基址寄存器。
采用专用寄存器BR作为基地址寄存器
将CPU中的基址寄存器(BR)的内容加上指令格式中的形式地址A(偏移量), 形成操作数的有效地址,EA=(BR)+A
采用通用寄存器作为基地址寄存器。
在指令中需要用R0指明基地址存放在哪个寄存器种 具体R0需要占几个bit需要看通用寄存器总数判断
注意: 存放基地址的存储器无论似乎BR还是其他通用寄存器,程序员都无法对其进行修改,全部由操作系统控制。但是形式地址A是可变的
变址寻址 程序员自己决定从哪开始作为“起点”。将CPU中变址寄存器(IX)的内容加上指令格式中的形式地址A ,而形成操作数的有效地址,即EA=(IX)+A。其中IX可为专用变址寄存器,也可用通用寄存器作为变址寄存器。
与基址寄存器的区别在于,IX是面向用户的,用户可以对IX的地址进行操作修改 等效于IX作为偏移量,形式地址A不变作为基地址
用于循环操作
如果对一个循环程序进行基地址寻址,需要i个ACC加法指令,指令多效率低
对循环程序进行变址寻址,使用常数条指令即可完成
相对寻址 相对寻址以PC 程序计数器所指的地址作为”起点”,把程序计数器PC的内容加上指令格式中的形式地址A而形成有效地址即 EA=(PC)+A,其中A是相对于PC所指的地址的偏移量,可正可负补码表示。
1 2 3 4 5 6 7 8 9 10 例如for循环指令需要挪动原有的位置,那么他的指令在主存中的位置也会改变 循环指令的最后一条指令是跳转指令,跳转回起始指令继续循环。 由于之前改变了指令的整体位置,假如跳转指令跳转的地址是基址寻址,那么会跳转到错误的内存,于是需要相对寻址 相对于PC指向的指令位置+偏移量: 例如PC 先指向M+3,取出指令后,PC+1=M+4,同时之前取出的指令采用相对寻址使得 PC-4 = M+4-4=M,再次回到了整个函数指令的起始处 优点: 使得这段代码始终在程序内浮动不需要更改指令跳转的地址 相对寻址广泛运用于转移指令
1 2 3 4 5 6 7 8 9 10 硬件如何实现数的"比较"? - cmp指令 cmp a,b ,实际上a-b - 相减结果信息保存在PSW程序状态字寄存器中 - 根据PSW得某几个标志位进行条件判断,决定是否转移 PSW中标志位: - CF:进位/借位标志位,最高位有进位/借位时CF=1 - ZF:零标志位,运算结果为0,ZF=1,否则ZF=0 - SF:符号标志SF,运算结果为负SF=1,否则SF=0 - OF:溢出标志,结果溢出OF=1,否则OF=0
堆栈寻址 1 2 3 4 5 6 7 8 9 堆栈寻址: 硬堆栈: 堆栈寄存器:存放操作数 SP堆栈指针寄存器:存放栈顶元素的指针(地址) 速度快,不访存 软堆栈: 操作数存放在主存里 SP堆栈指针寄存器 速度比较慢,访存1次
程序的机器级代码表示 汇编语言的考试要求
X86汇编语言基础 1 2 3 4 5 什么是X86? 1978年Intel公司生产了一块CPU芯片代号8086, 之后就出现了80286、80386等一系列86结尾的型号的CPU,都兼容之前的CPU,能够将程序 移植到新的CPU执行。因此X86汇编语言指令,是指能够被这一系列CPU处理的汇编语言指 令
以mov指令为例 s->source->源操作数 d->destination->目标操作数mov d , s->将源操作数s复制到目的操作数d所指的位置
mov指令常用格式有一下几种 其中当指明的是内存地址的时候,通过dword ptr(双字)、word ptr(单字)、byte ptr(字节) 来指明需要读写的长度
X86CPU有哪些寄存器 X 结尾:通用寄存器
I 结尾 :变址寄存器
P结尾:堆栈寄存器
寄存器都以E开头,E->Extenden=32bit,
对于通用寄存器而言如果指向使用低位的16bit,那么可将E 去掉
变地址寄存器和堆栈寄存器都不能去掉E ,只能固定使用32bit
源、目的 操作数书写格式 [寄存器] 是指寄存器里所存的地址所指向的数据,相当于寄存器间接寻址 [地址/寄存器] 前没有指明读学长度时,默认32bit [af996-12 h]->最后h表示16进制,这样写是指地址af886往前偏移12位地址所指数据 [abx +8]->是指该寄存器内地址往后+8的主存地址所指向的数据 常见的算数运算指令 乘法 mul d,s -> 表示无符号数d * s,乘积存入d 乘法 imul d,s -> 表示有符号数d * s,乘积存入d 除法 div s ->无符号数除法,被除数会提前存放在edx:eax中 ->edx:eax表示两个寄存器拼接将被除数从原来的32bit扩展为64bit ; ->商存入eax,余数存入edx中 除法 idiv s ->有符号数除法,被除数会提前存放在edx:eax中 常见的逻辑运算指令
s、d操作数 1 2 1.对于X86系统,指令后面的两个操作数不允许两个都来自主存<mem> 2.并且,目的操作数d 不能是常数<con>
AT&T格式指令与Intel格式指令
基址+变址 * 比例因子+偏移量 用于结构体数组内信息的寻址 基地址->寻找数组起始地址 变址 * 比例因子->寻找目标元素在数组内的位置 偏移量->寻找目标信息在该元素内的具体位置 选择语句的机器级表示 jmp指令与cmp指令 1.程序中选择分支结构
程序计数器PC又被称为IP寄存器 2.无条件跳转指令–Jmp
执行该条指令PC会无条件跳转到某个主存地址,执行那个地址的指令
无条件跳转指令格式 -> jmp <地址>
jmp 128 ->跳转到地址128 jmp eax -> 地址来自于寄存器 jmp [999] ->地址来自于主存地址999中存的地址 3.jmp跳转标记位格式
因为写程序的时候,例如if-else分支语句的时候,通过条件判断决定跳转执行那一条程序语句,这样就有一个问题,如果都采用上面的三种jmp跳转指令--需要先知道需要跳转的程序的主存地址(jmp 116),这样写死了地址,很不灵活,一旦程序的主存地址一改变,原有的jmp指令就会跳转错误位置,所以就可以通过对需要跳转的语句做标记NEXT ,通过jmp NEXT 的跳转方式实现跳转
4.条件转移指令-jxxx
通常使用条件跳转指令前,需要使用cmp指令。
所以cmp指令经常和条件跳转指令搭配使用。
5.cmp指令的底层原理
本质上就是对a,b两个操作数镜像减法运算a-b,并生成了OF、ZF、CF、SF四个标志位信息
ALU 每进行一次运算的标志位都会自动存入 PSW程序状态字寄存器中(Intel称它为“标志寄存器FR”)
jxxx指令,就是根据cmp指令得到的标志位,来判断是否= < > != 进而决定进行跳转
条件转移指令jmp实现循环
loop指令实现循环 1 2 3 loop 指令: - 格式loop Looltop // ecx-- ,若ecx!=0,跳转到Looptop - 只能用ecx作为循环计数器
函数调用的机器级表示 call、leave、ret指令 1 2 3 4 5 6 7 8 9 call、leave、ret指令实现函数调用: call 指令 作用: 1.将IP旧址压栈保存(保存在当前函数的栈帧顶部) 2.设置新的IP值,无条件转移到被调用函数的第一条指令 leave 指令 作用: 1.将现在的函数的栈帧撤销,相当于将该函数弹栈 ret 指令 作用: 1.弹栈后,从函数的栈帧顶部找到IP旧值,将其出栈并恢复IP原有的值指向回原来位 置
如何访问栈帧里的数据? 访问栈帧数据Push和Pop指令 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ebp和esp: ebp指向当前栈帧的底部,esp指向当前栈帧的顶部,两者标记了当前栈帧的一个范围 ebp、esp存的是地址不是数据值,ebp和esp只是一个指针 Push、Pop指令实现入栈出栈操作操作,X86默认以4字节为单位: 格式: Push ? //先让esp-4,在将数据压入 Push eax #将寄存器eax的值压栈 Push 985 #将立即数985压入栈中 Push [ebp+8] #将主存地址[ebp+8]的数据压栈 (所谓压栈是指将esp里保存的地址,所指向的数据的值修改,然后esp-4) Pop ? //栈顶元素出栈并写入<寄存器/主存地址>,在esp+4 Pop eax # 将栈顶元素出栈,写入寄存器eax Pop [ebp+8] # 将栈顶元素出栈,并写入主存地址[ebp+8] (所谓出栈是指,将esp保存的地址所指向的值写入?,然后esp+4) 问题: 这样访问栈帧数据不灵活,因为每次Push都只能往esp+4的位置Push(压入数据) 每次Pop也只能一次弹出一个栈顶元素,并写入一个栈顶栈顶元素
访问栈帧数据mov指令 1 2 可以直接对esp进行加减运算: 可以使用减法/加法,即sub/add修改栈顶指针esp的值
如何切换栈帧? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 1.先执行call指令: 1.将当前IP(取出call之后自动指向下一条)值,相当于 Push IP 2.将IP设置为被调用函数的第一条指令地址, 相当于jmp add 2.进入目标函数后:<保存上一个函数的栈帧,并设置当前函数栈帧> 1.Push ebp -->将前一个函数的栈底地址保存入栈(先esp+4,然后将ebp值压入) 2.mov ebp esp --> 将esp的地址值复制给ebp,使ebp指向另一个函数的栈底地址 ==> 1+2等价于enter指令 3.一系列逻辑处理 4.恢复上一层函数的栈帧: 1.mov esp ebp --> 让esp指向当前函数栈底 2.Pop ebp --> 将栈顶元素出栈,并写入ebp(ebp重新指回上一个函数基底) ==> 等价于leave指令 5.ret指令: 从栈顶找到返回的地址(原来基础上继续执行),出栈并将值写到IP寄存器中,使其继续执 行
调用函数
函数返回
如何传递参数和返回值? 1 2 3 4 5 6 7 8 9 10 11 12 栈帧最底部(基址)一定是上一层栈帧的基址 栈帧的最顶部,一定是IP的返回地址(当前栈帧除外) 栈帧结构,分为以下几块区域,每块区域内同时越靠前定义的就越靠近栈顶: 1.局部变量区域 2.未使用区域 为什么会有未使用区域? 因为gcc编译器会将每个栈帧大小设置为16B的整数倍(当前函数栈帧除外) 当局部变量和调用参数没有填满栈帧时,就会空出未使用的部分 3.调用参数区域
1 2 3 传递参数,返回值 传低参数:在call指令前,将调用参数写入栈帧顶部区域 接收返回值:在执行ret指令前将函数返回值写入eax寄存器
CISC和RISC 1 2 3 4 5 6 7 8 9 10 11 12 CISC: Complex Instruction Set Computer(复杂指令集) - 通过一条指令完成复杂的基本功能,所以,它的指令往往是变长的 - 变长,这也决定了它的指令执行效率低,因为需要花时间判断该指令的长度 - 像是前面提到的乘法指令 000100 0000000110 只通过乘法指令就可以进行访存,所以 CISC指令对指令的访存权限没有限制 - 由于随着CISC指令变得越来越复杂,很难用一个专门的电路硬件来实现,所以"存储程 序",就是事先将几条组合指令存储在某个地方,比如要实现矩阵的乘法-->可以通过 矩阵的加法、减法;整数加法、减法、乘法,5个比较通用的电路之间配合使用来实现复 杂的矩阵乘法 RISC: Reduced Instruction Set Computer(精简指令集) - 一条指令只完成一个基本动作,一条指令一个电路 - 由于电路设计简单功耗更低,所以主要用于移动设备:手机、平板等
1 2 3 4 5 6 7 8 9 10 CSIC: 1.寄存器数量少,因为可以访存的指令没有限制,可以直接从主存中存取,不会过多的占 用寄存器的数量 2.难以用优化编译生成高效的目标代码程序,因为,CISC本身就是一个复杂体,又胖又无 法切割重组,决定了其效率的上限很低 RISC: 1.寄存器数量多,因为,可以访存的指令只有Load/Stroe,所以进行计算等操作的时候, 只能通过寄存器来存放数据,最后再通过Load/Stroe指令来进行写入或删除 2.指令精简,可以很大程度上重组功能,生成更高效的代码
习题 指令系统 1 单地址指令,即有可能是对一个操作数操作,也可能是对两个数进行运算,只不过另外一个操作数隐含在ACC里面了
1 (1)指令142条,需要8bit作为操作码,然后第一类指令2个地址码,第二类指令3个地址码,第三类指令2个地址码+1个立即数,第四类指令1个立即数+1个地址码
1 扩展操作码,要根据指令码的条数算出操作码的位数,不要忘记预留一个状态用于下一个指令的扩展
指令的寻址方式
1 (1)从寄存器中存取数据比从主存中存取快得多. (2)由于寄存器的数量较少,其地址码字段比主存单元地址字段短得多. 这种方式可以缩短指令长度,提高指令的执行速度,几乎所有的计算机都使用了寄存器寻址方式
1 机器字长,是计算机一次性能处理的数据长度,而数据要先存放在寄存器中进行运算,所以机器字长由寄存器的位数决定
1 2 3 4 ZF 标志位=1,表示两数比较相减为0 CF 标志位=1,表示两数比较发生借位,不够减,所以表示小于 另外【需要掌握+ 表示或】
1 2 基址寻址,如果基址寄存器是Br,则地址中无需添加Br的地址段 如果基址寄存器是通用寄存器R,需要另外字段指出R的地址如下图
1 基址寄存器中存放的是无符号数,而指令中的地址码是补码形式,所以需要转换
1 2 3 1.有四种寻址方式,所以需要2bit作为寻址特征 2.剩下8bit用来表示地址,地址是从0开始编址,不可能是负数 3.假如是2地址指令,就需要再分出2bit用于表示第个地址的寻址方式
1 2 3 4 5 6 7 8 (1)通常采用隐含寻址方式的指令码长度最短通常采用立即寻址方式、直接寻址方式和间接寻址方式的指令码长度最长 (2)由于通用寄存器位于CPU内部,无需到内存读取操作数,所以寄存器寻址,隐含寻址方式执行速度最快。而间接寻址方式需要读内存两次,第一次由操作数的间接地址读到操作数的地址,第二次再由操作数的地址读到操作数,所以间接寻址方式的执行速度最 (3)若指令系统采用定长指令码格式,所有指令(包括采用立即寻址方式的指令)所包含的二进制 位数均相同,则立即寻址方式执行速度最快,因为读到指令的同时,便立即取得操作数。 如果采用变长指令码格式时,由于要表示一定范围内的立即数,包含立即数的指令通常需要较 多的二进制位,取指令时,可能需要不止一次地读内存来完成取指令。因此,采用变长指令码格式时,寄存器寻址,隐含寻址方式执行速度最快。
程序的机器代码表示 考察
AT&T格式指令(寄存器带有%,原操作数在前)与Intel格式指令的区别 OF、CF、SF、ZF各个标志位的含义 CF=1表示两数按照无符号数加法,溢出。OF=0表示两数按照有符号数运算,不溢出
[{"url":"https://cdn.jsdelivr.net/gh/whu1233334/picgo-picture3/picture/202309252105947.png","alt":"image.png"},{"url":"https://cdn.jsdelivr.net/gh/whu1233334/picgo-picture3/picture/202309252107523.png","alt":"image.png"},{"url":"https://cdn.jsdelivr.net/gh/whu1233334/picgo-picture3/picture/202309252131926.png","alt":"image.png"},{"url":"https://cdn.jsdelivr.net/gh/whu1233334/picgo-picture3/picture/202309252119241.png","alt":"image.png"},{"url":"https://cdn.jsdelivr.net/gh/whu1233334/picgo-picture3/picture/202309252137433.png","alt":"image.png"},{"url":"https://cdn.jsdelivr.net/gh/whu1233334/picgo-picture3/picture/202309252127864.png","alt":"image.png"}]
加载更多 [{"url":"https://cdn.jsdelivr.net/gh/whu1233334/picgo-picture3/picture/202309252144146.png","alt":"image.png"},{"url":"https://cdn.jsdelivr.net/gh/whu1233334/picgo-picture3/picture/202309252156126.png","alt":"image.png"},{"url":"https://cdn.jsdelivr.net/gh/whu1233334/picgo-picture3/picture/202309252158551.png","alt":"image.png"}]
加载更多 CISC和RISC的基本概念 RISC
RISC精简指令集,一定采用流水线技术 1.RISC架构的特点是简化指令集,使每个指令能够在一个时钟周期内完成。但是单纯依靠提高时钟频率来提高性能是有瓶颈的,因此需要使用流水线来提高指令执行效率 2.流水线可以让多个指令同时处于处理中的不同阶段,从而提高指令吞吐量。RISC的简单指令集特别适合流水线的实现
中央处理器CPU
CPU的功能和基本结构 CPU的功能
运算器和控制器的功能
运算器的基本结构 专用数据通路方式 1 2 3 每个寄存器与ALU之间都有专门的单独的数据通路-->称为专用数据通路 下图所示,所有寄存器与ALU都直接相连,但是我们不需要同时有这么多寄存器同时输入数据 以下有两种解决办法:1.多路选择器;2.
多路选择器
使用多路选择器根据控制信号选择一路输出
三态门
计算机里面1 0 分别表示 是 非 两种逻辑,但是还不够,因此引入了一种新的状态——高阻态 (相当于电阻无穷大,断路状态)。
三态:高电平、低电平、高阻态。
三态门主要与总线连接,因为总线在同一时间内只能对一个设备有效。 通常在数据总线上连接有多个器件 。同一时刻只能有一个设备选通,用于数据传输;其他设备处于高阻态(断开)。
EN使能信号: EN是0信号 表示数据从A->B ;1信号 表示数据从B->A;当EN使能信号无效时(没有产生信号)处于高阻态
CPU内部单总线方式 1 将所有寄存器的输入端和输出端都连接到一条公用的通路上(CPU内部总线)
引入暂存寄存器 从这开始内部总线就只能同时有一个输入信号
为了避免输入信号还没稳定的时候就发出输出信号,在ALU后面再引入一个暂存寄存器+一个三态门
1 2 当输入信号稳定前,期间产生的输出信号被存放在暂存器中(此时三态门没有导通); 当输入信号稳定之后,(三态门接通)最终产生的输出信号才传输到CPU内部总线
控制器的基本结构
CPU的基本结构
回顾
指令的执行过程 指令周期 CPU从主存中每取出并执行一条指令所需的全部时间
数据流(微操作+有效信号) 注意书写数据流的时候需要写出——> 微操作 + 有效控制信号
指令周期的数据流向-取指周期
指令周期的数据流向-间址周期
Ad(MDR) -> MAR 中Ad 表示的是将MDR数据(取得的指令)中的地址码部分放入MAR中Ad(IR) -> MAR 中Ad表示的也是将IR数据(取得的指令)中的地址码部分放到MAR中
指令周期的数据流向-执行周期
指令周期的数据流向-中断周期
指令执行方案
回顾
数据通路的功能和基本结构 数据通路 1 2 3 4 5 6 7 数据通路的基本结构有: 1.CPU内部单总线方式 所有CPU部件连接一根内部总线,同时只能一组部件数据交换(一个发出,一个接收) 2.CPU内部多总线方式 为了解决同时只能有一组部件进行数据交换,所以提出CPU内部多总线,所有部件与这些 多根总线都有连接,同时可以支持n组部件数据交换(n是总线根数) 3.专用数据通路方式
数据通路-CPU内部单总线方式 完成一次加法运算,完整的数据通路(单总线方式)
由于这是单总线方式,一次只能有一组部件传输数据(例如 (ACC)->Bus->ALU 实现ACC和ALU之间的 被加数 传输,加数 只能先通过MDR->Bus->Y 存放在暂存寄存器中)
例题
取指周期过程
间址周期过程(省略微操作): 1.R0out ,MARin 控制信号有效 ->R0内间接地址传送到MAR 2.MemR ,MARout ,MDRinE 控制信号有效 -> 根据间接地址得到的直接地址EA存入MDR 3.MDRout ,MARin 控制信号有效 ->EA传给MAR 4.MARout ,MemR ,MDRinE 控制信号有效 -> 根据EA找到的操作数()存入MDR 5.MDRout ,Yin 控制信号有效 -> 将目的操作数((R0))放入暂存寄存器Y中
执行周期过程(省略微操作): 1.R1out , ALUin ,CU向ALU发送加法操作信号, 控制信号有效 ->将源操作数送入ALU运算(Y寄存器同时会将之前暂存的目的操作数通过专用数据通路送往ALU) 2.Zout ,MDRin 控制信号有效 -> 将计算结果送入MDR寄存器 3.MemW ,MDRoutE ,MARout -> MDR将计算结果送到主存,MAR目的操作数地址传给主存,主存根据MAR中已经存在的目的操作数的有效地址,将结果写回到目的操作数的地址
数据通路-专用数据通路方式 专用数据通路-取指周期
取指周期数据流向:1 . (PC)->MAR C0有效2 . (MAR) ->主存 C1有效3 . 1->R 控制单元向主存发送读命令4 . M(MAR) -> MDR C2有效5. (MAR) -> IR C3有效6. (PC)+1->PC7. Op(IR) ->CU C4有效【Op是操作码,Ad是地址码;将操作码传给CU分析】
控制器的功能和工作原理 硬布线控制器(组合逻辑控制器) 什么是硬布线控制器?
硬布线控制器的设计
1.分析每个阶段的微操作序列
2.选择CPU的控制方式 这里采用同步控制方式(定长机器周期)–>一个周期安排3个节拍
3.安排微操作时序
取指周期 间址周期 执行周期 访存指令STA 、ADD 、LDA 非访存指令 转移指令
4.电路设计 a.列出操作时间表 b.写出微操作命令的最简表达式 c.画出逻辑图
微程序控制器 什么是微程序控制器? 为了方便修改和扩展,提出了微程序控制器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 CPU内的控制器包含:CU IR PC CU控制单元用于实现微指令的执行 1.由于CM内存储了多种指令 的 微程序,所以“微地址形成部件”需要根据IR内具体 的指令的操作码,判断该指令对应CM内哪个微程序,以获得其"起始微地址" (改正一下表述:所谓微程序既可以说是一条完整指令,包括取指周期、间址周 期、执行周期、中断周期的所有微指令的总和;也可以说单独的某个周期的微程 序,例如:取指周期微程序,这里“微地址形成部件,的作用是在根据IR中的操作 码特征,分析执行周期的微程序的微指令首地址,而不是取指周期微指令首地址 因为取指周期是通用的它的地址可以由执行周期中最末尾的微指令的下地址指 明,而执行周期的微指令不是通用的,所以需要单独通过“微地址形成部件”,来 获得首地址) 2.再根据"顺序逻辑" 中"标志"信息判断下一步要执行微指令的存放地址(一般标志 信息是根据指令地址码(IR中的地址码)的特征,判断是否要进行间址周期,无需间 接寻址就跳过间址周期微指令;如果要间接寻址,那么按照“CMDR中的下地址”顺序执 行下去) 3.CMAR接收来自经过顺序逻辑处理后的“起始微地址” 4.CMAR 将地址(微指令地址)送入地址译码器,找到地址对应的微指令在CM中的位 置 5.CM(控制存储器)根据位置取出该条微指令(操作控制+下地址) ,送到CMDR 6.CMDR将微指令的操作控制信息 传至CPU内部和系统总线的控制信号 7.CMDR 将下一条(相邻的)微指令地址传给顺序逻辑(顺序逻辑会根据之前获得的标 志+CLK信息,如果当前执行到了间址周期微指令,会根据标志信息,判断是否跳过) 8.重复这一循环
1 一个微程序包括一条指令的所有周期的微指令,所以一条指令的取指周期微程序+执行周期微程序,其实是一个微程序
微指令的设计
微指令的格式 水平型微指令、垂直型微指令、混合型微指令
微指令的编码方式 编码方式
1 2 3 4 5 6 7 8 9 微指令编码主要方式分为3种 直接编码: n个微命令->需要分别对应n个bit信号位 字段直接编码: 采用译码器,将控制字段分段,比如3bit为1段,能产生2^3种不同信号, 这样就能用更少bit存储控制信号。 这样实现,相同字段内的控制信息无法并行进行-->所以互斥信号放在同一字段 字段间接编码: 译码器上加一层译码器
例题
互斥的放在同一段内,控制字段,需要表示的状态数,需要预留一个全0,表示无操作
微指令的地址形成方式 方式
例题
微程序控制单元的设计 微程序控制单元的设计
微程序设计的分类
硬布线与微程序的比较
微程序控制器回顾
指令流水线
指令流水线基本概念性能指标
指令流水的定义
流水线表示方法
流水线的性能指标 –吞吐率、加速比、效率
五段式指令流水线 机器周期的设置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 完成一条指令,常分为五个阶段: IF(取指阶段)、ID(译码段)、EX(执行段)、M(访存)、WB(写回) 由于每个功能段需要消耗时间不一致,为了统一方便指令流水线,以最长耗时为准这里就设为100ns 同时就需要在每个功能段后面加一个缓冲寄存器-->锁存器 目的是为了保证执行更快的阶段,将数据存放,处于缓冲等待的状态,以维持统一 Instruction Cache(指令Cache)--也就是Cache中存放指令的区域 取指一般都是在指令Cache中取指 Data Cache(数据Cache)--也就是Cache数据区域 M访存,当Cache命中的情况下,直接访问数据Cache
1 2 考试中常见的指令有五类(RSIC精简指令集) 运算类指令、LOAD指令、STORE指令、条件转移指令、无条件转移指令
各类指令的执行过程 运算类指令执行过程
LOAD指令执行过程 1 LOAD--取数指令,RSIC指令集中唯二可以访存的指令,作用是从主存取数到寄存器中
STORE指令执行过程
条件转移指令执行过程 WrPC逻辑上既不属于M段,也不属于WB段,只是因为WrPC所需要的功能部件与这5个阶段的功能部件是“相互独立的”,所以可以看做一个独立的阶段,可以自由安排
无条件转移指令执行过程
例题
指令流水线的影响因素 结构相关
数据相关 这里三地址指令的顺序搞错了,顺序应该是OP R1 R2 R3 –> (R1)OP(R2)–>R3
硬件阻塞 NOP空操作 数据旁路技术
控制相关 由于指令会提前预取,如果到时候需要进行条件转移,那么之前预取的指令就不会执行,浪费导致阻塞 解决办法就是尽早的判别是否需要跳转
指令流水线分类
流水线的多发技术 超标量技术
超流水技术
超长指令字
多处理器基本概念
SISD
SIMD
MIMD
共享存储多处理器 多计算机系统
向量处理器
硬件多线程的基本概念
习题 CPU的功能与结构习题 PSW属于运算器
指令寄存器就是IR
操作系统位数是指操作系统可寻址的位数
CPU中寄存器分为用户可见,和不可见
存储字长–假如内存按照字节寻址,则内存中一个地址对应1byte,存储字长就是1byte 机器字长–CPU一次性能处理的数据的最大位数,往往等于运算器中寄存器的位数
地址译码器属于主存,是将地址信号翻译成存储器的选通信号
如果指令字按字边界对齐,那么可以按一个机器字(这里是32bit=4B),占一个地址。所以,本来按字节编址需要32位,那么按字编址,就只需30位
指令执行过程习题
需要存取的指令地址信息,追根究底来自于PC
机器周期–取决于访存时间–>存取周期
1.取指操作是控制器固有的功能,不需要操作码控制 2.指令有长有短,当指令过长占两个存储字长时,就需要两次访存 3.中断周期,是在当前指令执行完之后才出现
冯诺依曼计算机–>同时存储指令和数据,并且统一编址 那吗如何区分取得的二进制串是数据还是指令呢? 1.首先先规定一个指令入口地址,这个地址存放的必定是指令 2.从入口地址取指令,然后根据指令周期的阶段,当进行到执行周期,取的 一定是数据
开中断是指 允许中断 取完空操作指令,PC照样会+1
中断周期的前一个周期–>执行周期 中断周期的后一个周期–>下一条指令的取指周期
数据通路的功能和基本概念习题 数据通路是指数据不同功能部件之间传送的路径
CPU内部单总线结构–由于只有一条数据总线,所以切换时钟周期T(节拍时) 就需要先释放上一个时钟周期里面微操作所占用的数据通路,才能开始下一个微操作
举例:一整个完整管道系统(管道+阀门) ,就是一个数据通路(电路+部件) 水管就是电路,阀门就是部件(不能存储,是时序逻辑元件) 部件 分为 组合逻辑元件(不能存储,也称操作元件) 和 时序逻辑元件(能存储,也称状态元件)
1.该指令,是变址寻址, X是变址寄存器XR ,D是形式地址,所以有效地址是(X)+D,那么,得到有效地址只有1个,也就意味着操作数只有一个,所以是隐含了一个操作数在ACC里面
答题要爽快 1.题中M(MAR)->MDR ,外部总线数据输入到MDR控制信号MDRinE ,图中没有给出,可以不写 2.IR,FR(状态字寄存器)都与CU输入端相连 3.rd,目的寄存器,rs,源寄存器 4.题中声明了数据送到MDR需要5个时钟周期
控制器的功能和工作原理
1.缩短微指令长度,自然可以减少从CM中取指的次数,加快速度 2.增大控制存储器CM容量,会增加对CPU占用率,所以应该是减少CM容量
1.控制存储器CM是用的ROM芯片,只读存储器,非易失性存储器,里面的微指令是出厂就设定好的 2.主存是用的DRAM芯片,易失性存储器,关机数据就清空
访存延迟比电路延迟大很多
对于汇编语言程序员可见的寄存器,即是在汇编语言中能出现的寄存器
异常和中断机制
指令流水线习题 流水CPU–时间并行技术 RSIC采用的一定是流水CPU,部分CSIC也采用流水CPU
超标量流水线–空间换时间,配置多个相同功能部件,同时处理相同任务
m段流水线稳定时,是指,第一条指令完全从头到尾执行完,之后,每隔一个时钟周期,都会有一条指令执行结束,这样的状态就是稳定状态 稳定状态平均下来,一个时钟周期,完成一条任务,CPU吞吐能力(单位时间内流水线完成的任务数量)=1条/T ; 等效于m个并行部件CPU吞吐能力
度为4,表示处理机能并行处理4条指令(超标量流水技术),那么处理20条指令,相当于普通流水线处理20/4=5条指令,过程与上面一致
1.加入空操作,可以解决所有类型的指令流水线影响因素(结构、数据、控制)
数据相关流水线冲突有: RAW(写后读冲突):在前一条指令还没有写回数据,后面就开始读取该数据 WAR(读后写冲突):在前一条指令对数据还没有开始读,后一条指令就开始写 WAW(写后写冲突):后续指令比前面的指令先进行写数据
要实现流水线必须将每个功能段时间取为一样长,且按照最长的功能段为标准
动态调度技术,就是将能够并行执行,不会造成数据冲突的指令安排调度在同一个周期内完成
流水段寄存器延时–指令功能段与段(部件与部件)之间需要通过将之前的数据放到寄存器里,传递给后面的功能段(部件),这里存在一些时间延迟,所以考虑CPU时钟周期,不仅要以最长时间为标准,还需要加上寄存器延时
1.单周期CPU–指令周期不细化分为取指、间址、执行、等等周期,理想状态1个时钟周期就可执行一条指令 2.多周期CPU–指令周期细分为取指、间址、执行、中断等多个机器周期,每个机器周期都需要多个时钟周期 3.基本流水线–理想状态下,稳定后,隔1个时钟周期就能完成一条指令 4.超标量流水线–理想状态下,稳定后,隔一个时钟周期,能完成多条指令,CPI<1
画出流水线时空图、非流水线时空图、指令周期流程图
画出流水线功能段结构图、指令执行过程流水线的时空图
(1) (2) (3) (4)
(1) (2) (3)
总线
总线的概念与分类 总线的定义
总线的分类
按数据传输格式 并行总线由与传输速率过快,容易产生电磁干扰,所以,并行总线不一定比串行总线传输速度快
按总线功能
重点介绍系统总线- 单总线结构
1.单总线结构 2.双总线结构 【突发传输+通道】 3.三总线结构 4.四总线结构
按时序控制方式 略
小结
总线的性能指标 1.总线的传输周期(总线周期) 2.总线时钟周期 3.总线的工作频率 4.总线的时钟频率 5.总线宽度 6.总线带宽 7.总线复用 8.信号线数
地址/数据总线复用,使得使用较少的线传输更多信息,但是这样,数据地址就只能交替进行输送,不能同时进行,会降低数据传输速率
总线操作和定时 总线定时 是指总线在双方交换数据的过程中需要时间上配合关系的控制,这种控制称为总线定时,它的实质是一种协议或规则
1.同步定时方式
总线控制器采用一个 统一的时钟信号 来协调发送和接收双方的传送定时关系
假设:CPU作为主设备,某个输入设备作为丛设备
CPU在T1时刻的上升沿给出地址信息 在T2的上升沿给出读命令(低电平有效),与地址信息相符合的输入设备按命令进行一系列的内部操作,且必须在T3的上升沿来之前将CPU所需的数据送到数据总线上。 CPU在T3时钟周期内,将数据线上的信息传送到其内部寄存器中。 CPU在T4的上升沿撤销读命令,输入设备不再向数据总线上传送数据,撤销它对数据总线的驱动。
2.异步定时方式
在异步定时方式中,没有统一的时钟,也没有固定的时间间隔,完全依靠传送双方相互制约的“握手”信号来实现定时控制。 主设备提出交换信息的“请求”信号,经接口传送到从设备;从设备接到主设备的请求后,通过接口向主设备发出“回答”信号。
3.半同步方式
4.分离式通信
习题 总线概述
1.总线同一时刻只能有一个设备发送数据,但可以有越多台设备接收数据 2.总线同一时刻只能有一个主设备控制总线传输操作,主设备可以要求从设备发送数据,也可以自己发送数据给从设备,这个控制权在主设备手中
1.系统总线有多种总线结构,其中单总线结构(不止只有一条总线,包含数据、地址、控制总线)
1.一次间接寻址获得的数据是操作数的有效地址 2.其实这个有效地址还是经过数据总线传送给CPU的 3.地址总线只能是单向的从CPU到主存,不能从主存到CPU
1.CPU从主存获得的数据都是从数据总线送过来的;对于CPU识别从主存取的数据是地址 还是操作数 ,是通过当前处于指令周期的那个阶段来判断,具体通过控制单元,识别状态触发器的二进制位信息 2.主存则通过,送过来的数据是通过数据总线还是地址总线,来确定是数据还是地址
总线带宽,计算练习 注意区分:时钟频率与总线频率的区别
分辨率:代表一个图中总共有多少单元 构成 颜色:每个单元内有多少种颜色
总线标准
突发传输方式:是指,往主存送入一个块的首地址,那么就可以连续的读写后面后面一连串地址的数据
USB又称通用串行总线,只能单个bit传输数据,但是传输路很高
同步通信方式,同步时钟信号,必须要同一设备给出,以保证统一 同步通信方式,要求时钟信号保持一致,但是如果有的设备离的比较远,时钟信号传输中会有延迟,所有会导致时钟信号不统一,所以同步通信方式只适合设备距离较近的
1.并行总线速度过快会有干扰,串行则不会,所以串行并不一定比并行慢 2.突发传输:送入一个首地址,能连续读或写一连串数据 普通传输:送入一个地址,读或写一个数据; 由于传输地址信息需要占用总线,读取数据也需要占用总线,所以突发传输提高了总线利用率,更少的用来传输地址信息
三通道总线,可以三个通道互相独立工作,那就要x3
总线一般被设计来传输固定大小的一块数据,这块数据被称为字(word),一个字包含的字节数(即字的大小)是各种计算机系统里面的基本参数,而且这个参数在不同的系统里通常是不同的。 大多数的现代计算机系统里面,一个字要么是4个字节(32位),要么是8个字节(64位)
70%数据用于读,30%数据用于写;由于读的速度慢,写的速度快,所以读的时间>70%总时间,写的时间<30%总时间;故应该按照数据量去算
总线的操作和定时
输入输出系统 IO系统基础概念
IO控制器(IO接口)
IO控制方式 1)程序查询方式:CPU不断轮询检查I/O控制器中的“状态寄存器”,检测到状态为“已完成”之后,再从数据寄存器取出输入数据 2)程序中断方式:等待键盘I/O时CPU可以先去执行其他程序,键盘I/O完成后I/O控制器向CPU发出中断请求,CPU响应中断请求,并取走输入数据 3)DMA控制方式:主存与高速I/O设备之间有一条直接数据通路(DMA总线)。CPU向DMA接口发出“读/写”命令,并指明主存地址、磁盘地址、读写数据量等参数。DMA控制器自动控制磁盘与主存的数据读写,每完成一整块数据读写(如1KB为一整块) ,才向CPU发出一次中断请求。
4)通道控制方式:通道:可以理解为是 “弱鸡版的CPU”。通道可以识别并执行一系列通道指令,通道指令种类、功能通常比较单一
IO系统的组成
外部设备
IO接口
IO接口的作用 IO接口即设备控制器,功能如下:
数据缓冲:通过数据缓冲寄存器(DBR)达到主机和外设工作速度的匹配 错误或状态监测:通过状态寄存器反馈设备的各种错误、状态信息,供CPU查用 控制和定时:接收从控制总线发来的控制信号、时钟信号 数据格式转换:串-并、并串等格式转换 与主机和设备通信:实现主机一/O接口一/o设备之间的通信
IO接口的结构
IO接口的工作原理 ①发命令:发送命令字到I/O控制寄存器,向设备发送命令(需要驱动程序的协助) ②读状态:从状态寄存器读取状态字,获得设备或I/O控制器的状态信息 ③读/写数据:从数据缓冲寄存器发送或读取数据,完成主机与外设的数据交换
控制寄存器、状态寄存器在使用时间上是错开的,因此有的I/O接口中可将二者合二为一。 IO控制器中的各种寄存器称为I/O端口。 如何确定要操作的设备?每个设备对应一组寄存器,操作不同的寄存器就是在操作不同的设备。 IO端口 I/O端口是指接口电路中可以被CPU直接访问的寄存器。
I/O端口要想能够被CPU访问,必须要有端口地址,每一个端口都对应着一个端口地址
IO端口的编址
IO接口的分类
IO方式 程序查询方式
程序中断方式
中断的基本概念
程序中断是指在计算机执行现行程序的过程中,出现某些急需处理的异常情况或特殊请求,CPU暂时中止现行程序,而转去对这些异常情况或特殊请求进行处理,在处理完毕后CPU又自动返回到现行程序的断点处,继续执行原程序
中断请求的分类
内部中断 :中断事件与当前执行的指令有关外部中断 :中断事件与当前执行的指令无关扩展 外部中断分为可屏蔽中断与不可屏蔽中断
IF(Interrupt Flag)开/关中断标志 。当IF=1时,表示开中断,当IF=0时表示关中断INTR:可屏蔽中断请求(interrupt request)信号 ,输入,用来申请一个硬件中断。当 IF=1 时,若 INTR 保持高电平,则在当前指令执行完毕后就进入中断响应周期NMI:非屏蔽中断(non-maskable interrupt)输入信号 。与INTR 信号类似,但 NMI 中断不必检查 IF 标志位是否为 1。常用于处理电源掉电紧急情况 。INTA:中断响应(interrupt acknowledge)信号,输出 。响应 INTR 输入。该引脚常用来选通中断向量码以响应中断请求。中断请求标记
每个中断源向CPU发出中断请求的时间是随机的。 为了记录中断事件并区分不同的中断源,中断系统需对每个中断源设置 中断请求标记触发器 INTR , 当其状态为“1”时,表示中断源有请求。 这些触发器可组成中断请求标记寄存器,该寄存器可集中在CPU中,也可分散在各个中断源中。
对于 外中断 ,CPU是在统一的时刻即 每条指令执行阶段结束前 向接口 发出中断查询信号 ,以获取I/O的中断请求,也就是说,CPU 响应中断的时间 是在每条 指令执行阶段的结束时刻 。
CPU响应中断必须满足以下3个条件: ① 中断源有中断请求。 ② CPU允许中断即开中断。 ③ 一条指令执行完毕,且没有更紧迫的任务。
中断的判优先
有多个中断信号同时到来,先处理哪个?
中断判优 既可以用硬件实现,也可用软件实现:
硬件实现是通过 硬件排队器 实现的,它既可以设置在CPU中,也可以分散在各个中断源中; 软件实现是通过 查询程序 实现的
中断的优先级
硬件故障中断属于最高级,其次是软件中断; 非屏蔽中断优于可屏蔽中断; DMA请求优于I/O设备传送的中断请求 高速设备优于低速设备; 输入设备优于输出设备; 实时设备优于普通设备。 中断处理过程
中断隐指令
中断隐指令(Interrupt Shadow Instruction)是一种CPU设计技术,用于在中断发生时,自动保存和恢复中断前程序的执行状态。是由硬件自动执行的 。
中断隐指令的主要任务: ① 关中断 。在中断服务程序中,为了保护中断现场(即CPU主要寄存器中的内容)期间不被新的中断所打断,必须关中断,从而保证被中断的程序在中断服务程序执行完毕之后能接着正确地执行下去。 ② 保存断点 。为了保证在中断服务程序执行完毕后能正确地返回到原来的程序,必须将原来程序的断点(即程序计数器(PC)的内容)保存起来。可以存入堆栈,也可以存入指定单元。 ③ 引 出中断服务程序 。引出中断服务程序的实质就是取出中断服务程序的入口地址并传送给程序计数器(PC)。
如何取出中断服务程序的入口地址?
硬件向量法(衔接)
中断队列的输出信号经过中断向量地址 形成部件(硬件)后,形成一个向量地址(中断类型信号)【实际就是指针的指针,二级地址,指向的是中断向量 (中断服务程序的入口地址)】,由向量地址指向JMP指令,再由JMP指令跳转向真实的服务程序地址。
为什么不直接由向量地址指向服务程序的地址? 答:因为程序时会发生变化的,服务程序的地址会改变,如果由向量地址直接跳转到服务程序,那么就需要改变硬件设置【太麻烦】,所以有JMP跳转就可以改变JMP跳转的地址即可,灵活实现简单
中断服务程序
单冲中断处理过程
单重 中断:执行中断服务程序时不响应 新 的中断请求
多重中断
对比单重中断
对于单重中断,当前的中断服务程序,无法被另外的中断信号打断 对于多重中断来说,当前中断服务可以被优先级高的中断打断
但是要如何实现对当前中断的屏蔽,从而执行另外的中断服务程序呢? 这就需要中断屏蔽技术了
中断屏蔽技术
按理,对于不同中断源,它有中断响应优先级,但这个是硬件决定的,无法修改 ;而如果要修改各个中断的优先级(即是否可以被打扰),可以通过中断屏蔽寄存器(人工设置该寄存器的值)来实现 ;这是提出中断屏蔽技术的原因所在;
中断屏蔽技术主要用于多重中断,CPU要具备多重中断的功能,须满足下列条件。 ① 在中断服务程序中提前设置开中断指令。 ② 优先级别高的中断源有权中断优先级别低的中断源。 每个中断源都有一个屏蔽触发器,1表示屏蔽该中断源的请求,0表示可以正常申请,所有屏蔽触发器组合在一起,便构成一个屏蔽字寄存器,屏蔽字寄存器的内容称为屏蔽字
屏蔽字设置的规律:
一般用‘1’表示屏蔽,’0’表示正常申请。 每个中断源对应一个屏蔽字(在处理该中断源的中断服务程序时,屏蔽寄存器中的内容为该中断源对应的屏蔽字)。 屏蔽字中‘1’越多,优先级越高。每个屏蔽字中至少有一个’1’(至少要能屏蔽自身的中断)
例题讲解
程序中断方式
程序中断方式图示
例题
假定CPU主频为50MHz,CPI为4。设备D采用异步串行通信方式向主机传送7位ASCII字符,通信规程中有1位奇校验位和1位停止位,从D接收启动命令到字符送入I/O端口需要0.5ms。请回答下列问题,要求说明理由。 2)设备D采用中断方式进行输入/输出,示意图如下:
DMA方式 DMA控制器
DMA方式总共可以分为预处理 、数据传送 、后处理 三个阶段。预处理和后处理都需要一次中断请求,数据传送过程需要一次DMA请求(请求总线使用权),其中一次DMA请求的周期成为总线周期或者DMA周期
预处理 预处理【设置CR、MAR、DC等】。CPU 接收到I/O 设备的DMA 中断请求时,它给I/0 控制器发出一条命令,启动DMA 控制器,允许DMA不断从缓冲区拿走数据填充自己的块,然后继续其他工作。
数据传送
DMA数据块被填满时,开始进行DMA传送。
传送前
1 2 3 接受外设发出的DMA请求(外设传送一个字的请求),并向CPU发出总线请求。 CPU响应此总线请求,发出总线响应信号,DMA接管总线控制权,进入DMA操作周期。 DMA的总线使用权比CPU要高,为了防止数据无法及时写入
传送时
1 2 确定传送数据的主存单元地址及长度,并能自动修改主存地址计数和传送长度计数 规定数据在主存和外设间的传送方向,发出读写等控制信号,执行数据传送操作
传送后
后处理 传送完成后,DMA 控制器发送一个中断信号给处理器。报告传送完成
DMA传送过程
DMA传送放式
主存和DMA控制器之间有一条专用数据通路DMA总线,因此主存和I/O设备之间交换信息时,不需要通过CPU(所以不占用CPU)。但当I/O设备和CPU同时访问主存时,可能发生冲突(尽管DMA的总线优先级跟高),为了有效地使用主存,DMA控制器与CPU通常采用以下3种方法使用主存
三种方式
DMA方式与中断方式的区别
DMA优先级为什么更高? 1. DMA处理高速设备,需要快速处理数据 2. DMA不能等待,否则数据会异常 3. 中断方式处理的是慢速设备,可以等待实时性不强
习题 IO系统基本概念
attention
按照能否打出汉字将打印机分为,点阵式、活字式 按照打字原理分为,击打式、非击打式
attention
28 /8=25 =32,所以式32字节。注意点阵是一个方阵
attention
分辨率是指共有多少像素点,像素点越多越清晰 像素,是指一个像素点有多少种级别的颜色,例如像素256单个像素点有256种级别颜色,256需要8bit来表示
IO接口 1 IO接口就是设备比与主机相连接的桥梁,通过接口实现数据传输,接口一般有如下的功能:
1 统一编址,只需要访问内存中IO设备的地址就可以进行输入输出操作
1 2 3 4 IO设备的单独编址与统一编址 独立编址:内存和外设分开独立编址(它们的地址原则上可以有重合区域);因为独立,所以内存编址可以从0~N,外设编址也可以从0~N; 统一编址:就是内存和外设的编址放到一起来规划,被外设用了的地址就不能给内存了,反之亦然! 比如:给外设分配地址0~N,那么内存就不能使用0~N了,只能使用N~M!
1 2 3 I/O设备采用统一编址,由于IO设备不需要用到存储单元,所以对应内存内对应IO设备的地址不会分配存储空间给他。 为什么不用分配存储空间?难道不需要存放IO操作的指令吗? 答:因为IO设备采用统一编址,当CPU访问该地址就知道是IO操作,不需要指令来指示。所以也就不需要额外存储指令了,所以存放IO设备的地址不能变化,因为该地址没有存储空间。
1 2 3 4 状态:单个0,1信号 状态字:一整串1000..信号 状态线只能传输简单状态信号,完整的状态字需要通过数据线
IO方式 1 2 3 查询中断处理服务程序的入口地址两种方法:软件查询、硬件查询 硬件方法,也称中断向量法:由部件形成中断向量的地址,再由地址找到中断向量(中断处理服务程序的入口地址)
1 2 3 为什么浮点数下溢,不需要异常处理(中断),上溢需要? - 因为浮点数下溢是因为机器位数有限,无法表示过小的浮点数,但是可以都视作0,结果影响不大 - 但是浮点数上溢,是要求表示的数太大,造成的结果是结果准度丢失,直接导致数与原有的数相差大或者没有任何关系,这样就需要进行异常处理
1 2 3 中断的IO方式,CPU是在统一的时刻即 每条指令执行阶段结束前 向接口 发出中断查询信号 ,以获取I/O的中断请求,也就是说,CPU 响应中断的时间 是在 每条 指令执行阶段的结束时刻 DMA的IO方式,CPU在每次访存完毕都可以检测是否有DMA请求,不需要等到指令执行结束,因为DMA可以自行运行不需要占用CPU,所以CPU可以继续原来的指令执行。
1 2 3 4 5 6 7 1.访管:是指切换核心态 2.用户程序提出IO请求时,发出的是访管指令(trap陷入指令),从用户态转变为核心态 3.IO中断,是指外部设备发出IO请求(外中断的一种) 4.两者区别: - 访管中断的优先级较高,需要立即响应以进行访客管理。 - IO中断的优先级较低,响应时间可以更长一些,容忍有一些延迟。 - 一般内中断的优先级都比外中断高
1 中断隐指令不属于程序控制指令,他是在中断发生的时候,保存原来的程序执行的断点信息,这个歌过程由硬件自动实现。并通过软件或硬件向量的方式找到中断处理服务程序的入口地址,执行中断程序
1 2 3 中断隐指令做三件事情:1.关中断 2.保存断点 3.引出中断隐指令 后面的6步骤有中断服务程序完成
1 2 3 区分中断响应与处理的区别 - 中段响应优先级:响应优先级由硬件排队实现是固定不变的 - 中断处理优先级:想要改变各个中断的优先级就需要通过屏蔽字来实现
1 2 - 中断方式的IO,CPU不用自己停下来检查是否由IO请求,允许I/0 设备主动打断CPU 的运行并请求服务,从而“解放"CPU, 使得其向I/0 控制器发送读命令后可以继续做其他有用的工作。这就是CPU与外设可以并行工作。但是传输数据需要经过CPU,所以传送时CPU与IO控制器时串行的 - DMA方式的IO,既可以主动打断CPU请求IO,也可以传送时不经过CPU,由单独的IO总线直接与贮存相连,DMA只需要传输完成后向CPU汇报一次,整个过程CPU与DMA都是并行的。
1 周期窃取是DMA避免与CPU访存冲突的方式之一,CPU执行指令不全都需要访存,所以在CPU不访存的时候用于DMA与主存的传输,这就是周期窃取
attention
完全脱离程序控制的只有DMA
程序中断方式,是由中断服务程序实现 通道控制,虽然通道也是硬件,但是实际上,通道任然要使用CPU传送给通道的程序,本质上是换了一个弱一点的CPU执行程序 DMA方式存取,与CPU没有关系,与程序也就更没关系,完全的硬件实现
1 2 100/400=25% 延迟50ns不是设备的IO时间,任然是CPU在执行其他任务
1 2 - 多重中断可以在当前中断程序执行过程中响应新的中断,所以要保持开中断 - 虽然能在当前中断程序执行时响应其他中断,但是任然需要在当前指令执行结束后(并不是当前中断程序结束后,只是其中一条指令)再响应别的中为了不必要的麻烦。
1 2 3 4 5 1.区分DMA方式中的中断请求和DMA请求: - 中断请求,只在预处理和后处理阶段所需要的各一次中断请求 - DMA请求,是在每次传送完一个字数据时,再次抢夺总线控制权的过程,DMA对总线的控制权比 CPU要高。 2.整个数据块传送过程中,如果采用的交替或周期窃取方式,CPU就可以和DAM交替使用总线,不存在期间CPU无法使用总线的问题。
1 外设准备数据的时间如果小于中断处理的时间,那么就会发生,数据在寄存器中早早存满,但是却中断处理不过来,后面的数据又到了,造成重要数据被覆盖而丢失
1 2 3 4 5 6 7 8 9 题目中响应优先级是1->2->3->4这是固定的;中断执行优先级是3->1->4->2 如果1,2,3,4同时请求中断 1最先响应,突然发现,3的优先级高,所以打断1执行3。 3执行完,回到1继续执行。 1执行完,不能直接到4,只有被打断时才能直接跳转,4优先级低不属于打断,所以1执行完先回到空闲状态。 然后发现还有2,4没有响应,先响应2,突然发现4的执行优先级更高,所以打断2执行4。 4执行完,回到2继续执行