计算机组成原理
一、计算机系统概论
1.1五代发展
1、1946-1957 电子管 第一台计算机1946.2.14 Eniac
2、1958-1964 晶体管
3、1965-1971 中小规模集成电路,小型计算机
4、1972-1990 大规模和超大规模集成电路,微型计算机
5、1991- 巨大规模集成电路,单片机
1.2计算机性能指标
1、吞吐率:单位时间内处理的信息量(Byte/s)
2、响应时间:从输入有效到系统响应时间
3、利用率:给定时间内,系统被实际使用时间所占的比例
4、处理器字长:也叫机器字长,指CPU一次处理数据的位数,与CPU内部的寄存器位数有关
5、总线宽度:CPU中运算器(ALU)与存储器之间互联的内部总线二进制位数
6、存储器容量:存储器中所有存储单元的总数目KB、MB等
7、存储器带宽:单位时间内从存储器中读出的二进制数信息量Bytes/s
8、主频(f):CPU工作时主时钟的震荡频率f,HZ
9、时钟周期(T):主频的倒数,震荡一次的时间,us,ns
10、MIPS(Million Instruction Per Second):每秒钟执行的百万条指令数
=指令条数/程序执行时间*10^6
11、CPI(Cycles Per Instruction):每条指令执行所需的CPU时钟周期数
=执行该段程序所需的CPU时钟周期数(Nc)/该程序包含的指令条数(In)
注:
1、CPU由运算器、控制器、大量寄存器和时钟组成,可以这样理解,CPU核心是运算器,控制器是用来将指令数据或者其他数据从内存或者其他储存器运输到运算器的部件,寄存器用来快速的对CPU所需要的内容进行反馈,主时钟则通过脉冲信号控制这些部件顺序进行而不发生冲突。
2、一个指令周期可以完成取指令或者执行指令操作,一个指令周期包括许多CPU周期
由:
t
c
p
u
=
N
c
∗
T
=
I
n
∗
C
P
I
∗
T
tcpu=Nc*T=In*CPI*T
tcpu=Nc∗T=In∗CPI∗T
推导出:
M
I
P
S
=
I
n
t
c
p
u
∗
1
0
6
=
f
C
P
I
∗
1
0
6
MIPS=\frac{In}{tcpu*10^6}=\frac{f}{CPI*10^6}
MIPS=tcpu∗106In=CPI∗106f
1.3冯诺依曼计算机的特点
1、计算机由五大部件组成
2、程序存储。指令和数据以同等地位存储,可以按照地址寻访
3、指令和数据由二进制数表示
4、指令由操作码和地址码(操作数)组成
5、以运算器为中心
1.4计算机的基本组成
1.4.1、计算机硬件的基本组成
1、运算器:参与算术运算或者逻辑运算,字长一般为8、16、32和64位
2、存储器:用来存储数据和程序(指令),分为内存和外存
3、控制器:控制计算机的每个功能部件在特定的时刻执行特定的操作,读取指令和访问操作
控制器的基本任务
(1)按照一定的顺序取指周期和执行周期内取指令、执行指令、指令译码
(2)控制器按照三种方式判别指令字还是数据字。时间维度:取值周期内读出的是指令,执行指令周期读的是数据;空间维度:流向控制器的是指令,流向运算器的是数据;地址寄存器:PC(16位程序计数器)提供地址取出的是指令,AR(数据地址寄存器)提供地址取出的是数据。
4、适配器:俗称接口,用来将外围设备通过系统总线与主机进行连接
5、总线:构成计算机系统的骨架,是多个系统部件之间进行数据传送的公共通路
6、输入输出设备:略
1.4.2、计算机软件的基本组成
1、系统软件:简化使用,提高计算机效率和功能。包括,服务器性程序、语言程序、操作系统和数据库系统
2、应用软件:为解决某些问题编制的程序
1.4.3、固件
功能是软件,形式是硬件,一般是厂商制作
1.5、五层计算机层次结构
二、运算方法和运算器
2.1、 数据与文字的表示
2.1.1、基础知识
信息数据的分类:数值型数据(二进制表示)、字符型数据(01序列表示)
数制
数制间的转换:
其他数制转十进制:按权展开
十进制转其他进制:先转二进制 (整数部分:除以2取余倒序,小数部分,乘以二取整顺序)
2.1.2、定点表示法
2.1.2.1、定点纯整数:主要负责表数范围
例如:32为字长,下标从0开始,那么除去符号位,一共就有31位,在计算最大整数的时候,由于31全是1,再进一位就到32位了,所以,最大数可以表示位2^32-1,其他计算方法以此类推。
2.1.2.2、定点纯小数:主要负责表数的精度
2.1.3、浮点表示法
2.1.3.1、浮点的表示格式
浮点数表示如果不规范会出现以下情况,所以要进行数据规格化。
2.1.3.2、浮点数数据规格化
:规定尾数最高位必须为1
例:
2.1.3.3、具体的IEEE754标准
上面提到的规格化方法只是理论层面,IEEE754是具体标准
规则规定了单精度(32位)和双精度(64位)的基本格式,尾数用原码,指数用移码。S:表示数的符号位,M是尾数,E是阶码8位,采用移码表示
移码:补码的符号位取反
在IEEE754标准中移码有特殊的规定:E=e+127 e=E-127 (8位)
IEEE示数范围:
例:
解析:先将十进制数转化成二进制,再标准化写成1.M*2^阶码的形式。此时,4是e,要写成标准模式E还需要加上127,此数字为正数,所以s为0,将以上写入32位格式就好。
2.1.4、数的机器码表示
1、真值:数的实际值
2、机器码:数值数据在计算机内的编码表示,分为原、反、补和移码 关于补码比原码多出-128以及-1的解释
注:原、补码的表示,注意当x为负时,是将负号带入计算的,所以x表示的是真值。
例如:真值是-0.0011011,负小数的原码是1-X,X是负小数,所以题目就是1-(-0.0011011)即为1.0011011,这才是它的原码,至于补码,是(2+X)(mod2),所以本题是2+(-0.0011011)即为1.1100101,这是它的补码。
2.1.4.1、补码
补码的特征
1、零的表示唯一:原码中,0分别表示为0.0000和1.0000,但在补码中则会向负方向拓展,只用0.0000表示0。
2、补码加减法运算中,符号直接参与运算
3、定点小数多了一个-1=1.0000
补码的意义:
1、使得符号位能与有效值部分参与运算,从而简化运算规则
2、使得减法运算转化为加法运算,进一步简化计算机中运算器的线路设计。
3、雄安出正零负零的干扰,绝对值最大的负数向外拓展一位。
2.1.5、总结
遇到一个十进制转换原、反、补和移码的题,统一计算步骤:
1、忽视正负号,先进行真值转化为二进制数,计算完后加上符号,此时生成真值(-5–>0101–>-0101)
2、若为正数,则原反补不变,移码符号位写1
3、若为负数,求原码时,无论整数小数,最高位添上1符号去掉;求补码时,若为整数,则写为2^n+x,若为小数,则写为2+x,其中,n表示字节长度或者是真值加上符号位后的长度。深度理解,补码其实就是一种“模”的思想,将负数转换为正数的思想。求移码时,将负数的补码符号位变为0。
4、位数不够,整数在前面凑0,小数在后面凑0。
例:真值为(-1111001)
原码:直接符号位加1去除负号,11111001或者 2^n-x n是8
反码:10000110
补码:2^9+(-1111001) 10000111
移码:补码符号位变为0:00000111
2.2、定点加法、减法运算
2.2.1、总结
补码加减法计算流程:
1、将所有的减法化成加法
2、如果题目上给出的是补码形式的【y】,需要【-y】则连同符号位各位取反,末位加1
3、进行相加运算,如果运算结果超出符号位,则去掉最高位。
4、基本判断溢出:若两个正数相加变成负数,则上溢,两个负数相加变成正数则下溢。
5、变形补码法:正数,无论是整数还是小数,最前面加两个0(如+1100–>001100,+0.1000->00.1000;负数,加两个1,然后进行相加,若为00(正数)11(负数)为正确,01为正溢,10为负溢。
6、单符号位法:补码最高位和次高位进位进行异或运算,进行结果和5中一样的判断方式
2.3、定点乘法、除法运算
2.3.1、定点乘法
1、乘法:符号位异或,其他相乘 阵列乘法器
2、除法:符号位异或,其他相除
2.3.1.1、不带符号的定点乘法
使用不带符号位的阵列乘法器实现,直接尾数相乘
例:
2.3.1.2、带符号的定点乘法
例:
注意:不能直接使用补码进行乘法计算,会出现错误的
2.3.2、定点除法
使用并行除法器进行实现
例:
除法中,先把被除数a的补码求出来,再把除数b的正负数补码求出来。先用a减去b(连同符号位也进行计算),也就是加上-b的补码,判断余数。若余数为负数,需要加上b,也就是加上b的补码并且b还要向右移动一位,因为是正数,所以添0
若余数为正数,需要减去b,也就是加上-b的补码,但是因为已经到第二步了,所以需要-b向右移动两位,又因为是负数,所以添上1。以此类推
最后的结果需要满足小数点后第一位是1的标准格式
2.3.5、总结
乘法需要转原码做,除法使用补码做。
1、对于定点数乘法来说
a*b
1、如果进行无符号位的计算,直接到第2步;如果进行有符号位的计算,需要先将符号位异或操作,然后去掉符号位
2、判断a、b是原码还是补码,如果是补码,求补变成原码再进行计算
3、像乘法一样进行运算就行,带进位的,不是与或运算
4、最后需要补码再转化成补码
2、对于定点数除法来说
a/b
1、上来先求a,b,-b补码
2、求a-b,也就是a的补码加上-b的补码
3、看余数,正的,-b补码右移补1,再和余数相加;负的,b补码右移补0,在和余数相加
4、规范化结果
2.4、浮点加减、乘除
2.4.1、浮点数加减法
1、浮点加减法:小阶向大阶对齐,舍入操作详解
2.4.2、浮点数乘除法
2.5、流水线技术
2.5.1、加速比=不用流水耗时/使用流水耗时
2.5.2、效率:流水线占的格子/所有的格子
三、多层次的存储器
3.1、存储器概述
1、存储器分层结构
2、存储的基本单位:存储位元、存储单元、存储器
3、基本概念:
字存储单元(字地址)、字节存储单元(字节地址) 一个字包含若干字节
存取时间:读操作完成,将数据读到数据总线上的时间,取操作和读操作视为相同,称为读取时间
存储周期:指连续两次读操作所需的间隔最小时间,大于存取时间
存储器带宽:单位时间内存储器所存取的信息量
3.2、SRAM 和DRAM存储器
内容 | SROM | DROM |
---|---|---|
存储元 | 锁存器 | MOS管和电容器 |
逻辑结构 | 双译码 | 分时传递地址码 |
有无刷新操作 | 无 | 有(集中式和分散式刷新) |
读取速度 | 快 | 慢 |
容量大小 | 大 | 小 |
读取操作 | 非破坏性存储 | 破坏性存储 |
成本 | 高 | 低 |
3.2.1、存储容量的扩充
1、字存储容量扩充:扩充地址线
2、字长位数扩充:扩展数据线
3.3、只读存储器和闪存存储器
3.3.1、只读存储器(ROM):
掩膜ROM:由生产厂家提供(晶体管)
可编程ROM:由用户后写入内容,有些可以多次写入。一次性编程ROM,光擦除可编程只读存储器(EPROM),电擦除可编程只读存储器(EEPROM)
3.3.2、闪存存储器(FLASH)
固有的非易失性:断电后信息不会丢失
廉价的高密度:
可执行性:闪存存储器和CPU直接相连,大大提高程序和文件访问速度
固态性:闪存存储器是一种低功耗 、高密度半导体器件,便携。
3.4、解决CPU和主存储器速度不匹配问题
3.4.1、并行存储器
1、空间并行–双端口存储器
解释:同一个存储器具有两组相互独立的读写控制电路
解决读写冲突问题:片选控制 (CE),输出驱动控制(OE)
2、时间并行–多体交叉存储器
顺序交叉:
交叉方式:
3.4.2、cache存储器
1、cache功能
介于主存和CPU之间的小容量存储器
存取速度比主存快
一般采用高速的SRAM构成
2、cache的基本原理
CPU和cache之间传输的数据是以字为单位,主存与cache之间传输是以块为单位,块有多个字组成是定长的,CPU读内存的一个字时,便把此字的内存地址同时发送到cache和内存,cache控制逻辑依据地址判断此字是否在cache中,若在此字直接传给CPU,若不在则用主存读周期把此字从内存中读出来送到CPU,于此同时把含有此字的数据块也读出送到cache中。
3、计算公式
ta平均访问时间 tc命中时访问时间 tm未命中时访问时间 h命中概率
(1)计算命中概率
h
=
N
c
(
N
c
+
N
m
)
h= \frac {Nc}{(Nc+Nm)}
h=(Nc+Nm)Nc
(2)计算主存系统平均访问时间
t
a
=
h
∗
t
c
+
(
1
+
h
)
∗
t
m
ta=h*tc+(1+h)*tm
ta=h∗tc+(1+h)∗tm
(3)设r表示主存慢于cache的倍率,e表示访问效率
r
=
t
m
t
c
r=\frac{tm}{tc}
r=tctm
e
=
t
c
t
a
=
t
c
h
∗
t
c
+
(
1
−
h
)
∗
t
m
=
1
h
+
(
1
−
h
)
∗
r
=
1
r
+
(
1
−
r
)
∗
h
e=\frac{tc}{ta}=\frac{tc}{h*tc+(1-h)*tm}=\frac{1}{h+(1-h)*r}=\frac{1}{r+(1-r)*h}
e=tatc=h∗tc+(1−h)∗tmtc=h+(1−h)∗r1=r+(1−r)∗h1
3.4.3、主存与cache的地址映射
问题引入:CPU取字的时候是给出这个字所在的内存地址,然后再将该地址发往cache,用内存的地址访问cache,这时候就需要引入地址映射的概念。
基本概念:下图右侧是内存,左侧是cache,内存和cache的联系就是内存存储的一行数据叫块,cache叫行,两个都指的是同一个数据。内存中,每一块包含若干个字(字包括若干个字节),像下图就包含了16块,每块有8个字,但是存储的时候是按照字的数量计算的,所以内存字的编码需要7位表示。
- 全相联的映射方式
下图中,内存每个块当中的字数量是4个字,所以需要2位表示,那么低两位就表示字地址,高8位就表示块地址。
特点:
1、优点:冲突概率小,cache利用高
2、缺点:比电路实现成本高,需要一个访问速度很快代价高的相联存储器
3、适用场合:小容量cache
- 直接映射方式
下图中,低两位和全相联相同,中间三位是因为cache有8行,所以需要三位进行表示
- 组相联映射方式
相当于全相联和直接映射方法的组合
下图中低两位是字地址,中间是组号,有上图可知cache被分为4组,所以中间组号需要使用2位进行标识,上6位当作tag标识,当找到cache的组的时候,使用tag可以找到行,再根据字地址找到需要的字。
例:
3.4.5、替换策略
读操作策略问题引入:接着映射说,如果cache满了怎么办,cache中想要替换行怎么解决?
常用策略:
1、LFU(最不常用)被访问的行计数器增加1,换值小的行,不能反映近期cache的访问情况
2、LRU(近期最少使用)被访问的行计数器置0,其他的计数器增加1,换值天的行,符合cache的工作原理
3、随机替换:硬件上容易实现,且速度也比前两种策略快;随意换出的数据很可能马上又要使用,从而降低命中率和cache工作效率;这个不足随着cache容量增大而减小。随机替换策略的功效只是稍逊于前两种策略。
写操作策略问题引入:前面讲的是cache作用多用的是CPU从内存读数据的情形,如果CPU要给内存写数据是什么情况。
常用策略:
1、写回法:换出时,对行的修改位进行判断,决定是写回还是舍掉
2、全写法:写命中时,cache与内存一起写
3、写一次法:与写回法一致,但是第一次cache命中时采用全写法
3.4.4、虚拟存储器
问题引入:什么是实地址、虚地址?
有时候用户运行的程序大于主存,怎么办呢?只能设置虚拟空间。以页式虚存空间表示,基本思想就是开辟出一大片可以存放要运行的虚拟空间,让用户感觉到内存很大,其实仅仅把进程的一部分分页放在在主存中,页表项中注明页是在主存中还是在辅存中,当访问的页不在主存中时根据页表项的指引,从辅存中调入主存,淘汰主存中若干页。
虚拟存储器机制:
1、页式存储:内存中有内页表(虚地址到主存物理地址的变换表)外页表(虚地址与辅存地址之间的变换)
2、段式存储:段表,容易出现外碎片
3、段页式存储
替换算法:
LRU最近最久未使用算法:
OPT最佳置换算法:
FIFO先进先出置换算法
四、指令系统
4.1、指令系统的发展与性能要求
4.1.1、为什么要有指令系统
程序存储思想;
计算机工作过程是各功能部件按照预先设计的操作步骤执行数据流动、完成数据加工的过程;
计算机程序是由一系列的机器指令组成的;
4.1.2、指令的地位
1、软硬件分界面的一个主要标志:硬件设计人员实现、软件设计人员应用。
2、软硬件人员的沟通桥梁
4.1.3、指令系统基本概念
1、指令:要计算机执行某种操作的命令
2、微指令:微程序级的命令,属于硬件
3、宏指令:由若干条机器指令组成的软件指令,属于软件(高级语言代码)
4、机器指令:介于微指令和宏指令之间,每一条指令可以完成一个独立的算术运算和逻辑运算操作
5、指令系统:一台计算机中所有类型的机器指令的集合称为这台计算机的指令系统
4.1.4、发展情况
1、复杂指令系统计算机(CISC):超大规模集成电路技术(VLSI)的发展使得硬件及指令变得复杂,研发成本高,采用大量硬件实现了使用频率很低的指令,浪费资源。
2、精简指令系统计算机(RISC):精简了指令,使得VLSI更容易实现
4.1.5、对指令系统的要求
1、完备性:常用的基本指令已经定义好
2、有效性:利用该指令系统所编写的程序能够高效率运行
3、规整性:对称性(所有指令都可以使用寄存器或者存储器的寻址方式)、匀齐性(一种指令可以支持各种数据类型)
4、兼容性:系列机包含多个机种,各机种上基本软件可以通用
4.1.6、计算机语言与硬件结构的关系
指令系统操作硬件–>指令系统基础上产生机器语言—>机器语言的助记符是汇编语言—>汇编语言是高级语言的基础
4.2、指令格式
4.2.1、基本概念
1、基本信息:做什么操作、需要操作数从哪里取、结果送到哪里、下一条指令从哪里取
2、影响计算机指令长度的因素:操作码的长度、操作数地址的长度、操作码地址的个数
3、影响计算机指令格式的因素:机器的字长、存储器的容量、指令的功能
4、指令字:就是指令,表示一条指令的机器字
4.2.2、操作码(OP)
1、等长操作码:冗余
2、变长操作码:哈夫曼树
4.2.3、地址码
1、三地址指令、二地址指令、单地址指令和零地址指令
2、其中二地址码可分为
例:
解析:先看有几行,这个指令有1行,那就是单字长,再看看有几个地址码,有两个寄存器,那就说明是二地址,并且还是RR指令类型的。
例:
解析:有两行,说明是双字长,有一个源寄存器+变址寄存器和位移量,后面两个组成了存储器,所以还是RS类型的存储器
4.2.4、指令字长度
1、区别:指令字长度(指令包含的位数)和机器字长度(计算机能直接处理的位数)不同
2、分类:单字长指令(指令字长=机器字长)、半字长指令、双字长指令
注:一个指令系统中可以出现等长的指令也可以出现不等长的指令,等长结构简单操作方便,变长结构灵活控制复杂。
4.2.5、指令助记符
4.3、操作数类型
问题引入:操作码有很多的操作对象,这些对象有着不同的操作数类型
分类:地址数据、数值数据、字符数据、逻辑数据
4.4、指令和数据的寻址方式
问题引入:还记得指令的基本信息么,作什么操作、操作数从哪里取、结果送到哪里、下一条指令从哪里取。上面大概解释了指令如何组成,这一节就需要解决,操作数从哪里取,下一条指令从哪里取。
4.4.1、指令寻址
顺序寻址(PC:程序计数器)跳跃寻址
因为涉及到的指令寻址是对下一条指令的寻址,所以比较简单
4.4.2、操作数(数据)寻址
指令中
- 立即寻址:用于赋初值、定义常量
寄存器中
- 隐含寻址
- 寄存器寻址:比内存块、寄存器数量少地址码短可用空间少
- 寄存器间接寻址:操作数在主存里,操作数的地址放在寄存器里,使用较为广泛
- 堆栈寻址 :隐含的堆栈提示器,进栈加1,退栈减1。详细解释
主存储器中
- 直接寻址:地址A就是操作数的有效地址
- 间接寻址:用于形参实参、传值、传地址
- 偏移寻址–相对偏移:EA=PC+D
- 偏移寻址–基址寻址:EA=Rb+D
- 偏移寻址–变值寻址
- 段寻址:用于段式或者段页式虚拟存储器的实现
4.5、典型指令
4.5.1、数据传送类指令
1、一般传送指令:MOV AX BX
2、数据交换指令:XCHG
3、堆栈操作指令:PUSH POP
4.5.2、运算类指令
1、加减乘除
2、逻辑运算指令
3、移位指令