计算机组成
1、计算机系统概述
1.1 计算机系统层次结构
计算机系统由硬件系统和软件系统构成。
1.1.1 计算机硬件
冯诺依曼机基本思想:【存储程序】将事先编制好的程序和数据送入主存,程序启动后,计算机会自动逐条执行指令,直至程序执行结束。
功能部件:
- 输入设备
- 输出设备
- 存储器
- 分为主存(内存)和辅存(外存)
- 主存包含地址寄存器(MAR),通过地址译码寻找存储单元;数据存储器(MDR)用于暂存从存储器中读写的数据。
- 运算器:核心是算数逻辑单元(ALU)。包含累加器(ACC)、乘商寄存器(MQ)、操作数寄存器(X)等寄存器。
- 控制器:由程序计数器(PC)、指令寄存器(IR)、控制单元(CU)组成。
中央处理器(CPU):运算器+控制器
主机:CPU+主存
外部设备:除主机外的硬件(外存、IO设备等)
CPU区分指令和数据是依据指令周期的不同阶段,取指阶段取出的是指令,执行阶段取出的是数据。
CPU的寄存器中:指令寄存器对用户(程序员)完全透明,PC、通用寄存器、状态寄存器不透明。
1.1.2 计算机软件
按功能分:
- 系统软件:操作系统(OS)、数据库管理系统(DBMS)(注意不是数据库系统,DBMS是数据库系统的一部分)、分布式软件系统、网络软件系统、标准库程序、服务性程序(如连接程序)等。
- 应用软件
三个级别的语言:机器语言、汇编语言、高级语言
翻译程序:
- 汇编程序:汇编语言到机器语言
- 解释程序:源程序按执行顺序逐条翻译成机器指令并立刻执行
- 编译程序:高级语言到目标语言(机器语言或汇编语言)
1.1.3 计算机系统的层次结构
- 微程序机器层:硬件
- 传统机器语言层
- 操作系统层
- 汇编语言层
- 高级语言层
硬件和软件之间的界面就是指令集体系结构(ISA)。
1.1.4 计算机系统的工作原理
“存储程序”工作方式:取指(PC→MAR→M→MDR→IR)、译码(OP(IR)→CU)、执行(Ad(IR)→MAR→M→MDR→ACC)、结果送回
从源程序到可执行文件:预处理、编译、汇编、链接
1.2 计算机的性能指标
机器字长(简称:字、字长):CPU内部整数运算数据通路的宽度、通用寄存器的宽度
指令字长:一条指令的二进制长度
存储字长:一个存储单元存储的二进制长度(以上三个的长度都是字节的整数倍)
数据通路带宽:外部数据总线的宽度(与CPU内部的数据总线宽度可能不同)
主存容量:MAR位数反映存储单元个数,MDR位数反映存储单元字长
运算速度
吞吐量:单位时间处理请求的数量,主要取决于主存的存取周期
响应时间:发起请求到得到结果的时间
CPU时钟周期:最小时间单位
指令周期:执行一条指令的时间(包括取指到结果送回的整个过程)
CPU周期(机器周期):指令的各个阶段所需的时间(如取指的时间),多个CPU周期组成指令周期,一个CPU周期由多个时钟周期组成
主频:CPU时钟周期的倒数
CPI(cycle per instruction):一条指令所需的时钟周期数
CPU执行时间:运行一个程序所花费的时间 \[ CPU\text{执行时间}=\frac{\text{时钟周期数}}{\text{主频}}=\frac{\text{指令条数}\times CPI}{\text{主频}} \] 等于时钟周期数/主频,时钟周期数又等于指令条数×CPI
MIPS(million instruction per second):每秒执行多少百万条指令 \[ MIPS=\frac{\text{指令条数}}{\text{执行时间}\times10^6} \]
MFLOPS(million floating-point operations per second):每秒执行多少百万次浮点运算。还有GFLOPS、TFLOPS、PFLOPS、EFLOPS、ZFLOPS等。是用于科学计算的计算机最有用的参数。
一些术语:
- 系列机:相同基本指令系统的不同型号计算机。
- 兼容:软件或硬件的通用性。
- 固件:将程序固化在ROM中,软硬件的结合
2、数据的表示和运算
2.1 数制与编码
2.1.1 进制转换
十进制转二进制(整数):除基取余法。依次除以2,倒着取余数。
十进制转二进制(小数):乘基取整法。依次乘2,整数部分为几就取几,正着取。
真值:实际值。
机器数:计算机中的编码,将符号融入编码中了。包括原码、反码、补码等。
2.1.2 BCD码
二进制编码的十进制数,4位二进制表示一个十进制数。如8421码、余3码、2421码。
2.1.3 定点数的编码表示
定点小数:纯小数,小数点在符号位后。x0.x1x2x3
,x0是符号位。
定点整数:纯整数,小数点在最低位后。x0x1x2x3
,x0是符号位。
原码:第一位是符号位,0正1负。后面的位表示绝对值。(范围对称,0不唯一)
反码:正数和原码一样,负数是原码的正数取反。如4位反码-3
:3的原码是0011,-3的反码为1100。(范围对称,0不唯一)
补码:正数和原码一样,负数是原码的正数取反加1,由负数的补码得到其正数也是取反加1。补码1111
各位的权值是-8 4 2 1
。(负数多一个,0唯一)
移码:相当于把数轴往负方向移了一段。比如n位二进制,就要往负方向移\(2^{n-1}\)。移码与补码仅差一个符号位。(负数多一个,0唯一)
2.2 运算方法和运算电路
2.2.1 基本运算部件
一位全加器:
加数\(A_i\)、\(B_i\),进位\(C_{i-1}\)
和的表达:\(S_i=A_i\oplus B_i\oplus C_{i-1}\)
进位的表达:\(C_i=A_iB_i+(A_i\oplus B_i)C_{i-1}\)
串行进位加法器:多个一位全加器串起来。
并行进位加法器:
- 令进位产生函数\(G_i=A_iB_i\),进位传递函数\(P_i=A_i\oplus Bi\)
- 上面的进位可以表达为:\(C_i=G_i+P_iC_{i-1}\)
- 不断迭代上述公式可得第n位的进位,这样进位就能直接得出,不用串行传递。称为全先行进位加法器。如果位数很多,公式迭代非常复杂,通常采用多级先行进位加法器,结合先行进位和串行进位。
加法器的标志
- 符号标志(SF):等于最高位。
- 零标志(ZF):所有位为0才置1。
- 溢出标志(OF):仅对于有符号数有用,\(OF=C_n\oplus
C_{n-1}\),等于符号位的进位和最高位的进位取异或。
- 正数+正数:如果\(C_{n-1}\)为1,符号位变为1,说明溢出(正数+正数变成负数了)。
- 正数+负数:一定不会溢出,\(C_n\)和\(C_{n-1}\)要么都0要么都1。
- 负数+负数:\(C_n\)一定为1,如果\(C_{n-1}\)为0,说明负数+负数变成正数了,溢出。
- 进位/借位标志(CF):仅对于无符号数有用,\(CF=C_n\oplus
C_0\),等于符号位的进位和最低位前的进位取异或。
- 无符号+无符号:\(C_0=0\),就是无符号的溢出标志。
- 无符号-无符号:\(C_0=1\),因为减数要取反加1,加的1就是从\(C_0\)传来的。当最高位无进位时\(C_n=0\),说明减数大(推理有些复杂),此时减不过,相当于借位了。
算术逻辑单元(ALU):就是结合了算术运算和逻辑运算,有一些标志,有多路选择器(MUX)
2.2.2 定点数的移位运算
逻辑移位:啥都不用管,直接移,添0。
算术移位
- 正数的原码、反码、补码都一样:移的时候添0。
- 负数
- 原码:符号位不变,左移右移都添0
- 反码:和原码相反,符号位不变,左移右移都添1
- 补码:右移添1,左移添0。最高位是10的话再左移就溢出了。
循环移位:要区别带不带进位(CF)位。
不带进位位的循环右移:最低位要移到最高位和CF。
不带进位位的循环左移:最高位要移到最低位和CF。
带进位位的循环左/右移:将CF也加到循环中。
2.2.3 定点数的加减
补码的加减直接做就行。
溢出的判别
一位符号位:符号相同相加和符号相异相减才可能溢出,减法也是加法,所以看两个相同符号的数相加是否符号变了,\(V=A_sB_s\overline{S_s}+\overline{A_sB_s}S_s\),字母分别表示两个数和结果的符号。
双符号位:也称模4补码,就是把一个数的符号位多复制一位再相加,看结果的双符号。双符号位的各种情况:
- 00:正数
- 01:正溢出
- 10:负溢出
- 11:负数
模4补码:虽然有两个符号位,但是存储的时候还是只有一个符号位,运算的时候才复制一份符号位。
双符号位的移位操作:只有低符号位需要移,用来判断溢出;高符号代表真正的符号。
采用进位:即上面的OF标志
2.2.4 定点数的乘除运算
原码不恢复余数法(原码加减交替法)中,余数为正商1,为负商0.
补码不恢复余数除法(补码加减交替法)中,异号相除时,够减商0,不够减商1。
2.2.5 数据的存储和排列
最低有效字节(LSB):数的低位
最高有效字节(MSB):数的高位
大端方式:正常理解的方式。
小端方式:低位放低地址。
边界对齐方式:(比如一个字4字节)半字的地址一定是偶数,字的地址一定是4的整数倍。
边界不对齐方式:挨着放。
2.3 浮点数的表示和运算
2.3.1. 浮点数的表示
分为数符、阶码、尾数。
基数:阶码表示基数的次方。一般基数为2。
上溢:绝对值太大了。分为正上溢和负上溢。上溢需要处理。
下溢:绝对值太小了,太接近0了。分为正下溢和负下溢。下溢当成0就可以了。
浮点数的规格化:目的是让尾数的最高位是有效值。
- 左规:即\(\pm0.0\cdots01xxx\)的形式,每次尾数左移一位,阶码减1。可能需要多次。
- 右规:即\(1.xxx\)的形式,尾数右移一位,阶码加1。只需要一次。
- 原码:
- 正数规范化形式:\(0.1xxx\)(小数点前是符号位)
- 负数规范化形式:\(1.1xxx\)
- 补码:
- 正数规范化形式:同原码
- 负数规范化形式:\(1.0xxx\)(如果是1.1的话还可以左移)
IEEE 754标准
类型 | 总位数 | 数符S | 阶码E | 尾数M | 偏置 | 真值 |
---|---|---|---|---|---|---|
单精度 | 32 | 1 | 8 | 23 | 127 | \((-1)^S\times1.M\times2^{E-127}\) |
双精度 | 64 | 1 | 11 | 52 | 1023 | \((-1)^S\times1.M\times2^{E-1023}\) |
规格化的二进制浮点数最高位总是1,将这个1隐藏(隐藏位),所以比如单精度尾数23位却能表达24位有效数字(具体见上面的公式)。
数符 | 阶码 | 尾数 | 意义 |
---|---|---|---|
0 | 0 | 0 | +0 |
1 | 0 | 0 | -0 |
0 | 全1 | 0 | 正无穷 |
1 | 全1 | 0 | 负无穷 |
* | 全0 | 非0 | 非规格化小数,此时隐藏位是0,阶码固定为-126。 如尾数第1位为1其余为0,表示\(0.1\times2^{-126}=2^{-127}\) |
* | 全1 | 非0 | NaN |
2.3.2 浮点数的加减运算
- 对阶:阶数小的要向大的对齐,尾数相应位移(右移时可能会影响精度,要舍入)。对阶时阶码只可能增大(因为是小对大)。
- 尾数求和
- 对尾数进行规格化处理:右规要考虑舍入。
- 舍入:对阶和尾数右规时要舍入。如:0舍1入、恒置1法、截断法。
- 溢出判断:溢出是看阶码是否溢出,不是尾数(尾数溢出可以靠阶码解决)
C语言中的转换
\(char\to int\to long\to double\)和\(float\to double\)没有精度损失。
特别注意:float尾数23位,double尾数52位,所以比较小的int转换为float是不会损失精度的,所有的int转double都不会损失精度。
3、存储系统
3.1 存储器概述
存储器的分类
- 按作用(层次)分类
- 主存储器(内存)
- 辅助存储器(外存)
- 高速缓冲存储器(Cache)
- 按存取方式分类
- 随机存储器(RAM)
- 只读存储器(ROM)
- 串行访问存储器
- 顺序存取存储器(SAM):如磁带
- 直接存取存储器(DAM):介于随机访问和串行访问之间,如磁盘、光盘(注意CD-ROM不是ROM)
- 按信息可保存性分离
- 易失性存储器:RAM
- 非易失性存储器:ROM、磁表面存储器、光存储器
存储器的性能指标
- 存储容量:存储字数(地址空间大小)×字长(一次存取的数据量)
- 存储速度
- 存取时间:启动到读/写完的时间
- 存取周期(读写周期、访问周期):连续两次读/写之间的时间,=存取时间+恢复时间
- 主存带宽(数据传输率):数据宽度/存取周期
多级存储系统
CPU、Cache、主存可以互相交换信息,辅存只能与主存交换信息。
主存和Cache之间数据调动由硬件完成;主存和辅存之间数据调动由硬件和操作系统完成。
相联存储器:按内容或地址寻址。价格贵,一般用于TLB、相联Cache。
3.2 主存储器
3.2.1 SRAM和DRAM
静态随机存储器(SRAM) | 动态随机存储器(DRAM) | |
---|---|---|
元件 | 触发器,集成低 | 电容,集成高 |
破坏性读出 | 非 | 是 |
需要刷新 | 否 | 是 |
运送地址 | 一次性 | 分两次送 |
引脚 (做题做出来的,看看就够了) |
地址线+数据线+1根片选+2根读写控制 | 地址线(一半)+数据线+2根行列通选+2根读写控制 |
DRAM刷新对CPU透明,刷新以行为单位,刷新操作类似于读。
- 集中刷新:在一段固定的时间,依次刷新所有行。有死时间(死区)。
- 分散刷新:每个存取周期,前半部分正常读写,后半部分刷新。无死时间。
- 异步刷新:最大刷新时间间隔(如2ms)内必须刷新所有行(如256行),所以两次刷新的时间间隔为\(t=\frac{2ms}{256}\)。结合前两种,死区短。
内部结构:存储体(存储矩阵)、地址译码器、IO控制电路、片选信号(选中某一芯片)、读/写控制信号
编址单位:具有相同地址的存储元件。如按字节编址,即一个地址表示8位。
同步动态随机存储器(SDRAM):属于DRAM。
3.2.2 只读存储器(ROM)
- 掩模式只读存储器(MROM):生产时写入,无法修改。
- 一次可编程只读存储器(PROM)
- 可擦除可编程只读存储器(EPROM):可以多次改写,但编程次数有限且写入时间长。
- Flash存储器:(发展自EPROM和E²PROM)不加电能长期保存信息,可快速擦除和重写。U盘。半导体存储器,MOS管。读速度大于写(写前要擦除)。
- 固态硬盘(SSD):同Flash,“大U盘”
3.2.3 多模块存储器
- 单体多字存储器:每个存储单元存储m个字,一次并行读出m个字。
- 多体并行存储器
- 高位交叉编址:低位表示每一个模块(芯片)内的地址,高位(体号)片选模块。仍是串行存取。
- 低位交叉编址:交叉存储器。存取周期为T,总线传送周期为r,存储器模块数大于等于\(m=\frac{T}{r}\)就可以实现流水线存取(取一个还是需要T,但是由于流水线工作,带宽提高了),m称为交叉存取度。连续存取m个字的时间为\(T+(m-1)r\)。如四体低位交叉存储器,有4个模块,存取周期为T,总线周期为T/4。能满足程序的局部性原理(低位交叉编址能流水线依次读取,高位交叉编址和正常的一样没有进步)
3.3 主存储器与CPU连接
数据总线、地址总线、控制总线
地址总线决定可寻址最大空间。数据传输率=数据总线位数×频率
- 位扩展:扩展字长。每个芯片的地址、片选、读写控制并联,数据分别引出。
- 字扩展:增加字的数量。每个芯片地址、数据、读写控制并联,片选信号不同。
- 字位同时扩展
存储芯片的片选:线选法(类似独热,选中地址线位0的芯片)、译码片选法
一些信号(上划线表示低电平有效):读控制\(\overline{RD}\)、写控制\(\overline{WE}\)、片选\(\overline{CS}\)、CPU访存控制信号\(\overline{MREQ}\)(连\(\overline{CS}\))
3.4 外部存储器
磁盘存储器
组成:磁盘驱动器(磁头盘片组件)、磁盘控制器(和主机的接口)、盘片
存储区域:一块硬盘有若干记录面,每个记录面有若干磁道,每条磁道有若干扇区。扇区(块)是最小读写单位,扇区包含数据、地址、校验信息。
- 磁头数:等于记录面数
- 柱面数:等于磁道数。
- 扇区数
性能指标
- 记录密度
- 道密度:沿半径单位长度磁道数。
- 位密度:磁道单位长度记录的二进制位数。
- 面密度:上面两个的乘积。
- 容量:非格式化的容量>格式化的容量
- 平均存取时间:寻道时间(一般题目会给)+旋转延迟时间(旋转一圈时间的一半)+传输时间
- 数据传输率:转速×磁道容量(字节)
磁盘地址:驱动器号+柱面号+盘面号+扇区号
独立冗余磁盘阵列(RAID):RAID0没有容错能力,RAID1~RAID5有镜像或奇偶校验
固态硬盘
闪存技术,“大U盘”。由闪存芯片、闪存翻译层(有平均擦除逻辑)组成。
一个闪存由多个块组成,块由多个页组成。数据以页为单位读写。
3.5 高速缓冲存储器
3.5.1 Cache基本原理
Cache和主存都被划分为相等的块(Cathe块也称Cache行)。
访存过程:
- 根据块号/组号,查看块/组中的标记位(Tag)是否相同
- 如果标记位相同且有效位为1,则命中,从Cache读出
- 否则从主存中取出数据送往CPU和Cache对应块中,并填写标记位和有效位
Cache的总容量包括:存储容量、标记阵列容量(标记位、有效位、脏位等)
易错:Cache里为空时,往里装数据也算未命中。
3.5.2 Cache和主存映射方式
直接映射
主存中每一块只能装入唯一位置。
地址结构:标记+Cache块号+块内地址,Cache块号=主存块号%Cache块数
冲突概率最高,空间利用率最低。
全相联映射
主存中每一块可以装入任何位置。
地址结构:标记+块内地址
空间利用率最高,命中率最高,比较速度慢。
组相联映射
主存中每一块装入唯一一组。每组r个Cache块称为r路组相联。
地址结构:标记+Cache组号+块内地址,Cache组号=主存块号%Cache组数
3.5.3 替换算法
随机算法(RAND):没有依据程序局部性原理。
先进先出算法(FIFO):没有依据程序局部性原理。
最不经常使用算法(LFU):每行有计数值,命中加1,替换计数值最小的。
近期最少使用算法(LRU,Least Recently Used):下图阴影表示计数器:
- 命中时,命中的行计数器置零,比其低的计数器加一
- 未命中时,如果没有空闲行则替换计数器值最大的,将新行的计数器置零,其余加一
3.5.4 Cache写策略
- Cache写命中
- 全写法:数据同时写入Cache和主存(随时同步)
- 回写法:块被换出时才写回。需要修改位(脏位)。
- Cache写不命中
- 写分配法:写主存时也将这个块装入Cache(常与回写法合用)
- 非写分配法:只写主存(常与全写法合用)
指令Cache和数据Cache分离:减少指令流水线资源冲突(避免从同一Cache读指令引发冲突)
3.6 虚拟存储器
- 虚地址、逻辑地址、虚拟空间(程序空间)
- 实地址、物理地址、实地址空间
虚拟存储机制采用全相联映射、写回法。
3.6.1 页式虚拟存储器
以页为基本单位,虚拟空间与主存空间都被划分为同样大小的页。
主存的页:实页、页框;虚存的页:虚页。
页表
- 有效位(装入位):为1表示虚拟页已调入主存,此时页表项存放物理页号;为0表示没有调入主存,此时页表项可以存放该页的磁盘地址
- 脏位
- 引用位:实现替换策略
- 标记位:虚页号
- 物理页号(或磁盘地址)
快表(TLB)
存放页表项的高速缓存。主存中的页表称为慢表。TLB也可以使用Cache中的几种映射方式。快表使用高速相联存储器,它的快速来源于硬件本身;慢表依赖查找算法。
TLB命中则页表一定命中。
- 标记位:虚页号
- 物理页号
- 有效位(装入位)
3.6.2 段式虚拟存储器
虚拟地址分为:段号、段内地址
虚实转化通过段表实现,每行包括:段号、有效位、段起点、段长
优点:段的分界与程序的分界对应、逻辑独立性、便于多道程序共享
缺点:长度可变,易留下碎片
3.6.3 段页式虚拟存储器
先分段,每段再分页,主存空间也划分为大小相等的页。
虚拟地址分为:段号、段内页号、页内地址
3.6.4 虚拟存储与Cache比较
- Cache主要解决速度;虚拟存储主要解决容量
- Cache全由硬件实现;虚拟存储由OS和硬件共同完成
4、指令系统
4.1 指令系统
指令体系结构(ISA):指令格式、数据格式、操作数存放、寄存器个数、存储空间的大小和编址、寻址方式等。
4.2 寻址方式
- 隐含寻址:如规定某一个操作数来自ACC
- 立即寻址:立即数
- 直接寻址
- 间接寻址:可以一次、多次
- 寄存器寻址:寄存器编号
- 寄存器间接寻址
- 相对寻址:PC+地址。指令提供的地址是以下一条指令在内存中的地址为基准位置的偏移量(因为取指之后PC自增)
- 基址寻址:基址寄存器(BR)+地址,基址寄存器的内容由操作系统或管理程序确定
- 变址寻址:变址寄存器(IX)+地址,变址寄存器的内容由用户指定(基址和变址寄存器可以是专用寄存器或通用寄存器)
4.3 CISC和RISC
CISC(复杂指令系统计算机,complex):指令复杂,条数多,字长不固定,访存指令多,指令执行时间相差大,使用频率相差大,通用寄存器少,难以优化,多微程序控制,可以流水线
RISC(精简指令系统计算机,reduced):指令简单,条数少,字长固定,只有Load/Store能访存,大多一个周期内完成,都很常用,通用寄存器多,易优化,多组合逻辑控制,必须流水线
5、中央处理器
5.1 CPU的功能和基本结构
- 运算器:ALU、暂存寄存器、ACC、通用寄存器、程序状态字寄存器(PSW)(溢出进位等)、移位器、计数器(CT)
- 控制器:PC、指令寄存器(IR)、指令译码器、存储器地址寄存器(MAR)、存储器数据寄存器(MDR)、时序系统、微操作信号发生器
用户可见寄存器(不透明):PC、通用寄存器、PSW、基址寄存器
用户不可见寄存器(透明):IR、MAR、MDR等
PC的位数取决于存储器容量;IR的位数取决于指令字长;通用寄存器的位数取决于机器字长。
注意:地址译码器是存储器里的。
5.2 指令执行过程
指令周期:取出并执行一条指令的时间
机器周期(CPU周期):一般等于存储周期。每个指令的机器周期数可以不相等
时钟周期(节拍、T周期):每个机器周期的时钟周期数可以不相等
一个指令周期包含多个机器周期,一个机器周期包含多个时钟周期。
一个指令周期包括:取指周期、间址周期(对于间接寻址)、执行周期、中断周期(每条指令结束前查询是否中断请求)
指令执行方案:
- 单指令周期:所有指令执行时间相同,串行,周期长短取决于执行时间最长的指令
- 多指令周期:不同指令执行时间可以不同,串行
- 流水线
取指操作后,PC已经自增了,所以存的是下一条指令的地址。
取指操作是控制器自动进行的,不需要指示。
为了硬件设计方便,指令字长通常为存储字长的整数倍(不是相等)。
计算机区分是指令还是数据是根据指令周期的不同阶段。
如果存储字长等于指令字长,则取指周期也可视为机器周期。
5.3 数据通路
数据通路:数据传送的路径和流经的部件。包括ALU、通用寄存器、PSW、异常和中断逻辑等,不包括控制部件。
数据通路基本结构:
- CPU内部单总线方式:所以寄存器的输入输出端都连接到一条公共的总线上。
- CPU内部多总线方式
- 专用数据通路方式:性能高,硬件量大
看一个题就懂了:
5.4 硬布线控制器
控制单元(CU)的输入:操作码译码电路、节拍发生器(时钟)、状态标志。还有控制总线上的,比如中断请求、DMA请求。
CPU控制方式:同步控制方式(所有控制信号均来自统一的时钟信号)、异步控制方式(各部件速度不同)、联合控制方式(结合上面两个)
*微程序控制器:一条指令对应一个微程序,一个微程序有若干微指令(可以理解为5.3图中的不同阶段),一个微指令对应一个或多个微命令(可以理解为5.3图中不同阶段的不同控制信号),微命令的执行过程叫微操作。
5.5 异常和中断
- 异常(内中断):由CPU内部产生
- 故障(Fault):非法操作码、缺页缺段、除0。可以解决的话回到断点继续执行(如缺页),否则终止执行
- 自陷(Trap):调试(断点设置、单步跟踪)、系统调用、条件自陷指令。返回到自陷指令的下一条执行(自陷指令是转移指令的话除外)
- 终止(Abort):控制器出错、存储器校验错、总线错误
- 中断(外中断):来自CPU外部
- 可屏蔽中断:通过可屏蔽中断请求线INTR发出
- 不可屏蔽中断:通过不可屏蔽中断请求线NMI发出
软件中断:故障、自陷
硬件中断:终止、中断
异常和中断响应过程:(参见7.3.2,这里不准确)
- 关中断
- 保存断点和程序状态
- 识别异常和中断并转到处理程序
- 软件识别:用CPU中的异常状态寄存器
- 硬件识别(向量中断):根据中断类型找中断向量(异常/中断处理程序首地址)
Cache缺失无需处理,由硬件自动完成
DMA请求是请求总线的使用权,不影响指令的执行(不会进入中断处理程序然后恢复)
5.6 指令流水线
流水线是时间并行。
5.6.1 流水线基本实现
5.6.2 流水线冒险与处理
结构冒险:取指和访存都要使用存储器。解决:单独设置数据存储器和指令存储器
数据冒险
- 写后读(RAW):当前指令还没有写,下一条指令就读了。(不转发的话至少要间隔三周期)
- 读后写(WAR):当前指令还没读,下一条指令先写了。基本流水线不会出现这种情况。
- 写后写(WAW):下一条指令先写了。如果有乘法这种需要很多周期的指令可能会发生。
解决方法:硬件阻塞/软件插入nop、转发(数据旁路)、编译优化
控制冒险:转移、调用、返回指令。解决:分支预测、加快形成条件码
5.6.3 性能指标
吞吐率:k段流水线在\(k+n-1\)个周期完成n个任务,每个周期\(\Delta t\): \[ TP=\frac{n}{(k+n-1)\Delta t} \]
加速比:不使用流水线/使用流水线的时间(大于1)。不使用流水线/k段流水线: \[ S=\frac{kn\Delta t}{(k+n-1)\Delta t}=\frac{kn}{k+n-1} \]
5.6.4 高级流水线技术
- 超标量流水线技术(动态多发射):每个周期发射多条指令(每周期发射n条称为度为n)。(类似多条流水线)
- 超长指令字技术(静态多发射):将多条能并行的指令字合起来
- 超流水线技术:流水线划分成更多段
静态流水线:上下段连接方式固定。动态流水线:上下段连接方式可变。
6、总线
6.1 总线概述
总线:能为多个部件分时、共享的公共信息传送链路。
主设备:获得总线控制权的设备。从设备:被主设备访问的设备。
6.1.1 总线分类
按功能分:
- 内部总线(片内总线):CPU内部
- 局部总线:将一些高速外设从ISA总线卸下,移到CPU上。如:PCI、AGP、PCI-E、VESA
- 系统总线:连接CPU、主存、IO。如ISA、EISA
- 数据总线:双向。位数与机器字长、存储字长有关。
- 地址总线:单向。位数与主存地址空间大小有关。
- 控制总线
- 外部总线:讲得比较迷,连接IO设备(IO总线)和计算机系统之间(通信总线)。有的又说通信总线是外部总线。
按时序控制方式:同步总线、异步总线
按数据传输格式:并行总线、串行总线
6.1.2 系统总线的结构
- 单总线结构:所有东西都连到系统总线上
- 双总线结构:一条主存总线(CPU、主存、通道),一条IO总线(通道、外设)
- 三总线结构:主存总线、IO总线、DMA总线
6.1.3 常见总线标准
系统总线 | 说明 | 局部总线 | 说明 | 外部总线 | 说明 |
---|---|---|---|---|---|
ISA | 并行 | VESA | 多媒体,并行 | RS-232C | 串行 |
EISA | 并行 | PCI | 并行 | USB | 串行 |
AGP | 视频接口,并行 | PCMCIA | 并行 | ||
PCI-E | 取代PCI和AGP,串行 | IDE | 并行 | ||
SCSI | 并行 | ||||
SATA | 串行 |
6.1.4 性能指标
- 传输周期:包括申请、寻址、传输、结束整个阶段的时间。
- (工作)频率:上一个的倒数
- 时钟周期
- 时钟频率:上一个的倒数
- 宽度:同时传输数据位数,数据总线的根数
- 信号线数:数据、地址、控制总线的总数
\[ \text{总线带宽}=\text{宽度}\times\text{工作频率} \]
总线只能有一个发送,可以多个接收。一对一、一对多。
采用局部总线可以节省系统总带宽。
中断类型号在数据总线上传输。
6.2 总线事物和定时
总线事物
- 请求阶段
- 仲裁阶段
- 寻址阶段
- 传输阶段
- 释放阶段
突发(猝发)传送方式:进行连续的数据传送。寻址阶段发送首地址,传输阶段传输多个连续数据。
定时
- 同步定时方式:发送方接收方采用统一的时钟信号。适用于总线长度较短、所接部件存取时间接近的系统。
- 异步定时方式:速度比同步慢,可以用于速度相差大的部件。
- 不互锁:主设备请求信号经过一段时间撤销;从设备收到请求信号后发回答信号,一段时间后撤销。最快。
- 半互锁:主设备收到回答信号后才撤销请求信号。
- 全互锁:主设备收到回答信号后才撤销请求信号,从设备获知主设备请求信号撤回之后才撤回。最慢。
不同速度的设备,同步和异步方式都可以,只是同步不能发挥出性能。
- 半同步通信总线:既有时钟控制采样,又能连接速度相差大的设备。
总线的仲裁方式
集中仲裁方式:将所有的总线请求集中起来,利用一个特定的裁决算法进行裁决,基本由 CPU 进行处理
分布仲裁方式:不需要中央仲裁器,每个潜在的主模块都有自己的仲裁号和仲裁器。当它们有总线请求时,就会把它们各自唯一的仲裁号发送到共享的仲裁总线上,每个仲裁器从仲裁总线上得到的仲裁号与自己的仲裁号比较。若仲裁总线上的仲裁号优先级高,则它的总线请求不予响应,并撤销它的仲裁号。最后,获胜者的仲裁号保留在仲裁总线上。
7、输入/输出系统
7.1 I/O系统基本概念
IO系统由以下两部分组成:
- IO软件:包括驱动程序、用户程序等。采用IO指令和通道指令实现CPU与IO设备信息交换。
- IO硬件:包括外部设备、设备控制器、接口、IO总线等。
IO设备通过设备控制器(或IO接口?)与系统总线相连。
通道程序存放在主存中,由通道从主存中取出并执行。
7.2 I/O接口
IO接口的功能:选址(地址译码、设备选择)、传送命令、传送数据、传送IO设备的状态、数据缓冲和信号格式转换。
IO接口结构
- 数据线:传送数据缓存寄存器、状态/控制寄存器的内容
- 地址线:给出要访问的IO接口中的寄存器地址
- 控制线:发送读写信号(、握手信号、仲裁信号)
I/O指令:对数据缓存寄存器、状态/控制寄存器操作的指令。特权指令
IO接口的类型
- 按数据传送方式:并行接口、串行接口
- 按控制方式:程序查询接口、中断接口、DMA接口
I/O端口:接口电路中可被CPU直接访问的寄存器。(注意与IO接口的不同)
IO端口编址
- 统一编址(存储器映射方式,内存映射IO):没有专门的IO指令,用访存指令。靠地址码来区分是访问主存的还是访问IO端口的。
- 独立编址(IO映射方式,IO指令):主存和IO端口地址空间独立,有专门的IO指令。靠不同的指令来区分是访问主存的还是访问IO端口的。
磁盘驱动器是串行方式读写的。
7.3 I/O方式
CPU与外设 | 传送与主程序 | |
---|---|---|
程序查询方式 | 串行(CPU忙等) | 串行 |
程序中断方式 | 并行 | 串行 |
DMA方式 | 并行 | 并行 |
7.3.1 程序查询方式
轮询,CPU不断查询IO设备状态,直到就绪才传送。
7.3.2 程序中断方式
中断优先级
中断响应优先级:硬件固定的
不可屏蔽中断>内部异常>可屏蔽中断
内部异常中:硬件异常>软件异常(访管指令>程序性异常)
DMA中断请求>IO设备传送中断请求
IO设备传送中断请求中:高速>低速,输入设备>输出设备,实时设备>普通设备
中断处理优先级:可以通过中断屏蔽技术调整
- 屏蔽触发器:1表示可以屏蔽,0表示不能。
- 屏蔽字:所有屏蔽触发器的值组合起来。如中断处理次序为D>A>C>B,则它们的屏蔽字如下。(谁1多谁优先级高)
- D:1111
- A:1110
- C:0110
- B:0100
中断处理过程
- 中断隐指令:由硬件完成
- 关中断
- 保存断点:PC、PSW
- 引出中断服务程序:识别中断源、将服务程序地址送入PC
中断识别
- 非向量中断(软件查询法):可参见5.5
- 向量中断(硬件向量法)
- 中断向量:一个中断服务程序的入口地址
- 中断向量表:存放许多中断服务程序入口地址的表
中断向量的地址是中断服务程序入口地址的地址
单重中断和多重中断
7.3.3 DMA方式
主存和DMA接口之间有一条直接数据通路,数据不经过CPU。
DMA传送方式
停止CPU访存:DMA传送时停止CPU访存
周期窃取(周期挪用):访存冲突时,CPU暂时放弃总线(IO访存优先级高于CPU访存,IO可能会丢失数据),IO设备窃取一个或几个存储周期,传送完一个数据后立刻释放总线,单字传送。
DMA与CPU交替访存:CPU工作周期120ns,存储周期60ns,则CPU工作周期中一半自己访存,一半DMA访存。
DMA传送过程
- 预处理
- DMA请求:IO设备向DMA发送的请求(注意这个名词!!!)
- DMA总线请求:DMA控制器向CPU发送的请求(这两者有时也统称DMA请求)
- 数据传送
- 后处理:DMA控制器向CPU发DMA中断请求(它是一种可屏蔽外部中断),CPU执行中断服务程序处理。
DMA方式和中断方式对比
- DMA方式不中断现行程序,无需保护现场
- 对中断请求的响应发生在每条指令执行周期后,对DMA的请求的响应可以发送在任意机器周期结束后。
- DMA请求的优先级高于外中断请求,防止高速设备数据丢失。DMA请求>不可屏蔽中断>可屏蔽中断
只有具有DMA接口的设备才能产生DMA请求。
若不开中断,只有可屏蔽中断不会响应。
*7.3.4 通道方式
操作系统中提及的,在此补充。
IO通道:专门负责输入输出的处理机,硬件!通道没有内存,所执行的程序是放在主机的内存中的。
通道→设备控制器(IO接口)→设备
过程:CPU向IO通道发送一条IO指令,给出要执行的通道程序的首地址和要访问的IO设备,通道执行通道程序完成任务,结束后向CPU发送中断请求。
与DMA的不同:DMA需要CPU来控制传输数据块的大小、位置;DMA只能对应一台设备,通道可以控制多台设备。
种类
- 字节多路通道:以字节为单位分时交叉工作,当为一台设备传送一个字节后,立即转去为另一台设备传送一个字节;适用于打印机、终端等低速或中速的I/O设备。
- 数组选择通道:以“组方式”工作,每次传送一批数据,传送速率很高,但在一段时间只能为一台设备服务。适用于连接磁盘、磁带等高速设备。
- 数组多路通道:综合了字节多路通道分时工作和数组选择通道传输速率高的特点;对通道程序采用多道程序设计技术,使得与通道连接的设备可以并行工作。