跳转至

计组部分笔记

计组必须掌握的知识点

  • 第一章:CPI 计算。题目:习题 6
  • 第二章:补码、浮点数表示,大小端。题目:题型参考(二、数据表示题)
  • 第三章:补码溢出,浮点数运算舍入。题目:题型参考(三、数据运算题)
  • 第四章:RISC-V 汇编指令含义,C 函数汇编。题目:例题 4.8,习题 19
  • 第五章:流水线冒险、处理,流水线控制信号。题目:题型参考(六、处理器分析题),习题:18,21(见 5.6 指令流水线)
  • 第六章:Cache 大小计算,Cache、内存页地址划分,Cache miss 率计算。题目:例题 6.8、6.9,习题:15,19(见 3.5 高速缓冲存储器)
  • 第七章:I/O 中断概念(见 第七章 I/O 系统)

2.2 运算方法和运算电路

  • ALU作为运算器的核心部件,属于组合逻辑电路
  • 在定点运算器中,无论采用双符号位还是采用单符号位,必须有 溢出判断电路 ** ,一般用 **异或 门来实现
  • 机器运算发生溢出的根本原因在于 寄存器的位数有限
  • 采用进位位来判断溢出时,当最高有效位进位和符号位进位的值不相同时才产生溢出
    • 两正数相加,当最高有效位产生进位而符号位不产生进位时, 正溢出\(C_1=1,C_0=0\)
    • 两负数相加,当最高有效位不产生进位而符号位产生进位时, 负溢出\(C_1=0,C_0=1\)
  • 某计算机字长为8位,CPU中有一个8位加法器。已知无符号数x=69,y=38,若在该加法器中计算x-y,则加法器的两个输入端信息和输入的地位进位信息分别为

无论是补码减法还是无符号数减法,都是用 被减数 加上 减数的负数的补码 来实现的。根据求补公式,减数 y 的负数的补码 \([-y]_补=\overline Y+1\)

  • 补码减法运算中,控制端 Sub 为 1,所以 低位进位输入位=Sub=1
  • 只有当无符号数加减时,CF才有意义

2.3 浮点数的表示与运算

  • 不同类型的数据混合运算的时候,遵循的原则是 类型提升 ,较低的类型转换位较高的类型:char->int->long->double
  • 当尾数为补码表示时,1.0xxxx为规格化数(补码的规格化表示是小数点后一位与符号位不同)
  • 当尾数为原码表示时,正数的规格化形式为0.1xxx;负数的规格化形式为1.1xxx
  • 对阶操作中不存在阶码减小、尾数左移的操作
  • 与非规格化浮点数相比,采用规格化浮点数的目的主要是为了增加数据的表示精度
  • dx+dy ==(double)(x+y)不一定永真,因为x+y可能出现溢出
  • 单精度浮点数的阶码, 规格化 移码的取值范围为1~254

如何判断一个浮点数是否为规格化数 。为了使浮点数尽量多地表示有效位数,一般要求运算结果用规格化数形式表示。 规格化浮点数的尾数小数点后的第一位一定是一个非零数 。 - 因此对于原码编码的尾数来说,只要看尾数的第一位是否为1即可 - 对于补码表示的尾数,只需要看符号位和尾数最高位是否相反

第三章 存储系统

3.1 存储器概述

  • 存储器按照在计算机中的作用(层次分类):
    • 主存储器(主存/内存) - CPU可以直接随机地对其进行访问
      • 也可以和Cache/辅助存储器交换数据
      • 容量较小、存取速度较快、单位成本较高
    • 辅助存储器(辅存/外存
      • 需要调入主存后才能被CPU访问
      • 容量大、存取速度较慢、单位成本较低
    • 高速缓冲存储器(Cache)
      • 主存和CPU之间,用来存放当前CPU经常使用的指令和数据
      • Cache的存取速度可以与CPU的速度向匹配
      • 存储容量小、价格搞
  • 按照存储介质分类
    • 磁表面存储器:磁盘、磁带
    • 磁芯存储器
    • 半导体存储器(MOS型存储器、双极型存储器)
    • 光存储器(光盘)
  • 存取方式分类
    • 随机存储器(RAM):
    • 任何一个存储单元都是可以随机存取的,主要是用作 主存Cache
    • 只读存储器(ROM)
      • 只能随机读出而不能写入
      • 断电后数据不会丢失
    • 串行访问存储器: - 对存储单元进行读/写操作时,需要按照物理位置的先后顺序寻址
      • 顺序存取存储器(SAM)——磁带:只能按照某种顺序存取,存取时间的长短与信息在存储体上的物理位置有关
      • 直接存取存储器(DAM)——磁盘、光盘:存取信息时通常先寻找整个存储器中的某个小区域,再在小区域中顺序查找
  • 信息可保存性
    • 易失性存储器 ——RAM:断电后存储信息就消失
    • 非易失性存储器 ——ROM、磁表面存储器和光存储器:断电后存储信息依旧存在
  • 存储器的存取周期 是指存储器进行连续读或写操作所允许的最短时间间隔
  • 相联存储器 是按照 内容指定方式和地址指定方式相结合 进行寻址的存储器
  • 主存和Cache之间的数据调动对所有程序员都是 透明的 - 主存和辅存之间的数据调动对应用程序员透明的

3.2 主存储器

  • 半导体存储器
  • 随机存储器(RAM): 易失性存储器

    • 静态随机存储器(SRAM)
      • 存放一个二进制位的物理器件叫做 存储元(记录 \(1\) 个 0 或 1);地址码相同的多个存储元构成一个 存储单元。若干存储单元的集合构成 存储体
      • 存储元式 双稳态触发器 ,信息被读出后不需要再生
      • 存取速度快,集成度低,功耗大,价格昂贵,一般用于高速缓冲存储器
    • 动态随机存储器(DRAM)
      • 利用存储元电路中栅极电容上的电荷存储信息
      • 基本存储元件只使用一个晶体管,信息被读出后需要再生
      • 集成度高,位价低,功耗小,存取速度慢,需要定时刷新和读后再生
  • 刷新方式

    • 刷新周期 :对同一行进行相邻两次刷新的时间间隔称为刷新周期
    • 集中刷新 :字面意思,停止对存储器的任何读/写操作,称为 访存死区
    • 分散刷新 :将一个存储器系统的工作周期分为两个部分:前半部分用于正常的读/写操作;后半部分用于刷新
      • 这种刷新方式增加了系统的存取周期
    • 异步刷新 :在一个刷新周期内每一行仅刷新一次
      • 具体做法为:刷新周期除以行数,得到相邻两行之间刷新的时间间隔t,每隔t时间产生一次刷新请求,让死时间的分布更加分散
      • 简单来说就是无时无刻不再刷新,不过一行行扫过去刷新
    • 刷新与再生是不同的,刷新是以行为单位逐行恢复数据,再生仅需要恢复读出的那些单元的数据
  • DRAM芯片的引脚复用
    • 仅限DRAM - 行数 \(r\) ,列数 \(c\),假定有一个 \(2^n\times b\) 的 DRAM 芯片的存储阵列,则 \(2^n=r\times c\)\(n=\mathrm{log}_2 r+\mathrm{log}_2 c\) ;同时为了减少刷新开销 \(r\le c\)
  • 只读存储器(ROM)
    • 特点有:
      • 结构简单,位密度比可读/写存储器的高
      • 有非易失性,可靠性高
    • 类型:
      • 掩模式只读存储器:生产时直接写入,任何人无法改变
      • 一次可编程只读存储器
      • 可擦除可编程只读存储器 EPROM - Flash存储器
      • 固态硬盘 SSD - 多模块存储器
    • 单体多字存储器
      • 每个存储的单元存储 \(m\) 个字,总线宽度也为 \(m\) 个字,一次并行读出 \(m\) 个字。
      • 在一个存取周期内,从同一地址取出 \(m\) 条指令,然后将指令逐条送到 CPU 执行,即每隔 \(1/m\) 存取周期,向 CPU 向主存取一条指令
      • 缺点 :只有指令和数据在主存中连续存放时,这种方法才能有效提升存取速度。如果遇到转移指令,或操作数不能连续存放时,这种方法的提升效果就不明显
    • 多体并行存储器
      • 多体模块组成,每个模块都有相同的容量和存取速度,各模块都有独立的读/写控制电路、地址寄存器和数据寄存器。它们既能并行工作,也能交叉工作
      • 高位交叉编址(顺序方式)
        • 高位地址表示模块号,低位地址为模块内地址
        • 此方式下,总把低位的体内地址送到由高位体号确定的模块内进行译码。访问一个连续主存块时,总是现在一个模块内访问,等到该模块访问完才转到下一个模块访问
      • 低位交叉编址(交叉方式)
        • 低位地址为模块号,高位地址为模块内地址。模块号 = 单元地址 % m 单元 \(0,m,\cdots,(k-1)m\) 位于 \(M_0\) 依次类推
        • 轮流启动方式
          • 每个模块一次读/写的位数正好等于数据总线的位数,模块的存取周期为 \(T\),总线周期为 \(r\)。模块数 \(m\) 应满足:\(\displaystyle m=\dfrac{T}{r}\)
          • 按照每隔 \(\dfrac{1}{m}\) 个存取周期轮流启动各模块,则每隔 \(1/m\) 个存取周期就可以读出或写入一个数据
          • 只要可以保证启动某模块后经过 \(m\times r\) 的时间后再次启动该模块时,上次的存取操作已经完成。这样的话连续存取 \(m\) 个字所需的时间为 \(\displaystyle t_1=T+(m-1)r\)
          • 如果相邻的 \(m\) 次访问的访存地址出现在同一个模块内,则会发生访存冲突,需要延迟发生冲突的访问请求

  • 随机存储器和只读存储器 统一编址
  • U盘属于 只读存储器 ,它采用 Flash 存储器技术,属于 ROM 的一种
  • 随机存取随机存数器(RAM) 不是一个概念, 只读存储器(ROM) 也是随机存取的
  • 动态半导体存储器的特点
    • 每隔一段时间需要根据原存内容重新写入一遍
    • 一次完整的刷新过程只需要占用一个存取周期
  • 带宽:每秒传输的数据量

3.3 主存储器和CPU的连接

地址总线 \(A_0(高位)-A_{15}(低位)\)\(4K\times 4位\) 的存储芯片组成 \(16KB\) 存储器,则产生片选信号的译码器的输入地址线应该是: \(A_2A_3\)

Note

\(16KB=2^{14}\times 8位\),从低位开始算,由于每组由两个芯片构成,共4组,所以需要两个作为分片的,也就是答案对应的部分

3.4 外部存储器

  • 磁盘存储器 - 磁盘驱动器:驱动磁盘转动,操纵读写
    • 磁盘控制器:驱动器与主机的接口,接受和解释CPU发来的命令
    • 盘片
  • 磁盘的存储区域 - 一个磁盘含有若干记录面——磁头数,每个记录面划分为若干 圆形 的磁道——柱面数,每条磁道分为若干扇区/块——扇区数
    • 扇区是磁盘读/写的最小单位
  • 磁盘的存取时间 - 寻道时间 (磁头移动到目的磁道的时间)+ 旋转延迟时间 (磁头定位到要读/写扇区的时间)+ 传输时间 (传输数据所花费的时间)
    • 一般都用平均时间计算
    • 固态硬盘(SSD)
    • 一个闪存由 \(B\) 个块组成,每个块由 \(P\) 页组成
    • 数据以 为单位进行读/写,以 为单位擦除
    • 只有在此页所属的块全部被擦除后,才可以写这一页

  • 若磁盘转速提高一倍,则 平均旋转延迟时间减少一半
  • 某磁盘盘面有200个磁道,盘面总存储容量为 \(60MB\) ,磁盘旋转一周的时间为 \(25ms\) ,每个磁道有 8 个扇区,各扇区之间有一个间隔,磁头通过每个间隔需要 \(1.25ms\),问磁盘接口所需的最大传输速率

Note

解答 每个磁道的存储容量为:\(\displaystyle \dfrac{200}{60\mathrm{MB}}=0.3\mathrm{MB}\) 则读一个磁道数据的时间等于磁盘旋转一周的时间减去通过扇区间隙的总时间 \(25ms-1.25ms=15ms\) 数据传输速率为 \(\displaystyle \dfrac{0.3\mathrm{MB}}{15ms}=20\mathrm{MB}/s\)

  • 某磁盘的 平均寻道时间\(6ms\) ,转速为 \(10000r/min\) ,磁盘传输速率为 \(20\mathrm{MB/s}\) ,磁盘控制器延迟为 \(0.2ms\) ,读取一个 \(4\mathrm{KB}\) 的扇区需要的平均时间为

Note

解答 读取扇区的时间为 \(\dfrac{4\mathrm{KB}}{20\mathrm{MB/s}}=0.2\mathrm{ms}\) 平均旋转延迟为 \(\displaystyle \dfrac{60}{10000}/2=3\mathrm{ms}\) 总时间为 \(3\mathrm{ms}+6\mathrm{ms}+0.2\mathrm{ms}+0.2\mathrm{ms}=9.4\mathrm{ms}\)

3.5 高速缓冲存储器

  • 程序访问的局部性原理 - 时间局部性 是指最近的未来要用到的信息,很可能是现在正在使用的信息——主要体现在:程序中存在循环和需要多次重复执行的子程序段对数组的存储和访问操作
    • 空间局部性 是指最近的未来要用到的信息,很可能与现在正在使用的信息在存储空间上是 临近 的——主要体现在:指令通常是顺序存放、顺序执行的 以及 数据一般也是以向量、数组等形式簇聚在一起的
  • Cache的基本工作原理
  • Cache 和主存被划分为大小相等的 (Cache块也称为Cache行),每块由若干字节组成。块的长度称为 块长
  • CPU 发出读请求时:
    • 若访存地址在 Cache 中命中,就将此地址转换成 Cache地址 。直接对Cache进行读操作,与主存无关
    • 若访存地址未命中 Cache,则需要访问主存,并把此字所在的块一次性地从主存调入Cache
    • 整个过程全部由硬件实现
    • CPU与Cache之间地数据交换以 为单位;Cache与主存之间的数据交换以Cache块为单位
  • CPU 发出写请求时:
    • 若Cache命中,有可能遇到Cache与主存中内容不一致的问题。有全写法和回写法两种
  • Cache命中率的相关计算
    • CPU想要访问的信息已经在Cache中的比率称为Cache的 命中率
    • 一个程序执行期间,Cache的总命中次数为 \(N_c\) ,访问主存的总次数为 \(N_m\), 则命中率 \(H\)\(\displaystyle H=\dfrac{N_c}{N_c+N_m}\)
  • Cache和主存的映射方式
    • Cache的 每一块之前 会加一个 标记位 ,指明是主存哪一块的副本
    • 为了说明Cache行信息是否有效,每个Cache行需要一个 有效位 - 直接映射 - 主存中的每一块地址都在Cache中有对应
      • \(\text{Cache行号} = \text{主存块号}\;\mod\;\text{Cache总行数}\)
      • CPU寻址的时候的地址结构为pasted-image-20260103205859.png
    • 全相联映射 - 每一块都可以装入Cache中的任何位置
      • 全相联映射的地址结构为pasted-image-20260103210101.png
    • 组相联映射 - 既上述两种方法的折中,将Cache分成Q个大小相等的组,每个主存块可以装入固定组中的任意一行
      • 组相联映射的关系可以定义为 \(\text{Cache组号}=\text{主存块号} \mod \text{Cache组数(Q)}\)
      • 地址结构为pasted-image-20260104135752.png
  • CPU访存过程
    • 首先根据访存地址中间的组号找到对应的Cache组
    • 将对应Cache组中每个行的标记与主存地址的高位标记进行比较
    • 若有一个相等且有效位为1,则访问Cache命中,此时根据主存地址中的块内地址,在对应Cache行中存取信息
  • 组相联映射中比较器的个数和位数
    • 直接映射因为每块只能映射到唯一的Cache行,因此只需要设置1个比较器
    • 而 r 路组相联映射需要在对应分组中与 r 个Cache行进行比较,因此需要 r 个比较器
  • Cache的容量
    • 因为 Cache 包括了可以对 Cache 中所包含的存储器地址进行跟踪的硬件,即 Cache的总容量=存储容量+标记阵列容量
  • Cache中主存块的替换算法 - 随机算法
    • 先进先出算法
    • 近期最少使用算法(LRU算法)
  • Cache中一致性的问题
    • 全写法 :CPU对Cache写命中时,把数据同时写入Cache和主存
      • 优点:可以随时保持主存数据的准确性
      • 缺点:增加了访存次数,降低了Cache的效率
    • 为了减少全写法直接写入主存的时间损耗,会在Cache和主存之间加一个 写缓冲 - 回写法 :当CPU对Cache写命中时,只把数据写入Cache,而不立即写入主存,只有当此块被替换出时才写回主存
      • 优点:减少了访存次数
      • 缺点:存在数据不一致的隐患
      • 为了减少写回主存的次数,给每个Cache行设置一个 修改位(脏位)

  • 指令Cache通常比数据Cache具有更好的空间局部性
  • 由于空间局部性,适当增加Cache块大小通常会提高命中率

某存储系统中,主存容量是 Cache 容量的 4096倍,Cache 被分为 64 个块,当主存地址和 Cache 地址采用直接映像方式时,地址映射表的大小为(不考虑一致性维护和替换算法位)

Note

Cache 有64块,因为采用直接映像,所以有64行 主存容量为 Cache 容量的 \(4096=2^{12}\) 倍,则主存地址长度比 Cache 多12位,再加上 1 位有效位,可以得到答案为 \(64\times 13 \text{位}\)

有效容量为 128KB 的Cache,每块 16B,采用 8 路组相联。字节地址为 1234567H 的单元调入该 Cache,则其tag位为

Note

每块16B,说明 块内的地址编码需要4位\(2^4=16\))

同时计算有 \(128\mathrm{KB}÷(16\mathrm{B}\times 8)=1024=2^{10}\) 组,那么 组号又占 10 位 字节地址扩展开 \(0001,0010,0011,0100,0101,0110,0111\) 共28位, 减去刚刚算出来的14位,剩下来的14位是tag位\(0001,0010,0011,01\)。然后高位补全 \(0000,0100,1000,1101\)\(048D\text{H}\)

某个主存-Cache层次的存储器,按照字节编址,主存容量为 1MB,Cache容量为 16KB,每块有 8 个字,每个字有 32 位,采用直接映像的方式,Cache 起始字块为第 0 块,若主存地址为 35301H,且 CPU 访问 Cache 命中,则在 Cache 的第几个字块中

Note

主存容量为 \(1\text{MB}=2^{20}\text{B}\) ,则主存有 20 位用来编址

Cache 容量为 \(16\text{KB}\), 每一块有 8 个字,每个字 32 位(4B),也就是说每一块有 \(32\text{B}\) 的大小

那么Cache有 \(2^{14}÷2^{5}=2^{9}\) 块,则 块号需要 9 位,在中间 又有块内为 \(32\text{B}\) ,那么按照字节编址来看, 块内号需要 5 位,在最低位 tag则占 \(20-9-5=6\) 位, 在最高位 \(35301\text{H}=0011,0101,0011,0000,0001\)。取中间 9 位为 \(01,0011,000=152\)

设有 8 页的逻辑空间,每页有 1024B,它们被映射到 32 块的物理存储取中,则按字节编址逻辑地址的有效位是什么,物理地址至少是多少位

Note

解析 8 页逻辑空间需要 3 位明确页号 1024B 的大小按照字节大小来编址,需要 10 位明确地址号 所以编址逻辑地址的有效位为 13 位 被映射到了 32 块的物理存储区,这里需要 5 位明确物理地址 所以物理地址至少为 5 位

某计算机的 Cache 有 16 行,块大小为 16B ,其映射方式可以配置为直接映射和 2 路组相联映射,主存按照字节编址,主存单元从 0 开始编号。证明:不论采取上述哪种映射方式,48号主存单元和308号主存单元都可能因为 Cache 冲突

Note

解析 每个主存单元对应1个编址,一个块为 16B,那么对于 直接映射 ** 1块应该有 16 个主存单元;对于 ** 2路组相联映射 应该只剩 8 组 直接映射方式下: \((48÷16) \mod 16 = 3 = (308÷16) \mod 16\) 2路组相联映射方式下: \((48÷16) \mod 8 = 3 = (308÷16) \mod 8\)

四 指令系统

4.1 基本概念

  • 指令集系统结构(ISA)完整定义了软硬件之间的接口,是软件和硬件之间的一层。包含了基本数据类型指令集寄存器寻址模式存储体系中断和异常处理以及外部I/O
  • PC 用来存放当前欲执行指令的地址
  • 指令的地址码字段保存操作操作数地址
  • 指令的地址个数与指令的长度是否固定没有必然联系,即使是单地址指令,也可能由于单地址的寻址方式不同而导致指令长度不同
  • 单指令地址只有一个地址码,在完成两个操作数的算术运算时,一个操作数由地址码指出,另一个操作数通常存放在累加寄存器(ACC)中,属于 隐含寻址

    此外,单地址指令也可以有两个操作数,因为其中一个是隐含的,例子如:ADD X 语义是 AC ← AC + M[X] 这里可以清楚地看到: - 操作数 1:AC(隐含,不写在指令中) - 操作数 2:M[X](由地址 X 指出) 实际有两个操作数,但只有一个操作数地址写在指令里

设计某指令系统时,假设采用 16 位定长指令字格式,操作码使用扩展编码方式,地址码为 6 位,包含零地址、一地址和二地址 3 种格式的指令。若二地址指令有 12 条,一地址指令有 254条,则零地址指令最多多少条

Note

解析 地址码为 6 位,也就是说1位二地址指令可以占掉 \(2^6\) 个一地址指令;1位一地址指令可以占掉 \(2^6\) 个零地址指令。那么计算如下 \(\(2^{16}-12\times 2^6\times 2^6 - 254\times 2^6=128\)\)

4.2 指令的寻址方式

寻址方式是指寻找指令或有效数的有效地址的方式,即 确定本条指令的数据地址下一条待执行指令的地址的方法。 分为 指令寻址数据寻址 两种方式

  • 寻找 下一条将要执行的指令地址 称为 指令寻址
  • 寻找 本条指令 的数据地址称为 数据寻址

指令寻址 分为两种

  • 顺序寻址:通过程序计数器PC加1(1条指令长度),自动形成下一条指令地址
  • 跳跃寻址:转移指令实现,CPU总是根据PC的内容去主存取指令的,因此转移指令执行的结果是修改PC值,下一条指令仍然通过PC给出

数据寻址 是指如何在指令中表示一个操作数的地址,或怎么样计算出操作数的地址。指令的格式一般如下

| 操作码 | 寻址特征 | 形式地址A |
指令中的地址码字段并不代表操作数的真实地址,这种地址称为 形式地址(A) ** 。形式地址结合寻址方式,可以计算出操作数在存储器中的真实地址,这种地址称为 ** 有效地址(EA)

寻址方式 范围 有效地址 访存次数 其它说明
立即寻址 形式地址的位数决定操作数的范围 A即是操作数 0 采用补码表示
直接寻址 形式地址的位数决定可寻址的范围 EA=A 1
间接寻址 扩大了寻址范围 EA=(A) 2 便于完成子程序的返回
寄存器寻址 形式地址的位数决定了通用寄存器的最大数量 EA=R_i 0 指令的地址段给出的是操作数所在的寄存器编号
寄存器间接寻址 寄存器位数决定了可寻址范围 EA=(R_i) 1
相对寻址 EA=(PC)+A 1 注意取指令过后PC会发生改变,此时再+A
基址寻址 EA=(BR)+A 1
变址寻址 EA=(IX)+A 1 经常用于数组等
- 指令系统中采用不同寻址方式的目的是 可缩短指令字长,扩大寻址空间,提高编程的灵活性
- 简化地址结构的基本方法是尽量使用 隐含寻址
- 指令中的地址码位 A,变址寄存器为 X,程序计数器为 PC,则变址间址寻址方式的操作数的有效地址 EA为:((X)+A)
- 指令所提供的相对地址实质上是一种 以下条指令在内存中首地址为基准位置的偏移量
- 堆栈是主存(或寄存器中)中一块特定的、按后进先出原则管理的存储区,寄存器堆栈称为 硬堆栈 ** ;主存中划分出来的区域作为堆栈是最合算且常用的方法,这种堆栈称为 **软堆栈
- 按字寻址的机器,程序计数器的位数取决于 存储器的字数 - 指令寄存器的位数取决于 指令字长

第五章 中央处理器

5.1 CPU的功能和基本结构

  • CPU
    • 运算器控制器 组成
    • 控制器:负责协调并控制计算机各部件执行程序的指令序列
    • 运算器:对数据进行加工
    • 具体功能有
      • 指令控制
      • 操作控制
      • 时间控制
      • 数据加工
      • 中断处理
  • 运算器
    • 运算器主要由 算术逻辑单元、暂存器、累加寄存器、通用寄存器组、程序状态字寄存器、移位寄存器、计数器等组成
    • 主要功能是根据控制器送来的命令,对数据执行算术运算、逻辑运算或条件测试
  • 控制器
    • 主要由 程序计数器、指令寄存器、指令译码器、时序电路和微操作信号发生器组成
    • 主要功能是执行指令,每条指令的执行是由控制器发出的一组微操作实现的
    • 工作原理是:根据指令操作码、指令的执行步骤和条件信号来形成当前计算机各部件要用到的控制信号。计算机整机各个硬件系统在这些控制信号的控制下协同运行,产生预期的执行结果
  • 用户可见寄存器
    • 通用寄存器组、程序状态字寄存器、程序计数器

  • 在所谓的 \(n\) 位CPU中,\(n\) 是指数据总线线数: 数据总线的位数与处理器的位数相同,他表示CPU一次能处理的数据的位数,即CPU的位数
  • 执行转移指令时, PC 的值不一定修改为转移指令的目标地址, 需要判别转移是否成功
  • PC 用于指出下一条指令在主存储器中的地址,可以用字节地址表示指令地址,此时 PC 的位数与存储器地址的位数相等,而 存储器地址的位数取决于存储器的容量 ;也可以用字地址表示指令地址,这种情况下指令必须采用按边界对齐的方式存放,此时 \(PC的位数=存储器地址的位数-log_2(指令字长的字节数)\)
  • 通用寄存器用于存放操作数和各种地址信息等,其 位数与机器字长相等 ,因此便于操作控制
  • 通用寄存器供用户自由编程,可以存放数据和地址。
  • 而指令寄存器是专门用于存放指令的专用寄存器,不能由通用寄存器代替

5.2 指令执行过程

  • 计算机工作的最小时间周期是 时钟周期
    • 采用DMA方式传递数据时,每传送一个数据就要占用 存取周期 :在DMA的传输过程中,数据是直接在外设与内存之间传送的,外设通过DMA控制器向内存写入数据或从内存读取数据
  • 存储器本身无法区分存储单元中存放的是指令还是数据。计算机在 不同阶段 对存储器进行读/写操作时,取出的二进制代码有不同辨认

5.3 数据通路的功能和基本结构

无论CPU内部结构多么复杂,都可以视为由 数据通路 ** 和 ** 控制部件 两大部分组成 - 数据通路 - 数据在指令执行过程中所经过的路径,包括路径上的部件,称为 数据通路 - 对CPU来说,数据通路的基本结构分为 总线结构专用数据通路结构,其中总线结构又分为 单总线结构双总线结构多总线结构 - 操作元件的输出仅取决于当前的输入,不受时钟信号的控制,也没有存储数据的功能。 - 状态元件的最大特点是由存取数据的功能 - 多周期 CPU 中的指令通常需要多个时钟周期才能完成,\(CPI>1\);单周期CPU的每条指令在一个时钟周期内完成,\(CPI=1\)。 - 单周期CPU的时钟周期取决于最复杂指令的执行时间,通常比多周期CPU的时钟周期长 - 在一条指令的执行过程中,单周期CPU的每个控制部件保持不变,每个部件只能使用一次;多周期CPU的控制信号可能发生改变,同一个部件可使用多次

5.5 异常和中断机制

  • 异常
    • CPU内部产生的意外事件称为*异常*。分为 硬故障中断程序性异常
      • 硬故障中断 是由硬连线出现异常而引起的;程序性异常 也称为 软件中断,是指CPU内部因执行指令而引起的异常事件。
      • 故障 :在 引起故障的指令启动后、执行结束前 被检测到的异常事件
        • 例如指令译码是,出现非法操作码,出现缺段,缺页现象;执行整除时,发现除数为0
        • 对于缺段异常,会回到故障的指令继续执行, 断点位当前发生故障的指令
        • 对于整除0之类的异常,无法通过处理程序恢复故障,必须终止进程的执行
      • 自陷 :预先安排的一种异常事件,预先设定的陷阱
        • 一般用于下断点等
      • 终止 :出现了硬件故障,必须重启
  • 中断
    • 来自CPU外部、与CPU执行指令无关的事件引起的中断, CPU每执行完一条指令就检查中断请求信号线 ,如果检测到,就进入中断响应周期

5.6 指令流水线

指令流水线主要指,同一时刻有多条指令在CPU的不同功能部件中并发执行,大大提高了功能部件的并行性和程序的执行效率

可以从两方面 提高处理机的并行性

  • 时间上的并行技术:将一个任务分解为几个不同的子阶段,每个子阶段在不同的功能部件上并行执行,这种一般称为 流水线技术
  • 空间上的并行技术:在一个处理机内设置多个执行相同任务的功能部件,并让这些功能部件并行工作,这样的处理机被称为 超标量处理机

一条指令的 执行过程 一般有这5个阶段(称为*功能段*或者*流水段*)

  • 取值(IF):从指令存储器或者 Cache 中取指令
  • 译码/读寄存器(ID):操作控制器对指令进行译码,同时从寄存器堆中取操作数
  • 执行/计算地址(EX):执行运算操作或计算地址
  • 访存(MEM):对存储器进行读/写操作
  • 写回(WB):将指令执行结果进行读/写操作

理想情况下,每个时钟周期都有一条指令进入流水线,每个时钟周期都有一条指令完成,每条指令的 时钟周期数(CPI) 都为1

为了利于实现指令流水线,指令集应具有如下特征:

  1. 指令长度尽量一致
  2. 指令格式尽量规整,尽量保证源寄存器的位置相同
  3. 采用LOAD/STORE型指令:其它指令都不能访问存储器,这样可以把LOAD/STORE指令的地址计算和运算指令的执行步骤规整到一个周期中
  4. 数据和指令在存储器中“按边界对齐”存放。有利于减少访存次数

流水线的设计

  • 单周期CPU的时钟频率取决于数据通路中的最长路径
  • 每个流水段的后面都要增加一个 流水段寄存器
    • 这个寄存器的作用是锁存本段处理完的所有数据,以保证本段的执行结果可以在下个时钟周期给下个流水段使用
    • 可以理解为两个功能段之间的沟通桥梁

流水线的冒险与处理 指令流水线中,可能遇到一些情况使得后续的指令无法正确执行而引起流水线阻塞,这种现象称为 流水线冒险 ,又根据导致冒险的原因不同分为 结构冒险数据冒险控制冒险

结构冒险 :由不同指令在同一时刻争用同一功能部件而形成的冲突,也称为 资源冲突,是由于硬件资源竞争造成的冲突

  • 例如:指令和数据通常存放在同一个存储器中,第i条LOAD指令进入MEM段时,第i+3条指令的IF段也要访存指令,此时会发生访存冲突
  • 解决方法一般有这两种
    • 前一指令访存时,使后一条相关指令暂停一个时钟周期
    • 设置多个独立的部件。例如可以将寄存器的读口和写口独立开,将存储器分为数据存储器和指令存储器

数据冒险 :也称为 数据相关。后面的指令用到前面指令的结果时,前面指令的结果还没有产生,称为 写后读(RAW)冲突

例如:

I1    add R1, R2, R3    # (R2)+(R3)->R1
I2    sub R4, R1, R5    # (R1)-(R5)->R4
在写后读冲突中,指令I2的源操作数是指令I1的目的操作数。正常的读写顺序是由指令I1先写入R1,然后指令I2来读R1。但是流水线中的重叠操作,导致I1的WB操作在I2的ID操作之后,出现了RAW冲突。

RAW冲突的解决方法如下:

  • 延迟执行相关指令:把遇到数据相关的指令及其后续指令都暂停一至几个时钟周期,直到数据相关问题消失后再继续执行
    • 可以插入空操作 nop 指令
    • 可以硬件阻塞 stall
    • 此外,对于上面的例子,由于寄存器读/写口分开的,不会冲突,所以可以在前半周期写入R1的值之后在后半周期马上读出,从而只需要延迟两个时钟周期
  • 采用转发(旁路)技术:不等前一条指令把计算结果写回寄存器,下一条指令也不再从寄存器读,而将数据通路中生成的中间数据直接转发到ALU的输入段
  • load-use数据冒险处理:若load指令与其后紧邻的运算类指令存在数据相关的问题,则 无法 通过转发技术来解决,这种称为 load-use 数据冒险
    • 这种冒险最简单的做法是由编译器在 I2 指令之前插入一条 nop 指令,这样在 I2 指令的 EX 段就可以从MEM/Wb流水段寄存器中取出load指令的最新结果

Note

例如 load 指令只有在MEM段结束时才能得到主存中的结果,然后送MEM/WB流水段寄存器,在 WB 段的前半周期才能存入 R2 的新址,但随后的 add 指令在 EX 阶段就要取 R2 的值,因此得到的是旧值

I1    load r2,12(r1)    # M[(r1)+12]->(r2)
I2    add r4, r3, r2    # (r3)+(r2)->(r4)


控制冒险 :当遇到改变指令执行顺序的情况,会改变PC值,从而造成断流,也称为 控制冲突

  • 解决方法
    • 对于转移指令引起的冲突,可以插入 nop 或者 stall 解决
    • 对转移指令进行分支预测,尽早生成转移目标地址。
      • 静态预测
      • 动态预测:根据程序转移的历史情况,进行动态预测调整,有较高的预测准确率 流水线的性能指标
  • 吞吐率(TP) :指单位时间内流水线所完成的任务数量,或者输出结果的数量
    • n 为任务数,\(T_k\) 是处理完这些任务需要的时间,\(\text {TP}=\dfrac{n}{T_k}\)
    • \(k\) 为流水段的段数,\(\Delta t\) 为时钟周期。在输入流水线中的任务连续不停的情况下,一条 \(k\) 段流水段可以在 \(k+n-1\) 个时钟周期内完成 \(n\) 个任务,\(\text {TP}=\dfrac{n}{(k+n-1)\Delta t}\)
  • 流水线的加速比(S) :完成同样的任务,不使用流水线和使用流水线所用的时间之比
    • \(S=\dfrac{T_0}{T_k}\)\(T_0\) 表示不使用流水线的总时间,\(T_k\) 表示使用流水线的总时间
    • 同样,我们将 \(T_0=kn\Delta t\)\(T_k=(k+n-1)\Delta t\) 带入进去,可以得到 \(S=\dfrac{kn}{k+n-1}\)

高级流水线技术 有两种增加指令级并行的策略,分别是 多发射技术超流水线技术

  • 超标量流水线技术 :也称为 动态多发射技术 ,每个时钟周期内可以并发多条独立指令,以 并行 的方式将多条指令编译并执行(需要多个操作部件)
    • 简单来说,就是多个流水线同时执行指令
    • 多数超标量 CPU 都结合动态流水线调度技术,通过 动态分支预测 等手段,指令不按照顺序执行
  • 超长指令字技术 :也称为 静态多发射技术 ,编译器找到指令间潜在的并行性,将多条指令合成一个有多个操作码的超长指令字(需要多个操作部件)
    • 超标量流水线是在执行的时候动态,这个编译的时候就做好了
  • 超流水线技术 :流水功能段划分越多,时钟周期就越短(因为时钟周期取决于时间最长的流水功能段),指令的吞吐率也就越高。所以超流水线技术就是通过 提高流水线主频 的方法来提升性能
    • 但是流水线级数越多,流水寄存器的开销就越大,所以不是越多越好

一个 \(m\) 段流水线稳定时的 CPU 的吞吐能力,与 \(m\) 个并行部件的 CPU 的吞吐能力相比, 两者的吞吐水平一致

Note

解析 吞吐能力指单位时间完成的指令数,下面列举两种CPU

  • \(m\) 段流水线在第 \(m\) 个时钟周期后,每个时钟周期都可以完成一个指令
  • \(m\) 个并行部件的 CPU 在 \(m\) 个时钟周期后,可以完成的指令数有 \(m\)

所以两者吞吐水平一样

取指令阶段和指令译码阶段之后才产生控制信号,所以IF和ID两个阶段是不受控制信号控制的

假定采用 “IF、ID、EX、MEM、WB”五段流水线方式,那么下面的指令在采用转发技术时,需要在指令 I3 之前加入多少条空操作指令才能使得这段程序不发生数据冒险

I1:    add  r1, r0, 1    # (r1)<-(r0)+1
I2:    load r3, 12(r2)   # M[(r2)+12]
I3:    add  r5, r3, r1   # (r5)<-(r3)+(r1)

Note

解析 转发技术无法解决 load-use 类型指令。 I1 指令在 EX 段结束的时候已经获得了 r1 的新值(此时还没写入),我们可以采用转发技术让指令 I3 提前获取到 r1 的数值,此时解决了一个数据冒险 但是指令 I2 和指令 I3 之间是 load-use 类型的数据冒险, load 指令只有在 MEM 段结束的时候才可以取到主存中的数据 ,然后送入 MEM/WB 流水段寄存器,在 WB 的前半周期才能将新值写入到 r3 中,但随后 add 操作在 EX 阶段就需要 r3 的值,此时发生了没法转发解决的数据冒险,正常来说是下面这样

I3:    |IF |ID |EX |MEM|WB |
I2:|IF |ID |EX |MEM|WB |
我们需要让 I3 的 EX 在 I2 的 MEM 之后,所以应该让 I3 之前插一个 空指令 (不是阻塞)
I3 :         |IF |ID |EX |MEM|WB |
NOP:     |IF |ID |EX |MEM|WB |
I2 : |IF |ID |EX |MEM|WB |

5.7 多线程处理器

对于 多处理器 ,基于指令流的数量和数据流的数量,将计算机体系结构分为 SISDSIMDMISDMIMD 四类。常规的单处理器属于 SISD;常规的多处理器属于 MIMD

  • 单指令流单数据流(SISD结构)
    • 传统的串行计算机结构,这种计算机通常仅包含一个处理器和一个存储器
      • 处理器在一段时间内仅执行一条指令,按照指令流规定的顺序串行执行指令流中的若干指令。
    • 之前的大多都是这个结构 -单指令流多数据流(SIMD)结构
    • 一个指令流同时对多个数据流进行处理,一般称为数据级并行技术。
    • 这种结构的计算机通常由一个指令控制部件、多个处理单元组成。
      • 每个处理单元虽然执行的都是同一条指令,但是每个单元都有自己的地址寄存器,这样每个单元就都有不同的数据地址
    • 这种结构在处理 for 循环数组的时候很有效,一条分别对 16 对数据进行运算的 SIMD 指令在 16 个 ALU 中同时运算,只需要一次运算时间就可以了
  • 多指令流单数据流(MISD)结构
    • 同时执行多条指令来处理一个数据,不过这个只是概念级知识,不真正存在
  • 多指令流多数据流(MIMD)结构 - 同时执行多条指令分别处理多个不同的数据

在传统的CPU中,线程的切换会带来极大的性能损耗,于是设计了 硬件多线程 。 每个线程都有单独的寄存器组、程序计数器等,切换线程只需要激活选中的寄存器就可以了。其实现方式有如下三种

  • 细粒度多线程
    • 多个线程之间轮流交叉执行指令,多个线程之间的指令不相关,可以乱序并行执行
    • 这种方式下,处理器可以在每个时钟周期切换线程。
  • 粗粒度多线程
    • 连续几个时钟周期都执行同一线程的指令序列,仅在当前的线程出现较大开销的阻塞的时候才切换(例如Cache缺失)
    • 这种方式下,当发生流水线阻塞的时候,必须清除被阻塞的流水线,新线程的指令开始执行前需要重载流水线,开销相对更大
  • 同时多线程
    • 上述两个多线程技术实现了指令的并行,但是线程之间没有并行
    • 同时多线程(SMT)可以在实现指令级并行的同时实现线程级的并行
    • Intel的超线程就是同时多线程

Note

举例 道路比作线程,开车比作指令的运行。 细粒度就是可以在各个道路上乱开,但是同时在跑的只有一个车 粗粒度就是在一个道路上开,直到前面堵车,再换条路,但是堵车的地方需要清理 同时多线程就是很多车在很多条路上同时开

多个处理单元集成到单个 CPU 中,每个处理单元称为一个 ,通常也称为 片上多处理器

Note

举例 四个石头要挪,每个石头要花1分钟 串行处理器就得花四分钟 有四个核的多核处理器就等于四个人挪石头,一分钟就够了 向量处理器(SIMD处理器的变体)等于一个人同时挪四个石头,如果力气大的话一分钟挪完

第六章 总线

早期计算机的各个部件之间都是通过单独的连线互连的,称为 分散连接

随着 I/O 设备的种类核数量越来越多,为了 **更好地解决 I/O 设备和主机之间连接的灵活性 ** ,计算机的结构发展出了 总线连接

6.1 总线概述

总线 是一组能为多个部件 分时共享 ** 的 ** 公共 信息传送线路

  • 分时: 同一时刻只允许有一个部件向总线发送信息
  • 共享: 总线上可以挂接多个部件,多个部件可以同时从总线上接受相同的信息

总线设备 是指总线上面连接的设备,按照 其对总线有没有控制功能 可以分为主设备从设备

  • 主设备:发出总线请求并且获得总线控制权的设备
  • 从设备:被主设备访问的设备,只响应从主设备发来的各种总线命令

总线分类

  • 按照 功能层次 分类
    • 片内总线:芯片内部的总线,用于 CPU芯片内部各寄存器 之间及*寄存器与ALU* 的连接
    • 系统总线:计算机系统内 各个功能部件 之间相互连接的总线(CPU、主存、I/O接口)。按照 系统总线传输信息内容 可以分为三类
      • 数据总线:传输数据、指令、中断类型号,是 双向 传输总线
      • 地址总线:指出数据总线上源数据或目的数据所在的 主存单元或I/O端口 的地址,是 单向 传输总线
      • 控制总线:传输各种命令、反馈和定时信号,比较典型的控制信号有时钟、复位、总线请求/允许、中断请求/回答、存储器读/写、I/O的读/写、传输确认
      • 下面会专门讲一下系统总线的一些结构
    • I/O总线:主要用于连接中低速的I/O设备,通过I/O接口与系统总线相连接,常见的有USB、PCI总线
    • 通信总线:计算机系统之间或计算机系统与其它系统之间的总线,也成为外部总线
  • 按照 时序控制方式 分类
    • 同步总线:总线上连接的部件或设备通过统一的时钟进行同步,在规定的时钟节拍内进行规定的总线操作
    • 异步操作:总线上连接的部件或设备没有统一的时钟进行同步,但是通过信号握手的方式来协调各部件或设备之间的信息传输,总线操作时序不固定
    • 简单来说,同步总线有点像123木头人,到时间才能动;异步操作就是想动就动了
  • 按照 数据传输方式 分类
    • 串行总线:只有一条 双向传输 或 两条单向传输 的数据线,数据按比特位串行顺序传输,适合 长距离通信
    • 并行总线:有多条 双向传输 的数据线,可以实现多比特位的同时传输,可能出现传输错误的情况,适合 近距离通信
  • 系统总线的结构
    • 单总线结构 :所有的设备都挂在一组总线上面
      • 优点:结构简单、成本低、易于接入新设备
      • 缺点:带宽低、负载重、多个部件只能用唯一总线,不支持并发传送操作
    • 双总线结构 :一条用于CPU、主存和通道之间的数据传送;一条是I/O总线。两条线通过 通道 进行数据交换
      • 优点:将低速I/O设备从原单总线上分离出来
      • 缺点:需要增加通道等硬件设备
    • 三总线结构 : 各个部件之间采用 3 条格子独立的总线来构成信息通路,这三条分别为 主存总线I/O总线直接内存访问(DMA) 总线
      • 主存总线用于CPU和内存之间传送地址、数据和控制信息
      • I/O总线用于CPU和各种外设数据交换
      • DMA总线用于内存和高速外设之间直接交换数据(例如将磁盘和主存用DMA连起来,DMA外挂也就是类似原理) 总线的性能指标
  • 总线时钟周期:即机器的时钟周期,跟之前我们知道的时钟周期是等价的
  • 总线传输周期:一次总线操作所需要的时间。包括了申请阶段、寻址阶段、传输阶段和结束阶段。通常由若干总线周期构成
  • 总线宽度:也称为总线位宽,也就是总线上面可以同时传输的数据位数。有时候也说根数,例如 32根称为32位总线
  • 总线带宽:单位时间总线 最多 可以传输数据的位数 \(总线带宽=总线工作频率\times(总线位数/8)\)
  • 总线复用:一种信号线在不同时间传输不同信息。例如没有地址线的情况下,通过数据线传输地址信息
  • 信号线数:地址总线、数据总线和控制总线 3 种总线数的总和称为信号线数

间接寻址第一次访问内存所得到的信息经过系统总线的 数据总线 传送到CPU中

Note

解析 间接寻址首次访问内存得到的信息是操作数的有效地址,该地址作为数据通过数据总线传送至CPU

6.2 总线事务和定时

总线事务 :从请求总线到完成总线使用的操作序列称为*总线事务*,它是在一个总线周期中发生的一系列活动。包括如下操作

  • 请求阶段:主设备发出总线传输请求,并且获得总线控制权
  • 仲裁阶段:总线仲裁机构决定将下一个传输周期的总线使用权授予某个申请者
  • 寻址阶段:主设备通过总线给出要访问的从设备地址及有关命令,启动从模块
  • 传输阶段:主模块和从模块进行数据交换,可以单向或者双向进行数据传送
  • 释放阶段:主模块的有关信息均从系统总线上撤出,让出总线使用权

总线上的数据传送方式分为非突发方式突发方式两种

  • 非突发传送方式:在每个传送周期内都先传送地址,再传送数据,主从设备之间通常每次只能传输一个字长的数据
  • 突发传送方式:可以进行连续成组数据的传送,寻址阶段发送的是连续单元的首地址,传输阶段传送多个连续单元的数据,每个时钟周期转送一个字长的信息

总线定时 :是指总线在双方交换数据的过程中需要时间上配合关系的控制。有4种定时方式

  • 同步定时方式 :系统采用统一的时钟信号来协调发送和接受双方的传送定时关系。在一个总线周期中发送方的接受方可以进行一次数据传送
    • 优点:传送速度快,传输速率高;总线控制逻辑简单
    • 缺点:主从设备属于强制性同步;不能及时进行数据有效性检验
  • 异步定时方式 :没有统一时钟,也没有固定时间间隔,依靠传送双方互相制约的“握手”信号实现定时控制。主设备发送“请求”,从设备向主设备发送“回答”信号
    • 优点:总线周期长度可变,可以保证两个工作速度相差很大的部件或者设备可以进行信息交换
    • 缺点:比同步控制的方式复杂;速度比同步定时方式慢
    • 根据“请求”和"回答”信号的撤销是否互锁,又分为以下三个类型
      • 不互锁方式:主设备发出“请求”信号后,不必等待“回答”,经过一段时间自动撤销;从设备发出“回答”信号后一段时间自动撤销
      • 半互锁方式:主设备发出“请求”信号后,需要接受“回答”后才能撤销;从设备发出“回答”后一段时间自动撤销
      • 全互锁方式:主设备发出“请求”信号后,需要接受“回答”后才能撤销;从设备发出“回答”后,必须在主设备的“请求”撤销后才能撤销
    • 对于异步串行通信方式,首发双方的时钟不严格一致,每个字符都要用开始位和停止位作为字符开始和结束的标志,从而保证数据传输的准确性
      • 第一位是开始位,表示字符串传送的开始。如果通信线为空时的逻辑电压为“1”,则发送方先发送一个逻辑“0”信号。
      • 接收方检测到这个信号后,开始准备接收数据。字符传输过程中,数据位从最低位开始,一位位传输
      • 当字符发完后,可以发送奇偶校验位,以进行差错检测。然后再发一个停止位
  • 半同步定时方式 :有同步定时的一些特点,如所有地址、命令、数据信号发出的时间都严格参照系统时钟的某个前沿开始,接收方都采用系统时钟后沿时刻来进行判断识别;也有异步定时允许不同速度的设别和谐工作的特点。
    • 增设了一条 Wait 相应的信号线 例如:某个半同步总线总是从某个始终开始,在每个时钟到来时,采样Wait信号,如果无效,则说明数据没有准备好;直到检测到有效,再去数据线上取数据
    • 适合系统工作速度不高,但是包含了许多速度差异较大的各类设备组成的简单系统
    • 优点:控制方式比异步简单,各个模块在系统时钟的控制下同步工作,可靠性高
    • 缺点:系统时钟频率不能太高
  • 分离式定时方式 :上面三个方式,从设备 准备数据的阶段里,总线处于空闲阶段,存在优化空间,于是提出了此方式
    • 将总线事务分为 请求应答 两个子过程。
    • 在第一个子过程中,主设备 A 获得总线使用权后,将命令、地址等信息发到总线上,然后被设备B接受。 一旦主设备发送完,立即释放总线,供其它设备用
    • 在第二个子过程中,设备B 收到设备A 发来得相关信息后,将A需要的数据准备好,然后申请总线使用权, 一旦获准,便通过总线发送到设备A
    • 这两个子过程都只有单方向的信息流,每个设备都变为主设备

某存储器总线宽度为 64 位,总线时钟频率为 \(1GHz\),在总线上传输一个数据货地址需要一个时钟周期,不支持突发传送方式,若通过该总线连接CPU和主存,主存每次准备一个64位数据需要6ns,主存块大小为 32B,则读取一个主存块所需要的时间为?

Note

解析 每次传输需要经过传输地址、准备数据、传输数据3个阶段。分别需要时间为:1ns(时钟频率为1GHz,所以时钟周期为1ns)、6ns、1ns。 总线宽度为64位,所以每次传输的数据为64位,主存块大小为32B,所以读取一个主存块需要传输4次,即 \(8ns\times 4=32ns\)

第七章 I/O 系统

I/O 接口

主机和外设之间的交接界面。可以理解为一个统一调度层

I/O 接口的功能

  1. 进行地址译码和设备选择。 CPU送来选择外设的地址码之后,接口对地址进行译码以产生设备选择信息
  2. 实现主机和外设的通信联络控制。 解决主机和外设的时序配合
  3. 实现数据缓冲 :CPU 与外设之间的速度往往不匹配,消除速度差异,接口必须设置数据缓冲寄存器,避免丢失数据
  4. 信号格式转换 :外设与主机的电平、数据格式都可能存在问题,接口提供转换功能
  5. 传送控制命令和状态信息 :CPU要启动某外设的时候,通过接口中的命令寄存器向外设发送启动命令;外设准备就绪之后,将准备好的状态信息送回接口中的状态处理器。外设向CPU提出中断请求时,CPU也应有相应的响应信号反馈给外设

I/O 接口的基本结构

pasted-image-20260114114521.png

  • I/O接口在主机侧通过I/O总线与内存、CPU相连。
  • 数据缓冲寄存器 用来暂存与CPU或内存之间传送的数据信息
  • 状态寄存器 用来记录接口和设备的状态信息
  • 控制寄存器 用来保存CPU对外设的控制信息
  • I/O接口中的数据线、地址线、控制线和总线的一样,不做赘述

I/O 接口类型

  • 按照 数据传送方式 - 并行接口:一字节或一个字的所有位同时传送
    • 串行接口:一位一位地有序传送
  • 按照 主机访问I/O设备的控制方式
    • 程序查询接口
    • 中断接口
    • DMA接口
  • 按照 功能选择的灵活性
    • 可编程接口:通过编程改变接口功能
    • 不可编程接口

I/O 端口 : I/O接口电路中可以被CPU直接访问的寄存器。有数据端口状态端口控制端口 - CPU 能够对数据端口中的数据进行 读/写操作 ;但对状态端口中的外设状态只能进行 读操作 ;对控制段口只能 写操作

端口和接口完全不同。端口是只接口电路中可以进行读/写的寄存器 I/O 端口的编址 端口想要被CPU访问,就必须对各个端口进行编址,每个端口对应一个 端口地址

对I/O端口的编址方式有与存储器 独立编址统一编制 两种

  • 独立编址 :又称为 I/O映射方式,是指对所有的I/O端口单独进行编址。I/O端口的地址空间和主存的地址空间是两个独立的地址空间,范围可以重叠。即 相同的地址可能属于不同的地址空间 。所以需要专门的I/O指令来表明访问的是什么
    • 优点:I/O端口数比主存单元少的多,只需要少量的地址线,使得I/O端口译码简单, 寻址速度更快 ;专用的I/O指令,可使得程序更加清晰,便于理解和检查
    • 缺点:I/O指令少,程序设计灵活性差;CPU需要提供单独的存储器控制信号,增大了控制的复杂性
  • 统一编址 :也称为 存储器映射方式,是指把主存地址空间分出一部分给I/O端口进行编址,I/O端口和主存单元在同一地址空间的不同分段中,即 根据地址范围就能区分访问的是I/O端口还是主存单元
    • 优点:不需要专门的I/O指令,CPU访问I/O的操作更加灵活和方便
    • 缺点:主存可用容量变小;译码电路复杂,降低译码速度

  • 统一编址区分存储单元和I/O设备的是 不同的地址码
    • I/O的编址方式采用统一编址方式时,进行输入/输出的操作指令是 访存指令
    • 统一编址方式下,直接使用指令系统中的访存指令来完成输入/输出操作
    • 独立编址时,则需要使用专门的输入/输出操作
  • 注意,中断请求信号的发送是 外设-CPU
  • 主机和外设之间的连接通路: CPU和主存——I/O总线——I/O接口——通信总线(电缆)——外设

I/O 方式

本节讲主机和I/O设备之间如何进行数据传送

输入/输出系统实现主机与I/O设备之间的数据传送,可以采用不同的控制方式,各种方式在代价、性能、解决问题的着重点等各方面各不相同,常用的I/O方式有 程序查询程序中断DMA


程序查询方式

信息交换的控制直接由 CPU 执行程序实现。程序查询方式接口中设置一个数据缓冲寄存器和一个设备状态寄存器(数据端口/状态端口)

主机进行I/O操作时,先读取设备的状态并根据设备状态决定下一步操作是数据传送还是等待

工作流程如下:

  1. CPU执行初始化程序,并设置传送参数
  2. 向I/O接口发出命令字,启动I/O设备
  3. 从外设接口读取其状态信息
  4. CPU周期或持续地查询设备状态,直到外设准备就绪
  5. 传送一次数据
  6. 修改地址和计数器参数
  7. 判断传送是否结束,未结束则转第三步,直到计数器为0 pasted-image-20260114140618.png

然后 根据4中查询方式的不同,程序查询方式分为下面两类 - 独占查询:一旦设备被启动,CPU就完全用于I/O操作。此时的外设和CPU完全串行工作 - 定时查询:CPU周期性查询接口状态,每次等到条件满足才进行一个数据的传送,传送完成后返回到用户程序。

假设计算机的主频为 500MHz,CPI为4,某外设的数据率为 2MB/s,I/O接口中有一个 32 位数据缓冲寄存器,采用定时查询方法,每次I/O都执行10条指令。外设最多间隔多久查询一次不会丢失数据?CPU用于外设I/O的时间占CPU总时间的百分比是多少?

Note

解析 必须在外设传输完端口大小的数据时访问端口,从而防止数据未被及时读取而丢失。 外设准备 32 位数据所用时间为 \((4B)/(2MB/s)=2\mu s\),所以最多每隔 \(2\mu s\)就必须查询一次 那么每秒要查询的次数就是 \(\dfrac{1s}{2\mu s}=5\times 10^5\),每秒CPU用于外设的时间至少为 \(5\times 10^5\times 10\times 4=2\times 10^7\) 个时钟周期,占整个CPU时间的 \(\dfrac{2\times10^7}{500M}=4\%\)


程序中断方式

程序中断 是指在计算机执行程序的过程中,出现某些急需处理的异常情况或者特殊请求,CPU暂时中止现行程序,而转去对这些异常情况或者特殊情况进行处理,处理完毕后再返回到原程序的断点处,继续执行原程序。

程序中断的功能有

  • 实现CPU与I/O设备的并行工作
  • 处理硬件故障和软件错误
  • 实现人机交互,用户干预机器需要用到中断系统
  • 实现多道程序、分时操作,多道程序的切换需要借助于中断系统
  • 实时处理需要借助中断系统来实现快速响应
  • 实现应用程序和操作系统(管态程序)的切换,称为 软中断
  • 多处理器系统中各个助力器之间的信息交流和任务切换

Tip

程序中断的思想 CPU 在程序中事先安排好,在某个时机启动外设,然后 CPU 继续执行当前程序,不需要像查询方式那样一直等待外设准备就绪。 当 外设完成数据传送的准备工作后,会 主动向 CPU 发出中断请求。在 可以响应中断的条件下,CPU 会 暂时中止正在执行的程序,转去执行中断服务程序(ISR)为外设服务。 在 中断服务程序中,完成 一次主机与外设之间的数据传送。传送完成后,CPU 返回原来的程序继续执行。 此时,外设和 CPU 又开始并行工作。 CPU 不等外设,外设准备好后主动打断 CPU,CPU 处理完再回来继续执行,实现并行提高效率。 pasted-image-20260114144734.png

程序中断的工作流程 - 中断请求 :是指 中断源向 CPU 发出的中断申请信号 。一台计算机系统中通常允许有多个中断源,每个中断源都可以独立向 CPU 提出中断请求。 - 中断源:指请求 CPU 中断的设备或事件,可以是外部设备,也可以是内部异常事件 - 中断请求标志:为区分不同中断源,系统为每个中断源设置中断请求标志,中断请求标志通常由触发器构成 - 中断请求标志寄存器:多个中断请求标志可集中组成中断请求标志寄存器,该寄存器既可以集中设置在 CPU 内部,也可以分散设置在各中断源中 - 中断又可分为 可屏蔽中断不可屏蔽中断 - 可屏蔽中断:通过 INTR 线发出,优先级较低,在关中断状态下不被 CPU 响应 - 不可屏蔽中断:通过 NMI 线发出,优先级最高,用于处理紧急或重要事件,如电源掉电、硬件故障等,即使在关中断状态下也会被 CPU 响应 - 中断响应判优 : - 中断响应:是指 CPU 对中断请求作出响应并转入中断处理的过程 。 - 中断响应优先级:是指当 多个中断请求同时存在时,CPU 决定先响应哪一个中断请求的顺序 。 - 中断判优:由于中断请求到达时间是随机的,需要通过中断判优机制确定响应顺序。判优可由硬件实现,也可由软件查询实现 - 一般优先级原则 - 不可屏蔽中断 > 可屏蔽中断 - 内部异常 > 外部中断 - 硬件故障 > 软件中断 - DMA中断 > I/O中断 - I/O设备中:高速设备 > 低速设备;输入设备 > 输出设备;实时设备 > 普通设备 - CPU响应中断的条件 :满足下面的条件才会响应 - 至少有一个中断源提出中断请求 - CPU 允许中断,即处于开中断状态(异常和不可屏蔽中断不受此限制) - 当前指令执行结束,且没有更紧急的任务(异常不受该条件限制) - 中断响应过程 :CPU 决定响应中断后,会自动完成一系列操作,这些操作通常称为“中断隐指令”。它不是指令系统中的真实指令,而是由硬件直接完成的操作。 - 关中断:防止在保存断点和现场过程中被更高级中断打断 - 保存断点:将原程序的断点信息保存起来 - 异常和中断的区别:异常:当前指令未成功执行,断点为当前指令地址;中断:断点为下一条将要执行的指令地址 - 引出中断服务程序:识别中断源并取得中断服务程序入口地址,将入口地址送入程序计数器 PC,转入中断服务程序执行 - 中断向量 ** :中断系统按 ** 是否提供中断服务程序入口地址 ,可分为两类: - 非向量中断:采用软件查询方式确定中断源 - 向量中断:每个中断源对应一个唯一的中断类型号;每个中断类型号对应一个中断服务程序;中断服务程序的入口地址称为中断向量 - 中断处理过程 :中断处理过程是在中断服务程序中完成的,其典型流程如下: - 关中断 - 保存断点 - 中断服务程序寻址 - 保存现场和屏蔽字 - 现场信息指用户可见的工作寄存器内容,必须由软件显式保存 - 断点信息由 CPU 自动保存 - 开中断:允许更高优先级中断请求得到响应,实现中断嵌套 - 执行中断服务程序:这是中断请求的根本目的 - 关中断:防止在恢复现场和屏蔽字时被打断 - 恢复现场和屏蔽字:将系统状态恢复到中断前 - 开中断并执行中断返回:中断返回指令使程序返回到原程序断点处继续执行 pasted-image-20260114151128.png


多重中断和中断屏蔽技术 - 单重中断 :是指 CPU 在执行某个中断服务程序的过程中,即使出现新的、优先级更高的中断请求,也不再响应 ,而是等当前中断服务程序执行完毕后再统一处理。 - 多重中断 :又称中断嵌套,是指 CPU 在执行某个中断服务程序的过程中,如果出现新的、优先级更高的中断请求,CPU 会暂停当前中断服务程序,转而处理新的中断 ,待处理完成后再返回继续执行原中断服务程序。 - 基本思想:高优先级中断可以打断低优先级中断的处理,中断服务程序可以嵌套执行 - 典型执行过程说明: > CPU 在执行主程序时发生中断请求 1
>主程序未屏蔽任何中断,因此 CPU 响应中断请求 1
>将主程序的断点压栈,转入执行中断服务程序 1
>在执行中断服务程序 1 时,又发生中断请求 2
>且中断请求 2 的处理优先级高于中断请求 1
>CPU 暂停中断服务程序 1 的执行
>将中断服务程序 1 的断点压栈,转而执行中断服务程序 2
>若在执行中断服务程序 2 时又发生优先级更高的中断请求 3
>CPU 同样暂停中断服务程序 2,转而执行中断服务程序 3
>当中断服务程序 3 执行完成后
>CPU 从栈顶取出断点信息,返回中断服务程序 2 的断点(K3 + 1)继续执行
>中断服务程序 2 执行完成后
>CPU 再返回中断服务程序 1 的断点(K2 + 1)继续执行
>最终所有中断服务程序完成后
>CPU 返回主程序的断点(K1 + 1)处继续执行 - 实现多重中断的条件 - 在中断服务程序中提前设置开中断指令,即在保存现场后允许中断 - 优先级高的中断源必须能够中断优先级低的中断源,即系统中存在明确的中断优先级划分 - 中断处理优先级的动态调整能力,多重中断的处理优先级可以通过中断屏蔽技术动态调整 - 中断处理优先级 :指多重中断时中断服务程序的执行优先顺序 - 中断屏蔽技术 :通过设置屏蔽位,决定某些中断是否允许被响应;可用于动态调整中断处理优先级 - 屏蔽触发器(MASK) :每个中断源对应一个屏蔽触发器;MASK = 1 表示屏蔽该中断源的请求 - 屏蔽字寄存器 :所有屏蔽触发器组合在一起形成屏蔽字寄存器,屏蔽字寄存器的内容称为屏蔽字

设某机有 4 个中断源 A、B、C、D,其硬件排队优先次序为 A > B > C > D,现要求将中断处理次序改为 D > A > C > B,写出每个中断源对应的屏蔽字。

Note

解析 在中断处理次序改为 D > A > C > B 后,D 具有最高优先级,可以屏蔽其他所有中断,且不能中断自身,因此 D 对应的屏蔽字为 1111;A 具有次高优先级,只能被 D 中断,因此 A 对应的屏蔽字为 1110。以此类推,得到 4 个中断源的屏蔽字 pasted-image-20260114152048.png


DMA方式

完全由硬件进行组成信息传送的控制方式,它具有程序中断方式的优点,即在数据准备阶段,CPU与外设并行工作。DMA方式在外设与内存之间开辟一条 直接数据通路 信息不再经过CPU,减小了CPU的开销

这种方法适用于磁盘、显卡、声卡、网卡等高速设备大批量数据的传送,它们的硬件开销较大。

DMA方式的特点 DMA方式传送数据不需要经过CPU,因此不必中断现行程序,I/O与主机并行工作,程序与传送并行工作。特点如下:

  • 使主存与CPU的固定联系脱钩,主存既可被CPU访问,又可以被外设访问
  • 在数据块传送时,主存地址的确定、传送数据的技术等都由硬件电路直接实现
  • 主存中要开辟专用缓冲区,以及时提供和接受外设的数据
  • DMA传送速度快,CPU和外设并行工作,提高系统效率
  • DMA在传送开始前要通过程序进行预处理,结束后通过中断方式进行后处理

DMA控制器组成 对数据传送进行控制的硬件称为 DMA 控制器(DMA接口)。主要功能如下:

  • 接受外设发出的DMA请求,并向CPU发出总线请求
  • CPU响应并发出总线响应信号,DMA接管总线控制权,进入DMA操作周期
  • 确定传送数据的主存起始地址及长度,自动修改主存地址技术和传送长度计数
  • 规定数据在主存和外设间的传送方向,发出读/写等控制信号,执行数据传送操作
  • 向CPU报告DMA操作结束 pasted-image-20260114161148.png

DMA的传送方式

DMA与CPU通常采用以下3种方式使用主存

  • 停止CPU访存 :当I/O设备有DMA请求的时候,由DMA接口向CPU发送一个停止信号,让CPU放弃总线控制权,直到DMA传送一块数据结束pasted-image-20260114162114.png
    • 优点:控制简单,适用于数据传输速率很高的I/O设备实现成组数据的传送
    • 缺点:DMA在访问主存的时候,CPU基本不工作
  • 周期挪用 :由于I/O访存的优先级高于CPU访存,因此由I/O设备挪用一个存取周期,传送完一个数据字立即释放总线。是一种 单字传送方式 pasted-image-20260114162121.png
    • 优点:实现了I/O传送,又较好的发挥了主存与CPU的效率
    • 缺点:每挪用一个主存周期,DMA接口都要申请、建立和规划总线控制权
  • DMA与CPU交替结构 :将CPU工作周期分成两个时间片,一个给CPU访存,另一个给DMA访存,这样在每个CPU周期内,两者可以轮流访存pasted-image-20260114162350.png
    • 优点:不需要总线控制权的申请、建立和归还过程,有很高的传送速率
    • 缺点:相应的硬件逻辑变得更加复杂 DMA传送过程 pasted-image-20260114162606.png

DMA方式和中断方式的区别

  • 中断方式是程序的切换,需要保护和恢复现场;而 DMA 方式不打断现行程序,无需保护现场,除了预处理和后处理,其他时候不占用任何 CPU 资源。
  • 对中断请求的响应只能发生在每条指令执行结束时(执行周期后);而对 DMA 请求的响应可以发生在任意一个机器周期结束时(取指、间址、执行周期后均可)。
  • 中断传送过程需要 CPU 的干预,而 DMA 传送过程不需要 CPU 干预,因此数据传输速率非常高,适合于高速外设的大批数据传送。
  • DMA 请求的优先级高于中断请求。
  • 中断方式具有处理异常事件的能力,而 DMA 方式仅局限于大批数据的传送。
  • 从数据传送来看,中断方式靠程序传送,DMA 方式靠硬件传送。

  • 设置中断排队判优逻辑的目的是 使同时提出的请求中的优先级别最高者得到及时响应
  • 中断服务程序一般时操作系统模块,中断向量方法可以提高中断源的识别速度,中断向量是中断服务程序的入口地址
  • 可以提出中断的有:外部事件、虚拟存储器失效、浮点数运算上溢
  • 中断响应发生在一条指令执行之末
  • I/O接口中设置中断触发器保存外设发出的中断请求,是因为 CPU无法对发生的中断请求立即进行处理
  • 在中断响应周期中,由 中断隐指令 将允许中断触发器置0
  • CPU响应中断时,最先完成的步骤是 关中断
  • 设置中断屏蔽标志可以改变 多个中断服务程序执行完的次序
  • CPU响应DMA请求的条件是当前 机器周期 执行完
  • 在DMA方式下,数据从内存传送到外设经过的路径是 内存->数据总线->DMAC->外设 - 采用周期挪用进行DMA数据传送时,每传送一个数据要占用一个 存取周期 的时间
  • 多重中断在保护现场的时候 关中断 ,中断处理期间 开中断
  • 外设准备数据的时间要 大于 中断处理时间