计算机系统概述

计算机系统的层次结构

下列层次结构由低到高:

  • 硬件部分:

    • 微程序机器 M0(微指令系统):由硬件直接执行微指令。
    • 传统机器 M1(机器语言机器):二进制机器语言直接在 M1 上执行。
  • 软件部分:

    • 虚拟机器 M2(操作系统机器):用机器语言解释操作系统。
    • 虚拟机器 M3(汇编语言机器):将汇编语言程序先由汇编程序翻译成机器语言程序,再在 M1 上执行。
    • 虚拟机器 M4(高级语言机器):将高级语言程序先由编译程序翻译成汇编语言程序,再在 M2、M1(或直接到 M1)上执行。

冯·诺依曼结构的基本思想

最重要思想:存储程序

工作方式: 把要完成的工作编写为程序,将程序和数据送入主存并执行。程序一旦启动,计算机能够自动完成逐条取出指令和执行指令的任务。(控制流驱动)

特点:

  1. 采用 “存储程序” 的工作方式;
  2. 由五大部件组成(运算器、存储器、控制器、输入设备、输出设备);
  3. 指令和数据用二进制代码表示;
  4. 指令和数据以同等地位存储在存储器中,形式上两者没有区别,但计算机应能区分;
  5. 指令由操作码和地址码组成,可按地址访问并顺序执行指令;
  6. 以运算器为中心(现在一般以存储器为中心)。

CPU 区分指令和数据,依据是指令周期的不同阶段。

以运算器为中心的硬件框图(冯·诺依曼机)

以存储器为中心的硬件框图(现代计算机)

现代计算机硬件结构

存储器: 存放指令和数据,并提供外界对指令和数据的访问。

对外接口:

  • 输出:内存地址寄存器 MAR
  • 输入:内存数据寄存器 MDR

存储元:存储二进制的电子原件,每个存储元可存一位二进制。
存储单元:存放一个存储字的所有存储元集合。
存储字:存储单元中二进制代码的组合。
存储字长:存储单元中二进制代码的位数。

运算器: 由累加器(ACC),乘商寄存器(MQ),操作数寄存器(X)和算术逻辑单元(ALU)组成。

对外接口:

  • 输入:操作数
  • 输出:操作结果

控制器: 控制单元(CU)通过分析指令给出控制信号,指令寄存器(IR)存放当前要执行的指令,程序计数器(PC)存放下一条指令的地址,指令译码器(ID)对指令进行翻译。

对外接口:

  • 输入:指令
  • 输出:指令地址和控制信号

指令流通常是从主存流向控制器。

计算机语言

机器语言: 计算机唯一可以直接识别和执行的语言,机器指令由二进制表示。

汇编语言: 由汇编指令构成,用助记符和符号来表示,与机器指令一一对应。

高级语言:

  • 一条语句对应多条指令。
  • 处理逻辑:顺序结构、选择结构、循环结构。
  • 编译方式:预处理、编译器、汇编器、链接器。
  • 解释方式:将语句逐条翻译成机器指令并立刻执行,不生成目标文件。

计算机性能指标

字长:(都是字节的整数倍)

  • 机器字长:计算机能直接处理的二进制数据的位数,等于 CPU 内部用于整数运算的数据通路的宽度,运算器位数和通用寄存器宽度。
  • 指令字长:一个指令字中包含的二进制代码位数。
  • 存储字长:一个存储单元存储的二进制代码位数。

带宽:

  • 数据通路带宽:数据总线一次能传送的信息位数。
  • 总线带宽:总线宽度 × 总线工作效率

主存容量:

  • 主存储器的最大容量 = 存储单元个数(MAR 位数)× 存储字长(MDR 位数)

运算速度:

  • 吞吐量:单位时间内处理请求的数量。
  • 响应时间:CPU 时间 + 等待时间(磁盘访问、存储器访问、IO 操作、操作系统开销)。
  • CPU 时钟周期:CPU 的最小时间单位,每个动作都至少需要一个时钟周期,主频倒数
  • CPI:执行一条指令所需的时钟周期数。
  • CPU 执行时间:(指令条数 × CPI) / 主频
  • 计算能力:每秒执行指令数的单位是 KIPS、MIPS;每秒执行浮点运算数的单位是 KFLOPS、MFLOPS、GFLPOPS、TFLOPS、PFLOPS、EFLOPS、ZFLOPS(每个差 3 位),是用来衡量科学计算计算机的系统性能的标准。

数据的表示和运算

定点数的表示

有符号数: 最高位的 0/1 表示正/负,称为符号位。

无符号数: 整个机器字长全部二进制位均为数值位,无符号位。

计算机中,表示地址时采用无符号数。

原码: 最高位为符号位,数值部分不变。

对于整数:

[x]={0,x0x<2n2nx2n<x0[x]_{\text{原}} = \begin{cases} 0,x & 0 \leq x < 2^n \\ 2^n - x & -2^n < x \leq 0 \end{cases}

对于小数:

[x]={x0x<11x1<x0[x]_{\text{原}} = \begin{cases} x & 0 \leq x < 1 \\ 1 - x & -1 < x \leq 0 \end{cases}

反码: 正数的反码即为其自身,负数的反码为其自身除符号位外,其余各位取反。

对于整数:

[x]={0,x0x<2n(2n+11)x2n<x0(mod2n+11)[x]_{\text{反}} = \begin{cases} 0,x & 0 \leq x < 2^n \\ (2^{n + 1} - 1) - x & -2^n < x \leq 0 \pmod{2^{n + 1} - 1} \end{cases}

对于小数:

[x]={x0x<1(22n)+x1<x0(mod22n)[x]_{\text{反}} = \begin{cases} x & 0 \leq x < 1 \\ (2 - 2^{-n}) + x & -1 < x \leq 0 \pmod{2 - 2^{-n}} \end{cases}

补码: 正数的补码即为其自身,负数的补码为其反码加 1。补码的补码即为原码。

对于整数:

[x]=2n+1+x(mod2n+1)[x]_{\text{补}} = 2^{n + 1} + x \pmod{2^{n + 1}}

对于小数:

[x]=2+x(mod2)[x]_{\text{补}} = 2 + x \pmod{2}

原码的补码即为能和其相反数相加,通过溢出使计算结果变为 0 的二进制码。

移码: 数值加一个偏置常数,通常再真值 xx 上加上 2n2^nnn 为整数的位数。(便于浮点数加减运算时对阶)

[x]=2n+x[x]_{\text{移}} = 2^n + x

数据存储时的字节排列:

  • 大端方式:从最高有效字节到最低有效字节的顺序存储数据。(从左到右,符合正常思维)
  • 小端方式:从最低有效字节到最高有效字节的顺序存储数据。(从右到左,便于机器)

例:若数据在存储器中采用以低字节地址为字地址的存放方式,则十六进制数 12345678H,按照字节地址由小到大的顺序依次存为 78H 56H 34H 12H。

范围和真值零:

定点整数:

  • 原码:(2n1)x2n1-(2^n - 1) \leq x \leq 2^n - 1,最大值为 0,1111110,111 \cdots 111,最小值为 1,1111111,111 \cdots 111,真值零为 0,0000000,000 \cdots 0001,0000001,000 \cdots 000.
  • 反码:(2n1)x2n1-(2^n - 1) \leq x \leq 2^n - 1,最大值为 0,1111110,111 \cdots 111,最小值为 1,0000001,000 \cdots 000,真值零为 0,0000000,000 \cdots 0001,1111111,111 \cdots 111.
  • 补码:2nx2n1-2^n \leq x \leq 2^n - 1,最大值为 0,1111110,111 \cdots 111,最小值为 1,0000001,000 \cdots 000,真值零为 0,0000000,000 \cdots 000.

定点小数:

  • 原码:(12n)x12n-(1 - 2^n) \leq x \leq 1 - 2^n,最大值为 0.1111110.111 \cdots 111,最小值为 1.1111111.111 \cdots 111,真值零为 0.0000000.000 \cdots 0001.0000001.000 \cdots 000.
  • 反码:(12n)x12n-(1 - 2^n) \leq x \leq 1 - 2^n,最大值为 0.1111110.111 \cdots 111,最小值为 1.0000001.000 \cdots 000,真值零为 0.0000000.000 \cdots 0001.1111111.111 \cdots 111.
  • 补码:1x12n-1 \leq x \leq 1 - 2^n,最大值为 0.1111110.111 \cdots 111,最小值为 1.0000001.000 \cdots 000,真值零为 0.0000000.000 \cdots 000.

浮点数的表示

阶码和尾数: 浮点数的阶码为常用补码或移码表示的定点整数,反映浮点数的表示范围及小数点的实际位置;尾数为常用原码或补码表示的定点小数,数值部分的位数反映浮点数的精度。

浮点数的真值:

N=±rE×MN = \pm r^E \times M

其中 rr 为阶码的底,通常为 2。

浮点数的表示范围:(关于原点对称)

设阶码的位数为 mm,尾数的位数为 nn,则

  • 最大正数:22m1×(12n)2^{2^m - 1} \times (1 - 2^{-n})
  • 最小正数:2(2m1)×(2n)2^{-(2^m - 1)} \times (2^{-n})
  • 最大负数:2(2m1)×(2n)-2^{-(2^m - 1)} \times (2^{-n})
  • 最小负数:22m1×(12n)-2^{2^m - 1} \times (1 - 2^{-n})
  • 上溢:阶码 > 最大阶码
  • 下溢:阶码 < 最小阶码(按机器零处理)

规格化浮点数: 为了表示更多有效数字,规定规格化数的小数点前为 1,即

N=±rE×1.MN = \pm r^E \times 1.M

原码规格化数的最高位一定是 1,补码规格化数的尾数最高位一定与尾数符号位相反。

规格化方式:

  • 左规:数值位最高位无效时,通过尾数算术左移、阶码减 1 的方式处理,直到尾数最高数值位有效时停止。
  • 右规:若采用双符号位表示尾数,则当运算后尾数 “假溢出” 时,可以通过尾数右移、阶码加 1 的方式处理。

IEEE 754 标准:

N=±2E×1.MN = \pm 2^E \times 1.M

短浮点数:

  • 数符 1 位 + 阶码 8 位 + 尾数 23 位 = 32 位(偏置值 127)
  • 范围:从 1×211271 \times 2^{1 - 127}1.111111×22541271.111 \cdots 111 \times 2^{254 - 127}

长浮点数:

  • 数符 1 位 + 阶码 11 位 + 尾数 52 位 = 64 位(偏置值 1023)
  • 范围:从 1×2110231 \times 2^{1 - 1023}1.111111×2204610231.111 \cdots 111 \times 2^{2046 - 1023}

特殊数的表示:

阶码 尾数 表示
0 任意非 0 二进制数 非规格化浮点数
0 全 0 0
255 任意非 0 二进制数 NaN
255 全 0 \infty

IEEE 754 隐含尾数最高位 1,而规格化浮点数不隐含。

加法器

一位全加器:

  • 输入:加数 AABB,低位进位 CinC_{in}
  • 输出:和 S=ABCinS = A \oplus B \oplus C_{in},高位进位 Cout=AB+(AB)CinC_{out} = A \cdot B + (A \oplus B) \cdot C_{in}

并行加法器的快速进位链:

  • 串行进位链: n 个全加器相连,进位触发器用来寄存进位信号,每一级进位依赖于前一级进位,进位信号逐级形成。
  • 并行进位链: 各级进位信号同时形成,又称先行进位,各进位之间无等待,相互独立并同时产生,效率比串行进位链更高。

n 位带标志加法器:

  • 溢出标志 OF:有符号数的加减运算是否产生了溢出,OF = 最高位产生的进位 + 次高位产生的进位。
  • 符号标志 SF:有符号数加减运算结果的正负性,SF = 最高位的本位和。
  • 零标志 ZF:运算结果是否为 0。
  • 进/借位标志 CF(仅对无符号加减法有意义):加法时为进位标志,减法时为借位标志,CF = 最高位进位 \oplus sub(减法 sub = 1,加法 sub = 0)。

定点数的运算

移位运算:

算术移位:符号位保持不变,仅对数值位进行移位。添补代码的规则如下:

  • 原码:补 0
  • 反码:对正数补 0,对负数补 1
  • 补码:对正数补 0,对负数右移时补 1,左移时补 0

逻辑移位:可以看作是对无符号数的算术移位,移位时补 0。

循环移位:

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

原码的加减运算:(符号不参与运算)

加法准则:

  • 符号相同:绝对值相加,符号不变。
  • 符号不同:绝对值大的减去绝对值小的,符号取绝对值大的。

减法准则:减数符号取反,做原码加法运算。

补码的加减运算:(符号参与运算)

对于整数:

[A+B]=[A]+[B](mod2n+1)[AB]=[A][B](mod2n+1)\begin{aligned} [A + B]_{\text{补}} &= [A]_{\text{补}} + [B]_{\text{补}} \pmod{2^{n + 1}}\\ [A - B]_{\text{补}} &= [A]_{\text{补}} - [-B]_{\text{补}} \pmod{2^{n + 1}} \end{aligned}

对于小数:

[A+B]=[A]+[B](mod2)[AB]=[A][B](mod2)\begin{aligned} [A + B]_{\text{补}} &= [A]_{\text{补}} + [B]_{\text{补}} \pmod{2}\\ [A - B]_{\text{补}} &= [A]_{\text{补}} - [-B]_{\text{补}} \pmod{2} \end{aligned}

补码的溢出判断:

单符号位:

  • 参与运算的两个数符号相同,其结果的符号与原数的符号不同,即为溢出。
  • 最高位进位与次高位进位不同,即为溢出。

双符号位(存储时仅单符号位,进入 ALU 后双符号位):

在乘除等运算中,为了不丢弃中间的溢出结果,多符号位可以保留符号位和溢出的数值位,保留正确的中间结果。当符号位不同时,最高位为真正符号。

  • 00:正数,无溢出;
  • 01:正溢出;
  • 10:负溢出;
  • 11:负数,无溢出。

原码的乘法运算:

  • 乘法运算可用加法和移位实现。由乘数的末位决定被乘数是否与原部分积相加,然后右移 1 位形成新的部分积,同时乘数由移 1 位,空出高位存放部分积的低位。被乘数只与部分积的高位相加。
  • 原码一位乘法:符号位通过异或确定;数值部分通过被乘数和乘数绝对值的 n 轮加法、移位完,根据当前乘数中参与运算的位(ACC)确定加什么。若当前运算位为 1,则 (ACC) + |x|;若当前运算位为 0,则 (ACC) + 0。每轮加法后 ACC、MQ 的内容统一逻辑右移

例:设机器字长为 5 位(含 1 位符号位,n=4n = 4),x=1.1101,y=0.1011x = 1.1101, y = 0.1011,用原码一位乘法求解 xyx \cdot y 的过程如下:

解:

[x]=00.1101,[y]=00.1011[x]_{\text{原}} = 00.1101, [y]_{\text{原}} = 00.1011

符号位 Ps=xsys=10=1P_s = x_s \oplus y_s = 1 \oplus 0 = 1,得 xy=1.10001111x \cdot y = 1.10001111.

补码的乘法运算:

补码一位乘法:

  • 进行 n 轮加法和移位,最后再多进行一次加法;
  • 每次加法可能 +0+0+[x]+[x]_{\text{补}}+[x]+[-x]_{\text{补}}
  • 每次移位执行补码得算术右移;
  • 符号位参与运算。

例:设 x=1.1101,y=0.1011x = 1.1101, y = 0.1011,用补码一位乘法求解 xyx \cdot y 的过程如下:

解:

[x]=11.0011,[x]=00.1101,[y]=0.1011[x]_{\text{补}} = 11.0011, [-x]_{\text{补}} = 00.1101, [y]_{\text{补}} = 0.1011

原码的除法运算:

恢复余数法:

  1. 取除数和被除数的绝对值进行运算,商符由两数符号位异或形成;
  2. 若余数(被除数)为正,表示够减,商上 1,左移(逻辑左移)一位后加上除数的补码;若余数(被除数)为负,表示不够减,商上 0,恢复余数(加上除数),左移一位后加上除数取反后的补码;
  3. 重复上一步骤 n 次;
  4. 若最后一步余数为负,则需要恢复余数。

不恢复余数法(加减交替法):

  • 若余数(被除数)为负,表示不够减,商上 0,左移一位,加上除数的补码。

例:设 x=0.1011,y=0.1101x = 0.1011, y = 0.1101,写出用原码加减交替除法求 x/yx / y 的过程。

解:

x=0.1011,y=0.1101,[y]=0.1101,[y]=1.0011|x| = 0.1011, |y| = 0.1101, [|y|]_{\text{补}} = 0.1101, [-|y|]_{\text{补}} = 1.0011

补码的除法运算:

  1. 将除数和被除数转换为补码表示,符号位参与运算,商符在形成商值的过程中自动形成;
  2. 被除数和除数同号,则被除数减去除数;异号则被除数加上除数;
  3. 余数和除数同号,商上 1,余数左移一位后减去除数;余数和除数异号,商上 0,余数左移一位后加上除数;
  4. 重复上一步骤 n 次;
  5. 商的末位恒置 0。

浮点数的运算

浮点数的加减运算:

  1. 对阶:小阶看齐大阶,将阶码小的尾数右移一位,阶加一,直到两个数的阶码相等。
  2. 尾数求和
  3. 规格化:
    • 左规:结果为 +/-0.0…01xxx…xxx 时,需要左规,尾数左移一次,阶码减 1,直到第一个 1 移到小数点左边。
    • 右规:结果为 +/-1x.xxx…xxx 时,需要右规,尾数右移一次,阶码加 1,直到第一个 1 移到小数点左边。
  4. 舍入:在对阶和右规过程中,可能出现尾数末位丢失引起误差,需考虑舍入。
    • 0 舍 1 入法
    • 恒置 1 法
  5. 溢出判断:尾数溢出未必导致整体溢出,阶码溢出无法补救。

浮点数的乘除运算:

  1. 阶码采用补码定点加(乘法)减(除法)运算;
  2. 尾数乘除同定点运算;
  3. 尾数规格化;
  4. 尾数舍入;
  5. 阶码判溢出。

总线

总线基本概念

总线特点:

  • 分时:同一时刻只允许有一个部件向总线发送信息。
  • 共享:总线上可以挂接多个部件,各个部件之间相互交换的信息可以通过这组线路分时共享。

计算机使用总线结构的主要优点是便于实现积木化,同时减少了信息传输线的条数。

总线特性:

  • 机械特性:尺寸、形状、管教数、排列顺序
  • 电气特性:传输方向和有效的电平范围
  • 功能特性:每根传输线的功能(地址、数据、控制)
  • 时间特性:信号的时序关系

总线的分类:

  • 按总线功能分类:

    • 片内总线:在芯片内部元件之间提供连接。

    • 系统总线:计算机各部件之间的信息传输线。

      • 数据总线(双向):总线宽度反映一次能传送数据的位数,数据有指令、操作数、中断信号等。
      • 地址总线(单向):总线宽度反映最大的寻址空间。
      • 控制总线:有出(中断请求、总线请求),有入(存储器读、存储器写、总线允许、中断确认)。

      微型计算机中控制总线提供的完整信息是来自存储器和 I/O 设备的响应信号,和所有存储器和 I/O 设备的时序信号和控制信号。

    • 通信总线:在主机和 I/O 设备之间或计算机系统之间提供连接。

  • 按数据传输格式:

    • 串行总线:一条传输线(长距离传输,价格低廉)。
    • 并行总线:成本高,布线空间干扰。

总线的性能指标:

  • 总线宽度:数据线的根数。
  • 总线带宽(最高传输速率)= 总线工作频率 ×(总线宽度 / 8)= 一个总线周期的传输量 × (总线时钟频率 / 总线的时钟周期数)
  • 总线的传输周期:一次总线操作所需要的时间,由若干总线时钟周期构成。(申请分配阶段、寻址阶段、传输阶段、结束阶段)
  • 时钟同步/异步
  • 信号线数:地址线、数据线和控制线的总和。
  • 总线复用:地址线和数据线复用,可以减少信号线的数量。

总线结构

单总线结构: 将 CPU、主存、I/O 设备挂载到一组总线上。

双总线结构:

  • 主存总线:连接 CPU、主存、通道。
  • I/O 总线:用于在多个外部设备和通道间传输。

三总线结构:

  • 主存总线
  • I/O 总线
  • DMA 总线

三总线结构的另一种形式:

  • 局部总线
  • 系统总线
  • 扩展总线:连接更多 I/O 设备

四总线结构:

  • 局部总线
  • 系统总线
  • 将高速和低速的 I/O 设备分开

总线仲裁

总线仲裁是为了解决多个部件同时申请总线时的总线使用权分配问题。按照是否拥有总线控制权,设备可分为两种类型:

  • 主设备:获得总线控制权的设备,同一时刻只能有一个主设备控制总线传输操作。
  • 从设备:被主设备访问的设备,只能响应从主设备发来的各种总线命令。

总线仲裁方式分类:

  • 集中式:

    • 链式查询
    • 计数器查询
    • 独立请求方式
  • 分布式

集中仲裁方式的工作流程:

  1. 主设备发出请求信号;
  2. 若多个主设备同时要使用总线,则由总线控制器的判优、仲裁逻辑按一定的优先等级顺序确定哪个主设备能使用总线;
  3. 获得总线使用权的主设备开始传送数据。

链式查询方式:

特点:

  • 由获得总线控制权的设备发出 “总线忙” 信号。离总线控制器越近的部件,其优先级越高;离总线控制器越远的部件,其优先级越低。
  • 只需要少数几根线就能按一定优先次序实现总线控制,易于扩充设备。
  • 该方式对硬件电路的故障最敏感,且优先级别低的设备可能很难获得请求。

计数器查询方式:

特点:

  • 用一个计数器控制总线使用权,相对链式查询方式多了一组设备地址线,少了一根总线响应线 BGBG;它仍共用一根总线请求线。
  • 优先级设置较灵活,对故障不敏感,连线及控制过程较复杂。

工作原理:

  • 当总线控制器收到总线请求信号,判断总线空闲时,计数器开始计数,计数值通过设备地址线发往各个部件。
  • 当地址线上的计数值与请求使用总线设备的地址一致时,该设备获得总线控制权,同时终止计数器的计数及查询。

独立请求方式:

特点:

  • 每个设备均有一对总线请求线 B ⁣RiB\!R_i 和总线允许线 BGiBG_i
  • 优先次序控制灵活,但控制线数量多,总线控制更复杂。
  • 该方式的响应速度最快

工作原理:

  • 当总线上的部件需要使用总线时,经各自的总线请求线发送总线请求信号,在总线控制器中排队
  • 当总线控制器按一定的优先次序决定批准某个部件的请求时,给该部件发送总线响应信号。

分布仲裁方式: 不需要中央仲裁器,每个潜在的主模块都有自己的仲裁器和仲裁号,多个仲裁器竞争使用总线。

总线通信

总线通信控制主要解决通信双方如何获知传输开始和传输结束,以及通信双方如何协调和配合。

总线传输周期:

  • 申请分配阶段:主模块申请,总线仲裁决定。
  • 寻址阶段:主模块向从模块给出地址和命令。
  • 传输阶段:主模块和从模块交换数据。
  • 结束阶段:主模块撤销有关信息。

总线传输方式:

  • 串行传输:数据在单条 1 位宽的传输线上,一位一位地按顺序分时传送。成本低,速度慢,适合远距离数据传输。
  • 并行传输:数据在多条并行 1 位宽的传输线上,同时由源传送到目的地。成本高,速度快,适合近距离数据传输。

总线通信方式:

  • 同步通信:由统一时标控制数据传送。
  • 异步通信:采用应答方式,没有公共时钟标准。
  • 半同步通信:同步、异步相结合。
  • 分离式通信:充分挖掘系统总线每个瞬间的潜力。

同步通信方式:

特点:

  • 总线控制器采用一个统一的时钟信号来协调发送和接收双方的传送定时关系。
  • 成本低,速度慢,适合远距离数据传输。

异步通信方式:

特点:

  • 不采用时钟信号,只采用握手信号
  • 成本高,速度快,适合近距离数据传输。

半同步通信方式:

  • 同步:发送方用系统时钟前沿发信号;接收方用系统时钟后沿判断和识别。
  • 异步:增加一条 “等待” 响应信号 W ⁣ ⁣AIT\overline{W\!\!AIT},允许不同速度的模块和谐工作。

分离式通信方式:

  • 子周期 1:主模块申请占用总线,使用完后放弃总线的使用权。
  • 子周期 2:从模块申请占用总线,将各种信息发送至总线上。

特点:充分提高了总线的有效占用。

存储系统

存储器概述

存储器的分类:

  • 按存储介质分类:

    • 半导体存储器(主存、Cache):易失
    • 磁表面存储器(磁盘、磁带)
    • 磁芯存储器
    • 光存储器(光盘)
  • 按存取方式分类:

    • 存取时间与物理地址无关(随机访问):

      • 随机存取存储器(Random Access Memory,RAM)
      • 只读存储器(Read-Only Memory,ROM)
    • 存取时间与物理地址有关(串行访问):

      • 顺序存取存储器(Sequential Access Memory,SAM)
      • 直接存取存储器(Direct Access Memory,DAM)
  • 按在计算机中的作用分类:

    • 主存储器:

      • RAM:静态 RAM(SRAM)、动态 RAM(DRAM)
      • ROM:MROM、PROM、EPROM、EEPROM
    • 闪存(Flash Memory)

    • 高速缓冲存储器(Cache)

    • 辅助存储器:磁盘、磁带、光盘

存储器的层次结构:

存储器三个主要特性的关系:

缓存-主存层次和主存-辅存层次:

缓存-主存层次:

  • 目的:解决 CPU 和主存速度不匹配的问题。
  • 依据:缓存的速度比主存的速度块,只要将 CPU 近期要用的信息调入缓存,CPU 便可以直接从缓存中获取信息。主存和缓存之间的数据调用由硬件自动完成,对程序员透明。

主存-辅存层次:

  • 目的:解决存储系统的容量问题。
  • 依据:辅存的速度比主存的速度低,而且不能直接和 CPU 交换信息,但它的容量比主存大得多,可以存放大量暂时未使用的信息。当 CPU 需要用到这些信息时,再将辅存的内容调入主存,供 CPU 直接访问。主存和辅存之间的数据调用是由硬件和操作系统共同完成的。

辅存中的数据要调入主存后才能被 CPU 访问。

主存储器

主存的结构:

主存通过的总线的类型来识别信息是地址还是数据。

主存和 CPU 的联系:

主存的性能指标:

  • 存储容量 = 存储单元个数(MAR 位数)× 存储字长(MDR 位数)

  • 存储速度:数据传输率(主存带宽)= 数据带宽 / 存储周期。

    • 存取时间:从 CPU 送出内存单元的地址码开始,到主存读出数据并送到 CPU 所需时间。
    • 存取周期 = 存取时间 + 恢复时间:连续两次访问存储器所需的最小时间间隔。
  • 主存带宽(位/秒):数据传输率,每秒主存进出信息的最大数量。

存储单元地址的分配:

在存储芯片中,nn 根地址线对应 2n2^n 个存储单元,数据线的根数对应每个存储单元的位数,因此我们会用 “存储单元个数 × 存储字长” 的方式来称呼一个存储芯片,常见的有:

  • 8K × 1 位,即 213×12^{13} \times 1 位;
  • 8K × 8 位,即 213×82^{13} \times 8 位;
  • 64K × 16 位,即 216×162^{16} \times 16 位。

寻址方式: 设总容量为 1KB,字长为 4B,则

  • 按字节寻址:1K 个存储单元,每个单元 1B,10 根地址线;
  • 按字寻址:256 个存储单元,每个单元 4B,8 根地址线;
  • 按半字寻址:512 个存储单元,每个单元 2B,9 根地址线;
  • 按双字寻址:128 个存储单元,每个单元 8B,7 根地址线。

现代计算机通常按字节编址,即每个字节对应一个地址,此时主存容量即为包含的存储单元的总数。

半导体存储芯片

半导体存储芯片的基本结构:

片选线的作用:控制信号输入端,用于增加存储容量和并联使用器件。

半导体存储芯片的译码驱动方式:

  • 线选法:地址信号只须经过一个方向的译码就可以选中某一存储单元的所有位。适用于地址线较少的芯片。

  • 重合法:地址线分成两组,分别经行、列两个方向译码,只有行、列两个方向均选中的存储元才能进行访问。适用于地址线较多的芯片。

比较 SRAM 和 DRAM:

区别 SRAM DRAM
存储信息 触发器(双稳态 0/1) 电容(充/放电)
是否破坏性读出 非破坏性读出 破坏性读出
是否需要刷新 不需要 需要(电荷仅维持 2ms)
行/列地址输送 同时送 分两次(地址线复用,线数量减半)
运行速度
集成度 低(6 个逻辑元件) 高(1~3 个逻辑元件)
发热量/功耗
存储成本
主要用途 Cache 主存

DRAM 的刷新: DRAM 电容的电荷仅维持 1~2ms,必须进行刷新(每次读出一行数据重新写入,占用一个读写周期)。

  • 集中刷新:在规定的一个刷新周期内,对全部存储单元集中一段时间逐行进行刷新,此刻必须停止访问,这段时间称为 “死区”。
  • 分散刷新:对每行存储单元的刷新分散到每个存取周期内完成,没有 “死区”,但加长了系统的存取周期。
  • 异步刷新:是前两种方式的结合,既可缩短 “死区”,又充分利用最大刷新间隔。将刷新周期除以刷新次数,得到刷新时间间隔 t,每 t 秒刷新一次。

SRAM 和 DRAM 的芯片引脚:

  • SRAM:芯片引脚 = 地址线 + 数据线 + 片选线(1) + 读写控制线(2)
  • DRAM:芯片引脚 = 地址线 / 2(地址复用) + 数据线 + 行列通选线(2) + 读写控制线(2)(片选线由行列通选线代替)

ROM 的特点:

  • 信息只能读不能(在线)写。
  • 非破坏性读出,无需再生。
  • 随机存取,非易失性存储器(特殊方式写入)。

RAM 具有易失性,ROM 具有非易失性,它们都是随机存取,但 ROM 无法用作 Cache,也不需要刷新。

存储器与 CPU 的连接

存储器容量的扩展:

  • 位扩展:CPU 的数据线数与存储芯片的数据位数不相等,对存储位数扩位。(地址线连接方式不变)
  • 字扩展:CPU 的地址线数与存储芯片的地址位数不相等,增加存储器中字的数量,位数不变。(芯片地址线、数据线、读写控制线相应并联,由片选信号区分芯片的地址范围)
  • 字、位同时扩展:同时增加存储器中字的数量和存储字长。

存储器与 CPU 的连接步骤:

  1. 地址线的连接;
  2. 数据线的连接;
  3. 读/写命令线的连接;
  4. 片选线的连接;
  5. 合理选择存储芯片;
  6. 其它:时序、负载。

存储器的校验

编码的最小距离: 任意两组合法代码之间二进制位数的最少差异。编码的检错、纠错能力与编码的最小距离有关。

海明码: 是具有一位纠错能力的编码,原理是将编码的最小距离拉大,默认执行偶校验。计算海明码的步骤由三个部分组成:

  • 确定校验位的个数
  • 确定校验位的位置
  • 计算校验位

校验位的个数 kk 和信息码的长度 nn 满足如下关系:

2kn+k+12^k \geq n + k + 1

信息码位数 1 2 ~ 4 5 ~ 11 12 ~ 26 27 ~ 57 58 ~ 120
校验码位数 2 3 4 5 6 7

校验位的位置为 2i, (i=0,1,2,3,)2^i, \ (i = 0, 1, 2, 3, \cdots).

可以通过下标相加的方式来确认信息位对应的校验位。以 7 位海明码为例,H3H_3H1,H2H_1, H_2 负责校验,H5H_5H1,H4H_1, H_4 负责校验,H6H_6H2,H4H_2, H_4 负责校验,H7H_7H1,H2,H4H_1, H_2, H_4 负责校验. 可以通过下列公式来计算校验位:

H1=H3H5H7H2=H3H6H7H4=H5H6H7H_1 = H_3 \oplus H_5 \oplus H_7\\ H_2 = H_3 \oplus H_6 \oplus H_7\\ H_4 = H_5 \oplus H_6 \oplus H_7\\

另一个方法是借助通配表来确定校验位负责的信息位:

校验位 1(H1 校验位 2(H2 校验位 3(H4
**1 *1* 1**
001(H1 010(H2 100(H4
011(H3 011(H3 101(H5
101(H5 110(H6 110(H6
111(H7 111(H7 111(H7

通过对校验位和其负责的信息位执行异或运算来进行检错和纠错:

S1=H1H3H5H7S2=H2H3H6H7S3=H4H5H6H7S_1 = H_1 \oplus H_3 \oplus H_5 \oplus H_7\\ S_2 = H_2 \oplus H_3 \oplus H_6 \oplus H_7\\ S_3 = H_4 \oplus H_5 \oplus H_6 \oplus H_7\\

若校验码 S1,S2,S3S_1, S_2, S_3 都为 0,则说明海明码没有出错;否则说明出错,将校验码 S3S2S1S_3 S_2 S_1 所代表的位数取反即可起到纠错的效果。

按奇校验原则配置的海明码,与偶校验的校验位相反。

提高访存速度的措施

提高主存芯片本身的速度:

  • 采用芯片内部行缓冲,以提高芯片本身速度。
  • 双端口存储器:两套独立的读/写控制电路、地址缓存、地址译码及地址线和数据线。

采用多模块存储器技术:

  • 单体多字存储器:存储器只有一个存储体(每个存储单元存储 n 个字,总线宽度 n 个字,每次并行取出 n 个字)

  • 多体并行存储器:采用多体模块组成的存储器,每个模块有相同的容量和存取速度,又各自有独立的 MAR、MDR、地址译码、驱动电路和读/写电路,它们能并行工作,也能交叉工作。有以下两种存储体编址方式:

    • 高位交叉编址:通常会连续访问,因此实际效果相当于单纯的扩容。
    • 低位交叉编址:程序存放在相邻模块中,采用流水线存取。

设有四体低位交叉存储器,存取周期为 TT,总线传输周期为 τ\tau,为实现流水线方式存取,应满足 T=4τT = 4\tau,连续读取 4 个字所需的时间为 T+(41)τT + (4 - 1)\tau.

在主存与 CPU 之间加入 Cache: Cache 中的数据是主存中数据的副本,先看 Cache 再看主存。

高速缓冲存储器 Cache

程序访问的局部性原理:

  • 时间局部性:刚被访问过的单元很可能不久又被访问。
  • 空间局部性:刚被访问过的单元的邻近单元很可能不久又被访问。(例如数组)

Cache 的工作原理: Cache 和主存都被划分为相等的块。当 CPU 发出读请求时,若访存地址在 Cache 中(命中 Cache),则直接对 Cache 进行读操作;若未命中 Cache,则仍需访问内存,并把此字所在的块一次性从主存调入 Cache。

  • 命中:主存块已调入缓存,主存块与缓存块建立了对应关系。
  • 未命中:主存块未调入缓存,主存块与缓存块未建立对应关系。

Cache 的性能分析:

  • 命中率 HH:CPU 欲访问的信息已在 Cache 中的比率。

  • 未命中率 M=1HM = 1 - H

  • Cache-主存系统的平均访问时间 tt:设 tct_c 为访问一次 Cache 所需时间,tmt_m 为访问一次主存所需时间,则

    • 命中:t=Htc+(1H)tmt = Ht_c + (1 - H)t_m
    • 未命中:t=Htc+(1H)(tc+tm)t = Ht_c + (1 - H)(t_c + t_m)
  • 效率 e = (访问 Cache 的时间 / 平均访问时间) × 100%

Cache 的写策略(一致性问题):

  • 写直达法:写操作时数据既写入 Cache 又写入主存。写操作时间就是访问主存的时间,读操作时不涉及对主存的写操作,更新策略比较容易实现。
  • 写回法:写操作时只将数据写入 Cache 而不写入主存,当 Cache 数据被替换出去时才写回主存。写操作时间就是访问 Cache 的时间,读 Cache 失效发生数据替换时,被替换的块需写回主存,增加了 Cache 的复杂性。

Cache 和主存之间的映射方式:

  • 直接映射:

    • 特点:每个主存块只能放到一个特定位置。(Cache 块号 = 主存块号 % Cache 总块数)
    • 地址结构:主存字块标记 + Cache 行号 + 块内地址
    • 无需替换
  • 全相联映射:

    • 特点:主存块可以放在 Cache 的任意位置。
    • 地址结构:主存字块标记 + 块内地址
    • 全局替换
  • 组相联映射:

    • 特点:Cache 块分为若干组,每个主存块可放到特定分组中的任意一个位置。(组号 = 主存块号 % 分组数)
    • 地址结构:主存字块标记 + Cache 组号 + 块内地址
    • 分组内替换

Cache 替换算法:

  • 随机算法(RAND):随机地确定替换的 Cache 块。该算法的实现比较简单,但没有依据程序访问的局部性原理,故命中率可能较低。
  • 先进先出算法(FIFO):选择最早调入的行进行替换。该算法比较容易实现,但也没有依据程序访问的局部性原理,可能会把一些需要经常使用的程序块替换掉。
  • 近期最少使用算法(LRU):依据程序访问的局部性原理,选择近期内很久未访问过的存储行作为替换的行,平均命中率比 FIFO 高,是堆栈类算法。该算法对每行设置一个计数器,Cache 每命中一次,命中行计数器清 0,而其他各行计数器均加 1,需要替换时比较各特定行的计数值,将计数值最大的行换出。
  • 最不经常使用算法(LFU):将一段时间内被访问次数最少的存储行换出。该算法也为每行设置一个计数器,新行建立后从 0 开始计数,没访问一次,被访问的行计数器加 1,需要替换时比较各特定行的计数值,将计数值最小的行换出。

指令系统

机器指令

指令遵循的规则:

  • 尽量短,且有足够的操作码位数,指令编码必须有唯一解释。
  • 指令字长是字节的整数倍,指令尽量规整。

指令的基本格式: 操作码字段 +(寻址特征字段)+ 地址码字段

指令系统中指令长度是否相同:

  • 定长指令字结构:用于指令字长较长的情况,速度块,控制简单。
  • 变长指令字结构:操作码分散在指令字的不同吗字段中,长度是字长的整数倍。

扩展操作码技术:操作码的位数随地址数的减少而增加。

  • 设操作数地址位数为 n,则三地址指令操作码每减少一种可多构成 2n 种二地址指令;二地址指令操作码每减少一种可多构成 2n 种一地址指令。

例:某计算机的指令字长为 16 位,采用扩展操作码,操作数地址取 4 位。假设该指令系统已有 X 条三地址指令,Y 条二地址指令,没有零地址指令,则最多还可以有

[(16X)×24Y]×24[(16 - X) \times 2^4 - Y ] \times 2^4

条一地址指令。

操作数地址码的数目不同:

  • 零地址指令:OP

    • 无需操作数的指令。
    • 零地址的运算类指令仅使用在堆栈计算机中(操作数隐藏在栈顶和次栈顶)。
  • 一地址指令:OP A1

    • 只有目的操作数的单操作数指令(存储到原地址)。
    • 隐含约定目的地址的双操作数指令(到 ACC)。
    • 2 次访存
  • 二地址指令:OP A1 A2

    • 用于算术逻辑操作,分别给出目的操作数和源操作数地址,目的操作数地址(或 ACC)用于保存本次运算结果。
    • 4 次访存(若结果存于 ACC 则 3 次访存)
  • 三地址指令:OP A1 A2 A3

    • 用于算术逻辑操作,结果存于 A3。
    • 4 次访存
  • 四地址指令:Op A1 A2 A3 A4

    • 用于算术逻辑操作,多了下一条执行指令的地址。
    • 4 次访存

指令字长: 取决于

  1. 操作码的长度
  2. 操作数地址的长度
  3. 操作数地址的个数

若指令字长固定,则指令字长 = 存储字长;若指令字长可变,则按字节的倍数变化。

操作数与操作类型

操作数类型:

  • 地址:无符号整数
  • 数字:定点数、浮点数、十进制数
  • 字符:ASCII
  • 逻辑数:逻辑运算

操作类型:

  1. 数据传送:
目的
寄存器 寄存器 MOV
寄存器 存储器 STORE, MOV, PUSH
存储器 寄存器 LOAD, MOV, POP
存储器 存储器 MOV
  1. 算术逻辑操作:ADD, SUB, MUL, DIV, INC, DEC, CMP, NEG, AAA, AAS, AAM, AAD, AND, OR, NOT, XOR, TEST

  2. 移位操作:算术移位、逻辑移位、循环移位(带进位和不带进位)

  3. 转移:

    • 无条件转移:JMP
    • 条件转移:
    作用 条件 指令
    结果为零转 Z = 1 JZ
    结果溢出转 O = 1 JO
    结果有进位转 C = 1 JC
    • 跳过一条指令:SKP

    • 调用和返回:CALL, RETURN

    • 陷阱与陷阱指令:

      • 一般不提供给用户使用,在出现事故时,由 CPU 自动查产生并执行(隐指令)。
      • 设置供用户使用的陷阱指令。
  4. I/O

寻址方式

寻址方式的确定:

  • 在操作码中给定寻址方式
  • 有专门的寻址方式位

采用不同寻址方式的目的: 缩短指令长度,扩大寻址空间,提高编程灵活性。

指令寻址:

  • 顺序寻址:通过程序计数器 (PC) + n -> PC(n 为指令的总字节数),自动生成下一条指令的地址。

设机器字长为 16 位,存储器按字节编址,则 CPU 读取一条单字长指令后,PC 自动加 16 / 8 = 2.

  • 跳跃寻址:通过转移类指令实现,是否跳跃收到状态寄存器和操作数的控制。

    • 绝对地址:由标记符直接得到。
    • 相对地址:相对于当前指令地址的偏移量。

例:设相对寻址的转移指令占 3 个字节,第一字节为操作码,第二字节为相对位移量(补码表示)的低 8 位,第三字节是相对位移量(补码表示)的高 8 位。每当 CPU 从存储器取一个字节时,自动完成(PC) + 1 → PC。

(1)若 PC 当前值为 256,要求转移到 290,则转移指令的第二、三字节的机器代码是多少?

解:该指令取出后 PC 值为 259,相对位移量为 290 - 259 = 31,补码为 1FH,所以第二字节为 1FH,第三字节为 00H。

(2)若 PC 当前值为 128,要求转移到 110,则转移指令的第二、三字节的机器代码又是多少?

解:该指令取出后 PC 值为 131,相对位移量为 110 - 131 = -21,补码为 EBH,所以第二字节为 EBH,第三字节为 FFH。

数据寻址:

  • 指令格式:操作码 + 寻址特征 + 形式地址 A
  • 形式地址 A:指令字中的地址。
  • 有效地址 EA:操作数的真实地址。

(1)立即寻址:不访存,A 即是操作数。

  • 地址字段给出的不是操作数的地址,而是操作数本身(即补码形式的立即数)。

(2)直接寻址:访存一次,EA = A。

  • 指令字中的形式地址就是真实地址。
  • 寻址范围受限,操作数的地址不易修改。

(3)隐含寻址:不访存,由程序指定 EA。

  • 不显式地给出操作数地址,而是在指令中隐含。
  • 规定 ACC 为第二操作数地址。

(4)间接寻址:访存多次(由间址次数决定),EA = (A)。

  • 指令的地址字段给出存储地址信息的地址。
  • 可扩大寻址范围,便与编写程序。

(5)寄存器寻址:不访存,EA = Ri

  • 指令字中给出操作数所在的寄存器编号,能缩短指令地址段位数。

(6)寄存器间接寻址:访存多次(由间址次数决定),EA = (Ri)。

  • 有效地址在寄存器中,操作数在存储器中,执行阶段访存。

(7)基址寻址:访存一次,EA = (BR) + A。

  • BR:基址寄存器,指向程序起始地址,由操作系统管理。
  • 面向操作系统,解决程序逻辑空间与存储物理空间的无关性,有利于多道程序的设计。

(8)变址寻址:访存一次,EA = (IX) + A

  • IX:变址寄存器,面向用户(作为偏移量)。通用寄存器也可以作为变址寄存器。
  • 用于数组处理,适合编写循环代码(令 A 为数组首地址,IX 不断加 1)。

设形式地址为 D,若某机器采用先变址后间址的寻址方式,则这种寻址方式的有效地址为 EA = ( (IX) + D )。

(9)相对寻址: 访存一次,EA = (PC) + A。

  • PC 已自增,A 是相对于当前指令的偏移量。
  • 广泛用于转移指令,方便代码在程序内浮动。

(10)堆栈寻址: 堆栈是存储器(或专用寄存器)中一块特定,后进先出原则管理的存储区,读写单元地址由堆栈指针 SP 给出。

  • 硬堆栈:寄存器构成的堆栈(成本小,容量大)。
  • 软堆栈:主存划分的区域。

设 A 为累加器,SP 为栈顶指示器,MSP 为 SP 指示的栈顶单元,如果入栈操作的动作顺序为 (SP) - 1 → SP,(A) → MSP,那么出栈操作的动作顺序为 MSP → (A),(SP) + 1 → SP。

CISC 和 RISC 技术

区别 CISC RISC
指令系统 复杂庞大(指令一般大于 200 条) 简单精简(指令一般小于 100 条)
指令字长 不固定 定长
可访存指令 不加限制 只有 Load/Store 指令
指令执行时间 相差较大 大多数在一个周期内完成
指令使用频率 相差很大 都比较常用
通用寄存器数量 很少
目标代码 难以用优化编译生成高效的目标代码程序 采用优化编译程序,生成代码较为高效
控制方式 大多数为微程序控制 大多数为组合逻辑控制(硬布线)
指令流水线 可以通过一定方式实现 必须实现
兼容性 兼容性较强 不易兼容

中央处理器 CPU

CPU 的功能和基本结构

CPU 的功能:

  • 控制器的功能:

    • 指令控制
    • 操作控制
    • 时间控制
    • 处理中断
    • 数据加工
  • 运算器的功能:实现算术运算和逻辑运算

CPU 的基本结构:

运算器:

  • 算术逻辑单元 ALU:算术/逻辑运算等。
  • 暂存寄存器
  • 累加寄存器 ACC:通用寄存器,暂时存放运算结果,也可作加法运算的一个输入端。
  • 移位器:对操作数和运算结果进行移位运算。
  • 计算器:控制乘除运算操作步数。
  • 程序状态字寄存器 PSW:保留算术逻辑运算指令或测试指令的结果的各种状态信息。
  • 通用寄存器组:由触发器构成。

控制单元 CU:

  • 程序计数器 PC:指出下一条指令在主存中的存放地址。
  • 指令寄存器 IR:用于保存当前执行的指令。
  • 指令译码器 ID:仅对操作码子段译码,向控制器提供特定操作信号。
  • 主存地址寄存器 MAR:用于存放要访问的主存单元地址。
  • 主存数据寄存器 MAR:用于存放向主存写入的数据或从主存读出的数据。
  • 时序系统:用于产生各种时序信号。
  • 微操作信号发生器:根据指令、PSW 和时序信号产生控制计算机系统的信号。

CPU 的寄存器:

  • 用户可见寄存器:

    1. 通用寄存器
    2. 数据寄存器
    3. 地址寄存器
    4. 条件码寄存器
  • 控制寄存器:PC → MAR → M → MDR → IR

其中 MAR、MDR、IR 用户不可见,PC 用户可见。

  • 状态寄存器:

    • 条件码寄存器
    • 程序状态字寄存器 PSW

指令执行的过程

CPU 中指令执行的步骤:

  1. 取指令;
  2. (PC) + n → PC;
  3. 指令译码;
  4. 进行主存地址运算;
  5. 取操作数;
  6. 算术逻辑运算,存结果;
  7. 以上每步都需要检测异常,自动求换异常处理程序;
  8. 检测是否有中断请求,有则转中断处理。

指令周期: 取出并执行一条指令所需的全部时间。

  • 指令周期 = 取指周期 + 执行周期
  • 需要间接寻址:指令周期 = 取指周期 + 间址周期 + 执行周期
  • 带有中断处理:指令周期 = 取指周期 + 间址周期 + 执行周期 + 中断周期

指令周期的数据流:

  • 取指周期的数据流:
  • 间址周期的数据流:
  • 执行周期的数据流:不同指令的执行周期数据流不同。
  • 中断周期的数据流:

指令执行方案:

  • 单指令周期:每条指令在一个时钟周期内完成,时钟周期选取时间最长的访存指令。
  • 多指令周期:把一个指令的执行分成多个阶段,每个阶段在一个时钟周期内完成(时钟周期以最复杂阶段所花时间为准),规定每个阶段最多只能完成一次访存、寄存器读写或 ALU 运算。
  • 流水线方案

指令流水线

流水线的原理: 时间并行性原理

  • 把一个重复的过程分解为若干个子过程,每个子过程由专门的功能部件来实现。
  • 把多个处理过程在时间上错开,依次通过各功能段,这样各个子过程就可以并行进行。
  • 流水线中的每个子过程及其功能部件称为流水线的段或级,段与段相互连接形成流水线,流水线的段数称为流水线的深度

理想情况下,一个 n 段流水线和具有 n 个并行部件的 CPU 具有同等水平的吞吐能力。

流水线分类:

  • 静态流水线:流水线各段只能按同一种功能的连接方式工作。
  • 动态流水线:当流水线的某些段正在执行某种运算,另一些段可以执行另一些运算。

流水线的表示法——时空图: 时空图从时间和空间两个方面描述了流水线的工作过程,横坐标代表时间,纵坐标代表流水线的各个段。

理想情况下,流水线的时空图如下:

流水线的性能:

  • 吞吐率:在单位时间内流水线完成的任务数量或输出结果的数量。

    nn 为任务数,kk 为流水线段数,Δt\Delta t 为时钟周期,则吞吐率为

    TP=n(k+n1)ΔtTP = \frac{n}{(k + n - 1) \cdot \Delta t}

    nn \to \infty 时,有最大吞吐率

    TPmax=1ΔtTP_{max} = \dfrac{1}{\Delta t}

  • 加速比:完成同样一批任务,不使用流水线所用的时间与使用流水线所用的时间之比。

    一条 kk 段流水线完成 nn 个连续任务,所需要的时间为

    Tk=(k+n1)ΔtT_k = (k + n - 1) \cdot \Delta t

    顺序串行执行 nn 个任务,所需要的时间为

    Ts=nkΔtT_s = nk \cdot \Delta t

    所以加速比为

    S=TsTk=nkk+n1S = \frac{T_s}{T_k} = \frac{nk}{k + n - 1}

  • 效率:流水线中的设备实际使用时间与整个运行时间的比值,即流水线设备的利用率。

    E = n 个任务占用的时空面积 / k 个段总共的时空面积 = T0kTk\dfrac{T_0}{k \cdot T_k}
    当 n >> k 时,E ≈ 1.

影响流水线性能的因素:

  • 结构冲突:当指令在重叠执行的过程中,不同指令争用同一功能部件产生资源冲突,从而导致结构冲突。有如下解决方案:

    • 插入暂停周期,称为 “流水线气泡”。
    • 设置相互独立的指令存储器和数据存储器,或设置相互独立的指令 Cache 和数据 Cache。
    • 指令预取技术:在 CPU 中设置指令队列,用于将指令预先读取到指令队列中排队。在执行阶段,当存储器空闲时,将指令预先取出。
  • 数据冲突:流水线中各条指令因重叠操作,可能改变对操作数的读写访问顺序,从而导致数据冲突。可分为写后读冲突(RAW)、读后写冲突(WAR)、写后写冲突(WAW)。有如下解决方案:

    • 后推法:插入停顿,将相关指令延迟到所需操作数被写回寄存器。
    • 定向(旁路)技术:不必等待某条指令执行结果送回寄存器之后,再从寄存器中取出该结果作为下一条指令的源操作数;而是直接将执行结果送到其他指令所需要的地方。
    • 指令调度(静态/动态):让编译器重新组织指令顺序,使指令间隔得足够远,以此来消除冲突。
  • 控制冲突:流水线遇到分支指令和其它会改变 PC 值的指令所引起的。有如下解决方案:

    • “冻结” 或 “排空” 流水线。
    • 尽早判断转移是否发生,生成转移目标地址,提高转移方向的猜测率。
    • 预取转移成功或不成功两个控制流方向上的目标指令。
    • 要保证:分支结果出来之前不会改变处理机的状态,以便一旦猜错时,处理机能够回退到原来的状态。

中断系统

中断的基本概念: 计算机在执行程序的过程中,当出现异常情况或特殊请求时,计算机需要停止现行程序的运行,转向对这些异常情况或特殊情况的处理,处理结束后再返回到现行程序的间断处,继续执行原程序。

中断系统需要解决的问题:

  1. 各中断源如何向 CPU 提出中断请求?
  2. 当多个中断源同时提出中断请求时,中断系统如何确定优先响应哪个中断源的请求?
  3. CPU 在什么条件、什么时候、以什么方式来响应中断?
  4. CPU 响应中断后,如何保护现场?
  5. 如何停止原程序的执行而转入中断服务程序的入口地址?
  6. 中断处理结束后,CPU 如何恢复现场并且返回到原程序的间断处?
  7. 在处理中断的过程中又出现了新的中断请求,CPU 该如何处理?

中断请求的分类:

  • 内中断:

    • 自愿中断——指令中断(如访管指令)

    • 强迫中断:

      • 硬件故障(如缺页)
      • 软件中断(如非法除法)
  • 外中断:

    • 外设请求(如 I/O 操作完成发出的中断信号)
    • 人工干预(如用户强行终止进程)

中断请求标记:

  • 每个中断源向 CPU 发出中断请求的时间是随机的,为了记录中断事件并区分不同的中断源,每个中断源对应一个中断请求标记触发器 INTR
  • 多个 INTR 组成中断请求标记寄存器,该寄存器可集中在 CPU 的中断系统内,也可分散在各个中断源的接口电路中。

中断判优逻辑:

(1)硬件实现(排队器):

  1. 分散在各个中断源的接口电路中。
  2. 集中在 CPU 内。

(2)软件实现(程序查询):A、B、C 优先级按降序排列

优先级设置:

  1. 硬件故障属于最高级,其次是软件中断;
  2. 非屏蔽中断 > 可屏蔽中断;
  3. DMA 请求 > I/O 设备传送的中断请求;
  4. 高速设备 > 低速设备;
  5. 输入设备 > 输出设备;
  6. 实时设备 > 普通设备。

根据存储控制器内排队器设置的优先原则,对主存的中断源优先级:外设请求 > 写数请求 > 读数请求 > 读指令请求。

中断服务程序:

中断服务程序的作用:

  1. 保护现场:保存通用寄存器和状态寄存器的内容,以便返回原程序后可以恢复 CPU 环境。可以使用堆栈,也可以使用特定存储单元。
  2. 中断服务:主体部分,如通过程序控制需打印的字符代码送入打印机的缓冲存储器中。
  3. 恢复现场:通过出栈指令或取数指令把之前保存的信息送回寄存器中。

中断服务程序入口地址的查找:

  • 硬件向量法:由硬件产生向量地址,再由向量地址找到入口地址。
  • 软件查询法:中断识别程序。

中断响应:

响应中断的条件:

  1. 中断源有中断请求;
  2. CPU 开中断,允许中断触发器 EINT = 1;
  3. 一条指令执行完毕,且没有更紧迫的任务。

响应中断的时间:指令执行周期结束,由 CPU 发送查询信号。

中断隐指令:

  1. 关中断:将允许中断触发器置 0,保护中断期间不被新的中断所打端。
  2. 保存断点:为了保证在中断服务程序执行完毕后能正确地返回到原来地程序,需要保存 PC 的内容。
  3. 引出中断服务程序:取出中断服务程序的入口地址并传送给 PC。

多重中断: 又称中断嵌套,执行中断服务程序时可响应新的中断请求。

实现多重中断的条件:

  1. 提前设置开中断指令;
  2. 优先级高的中断源有权中断优先级低的中断源。

每个中断源都有一个屏蔽触发器,1 表示屏蔽该中断源的请求,0 表示可以正常申请,所有屏蔽触发器组合在一起,构成一个屏蔽字寄存器,屏蔽字寄存器的内容称为屏蔽字

在中断服务程序中设置适当的屏蔽字,能起到对优先级别不同的中断源的屏蔽作用。

控制单元 CU

控制单元的功能:

输入信号:

  • 时钟:时序系统产生的机器周期信号和节拍信号。
  • 指令寄存器:指令译码器产生的信息。
  • PSW 标志:来自执行单元的反馈信息。
  • 外来信号:中断请求、DMA 请求。

输出信号:

  • CPU 内部的控制信号:寄存器间数据传输、对 PC 的修改。

  • 送至控制总线的信号:

    • 存储器:访存控制信号。
    • I/O 设备:I/O 访问设备信号、中断、总线响应信号。

多级时序系统:

  • 指令周期:CPU 每取出并执行一条指令所需的全部时间。
  • 机器周期:所有指令执行过程中的一个基准时间,取决于指令的功能及器件的速度。
  • 时钟周期(节拍、状态):一个机器周期可完成若干个微操作,每个微操作需要一定的时间,将一个机器周期分成若干个时间相等的时间段。用时钟信号控制节拍发生器,就可产生节拍,每个节拍的宽度正好对应一个时钟周期。时钟周期是控制计算机操作的最小时间单位

基准时间的确定:

  • 以完成最复杂指令功能的时间为基准。
  • 以访问一次存储器的时间为基准。

若指令字长 = 存储字长,则机器周期 = 取指周期。

一个指令周期包含若干个机器周期,一个机器周期包含若干个时钟周期,如下图所示:

机器速度与机器主频的关系: 机器的主频 ff 越快,机器的速度也越快,在机器周期所含时钟周期数相同的前提下,两机平均指令执行速度之比等于两机主频之比,即

M ⁣I ⁣P ⁣S1M ⁣I ⁣P ⁣S2=f1f2\frac{M\!I\!P\!S_1}{M\!I\!P\!S_2} = \frac{f_1}{f_2}

机器速度不仅与主频有关,还与机器周期中所含时钟周期(主频的倒数)数以及指令周期中所含的机器周期数有关。

硬布线(组合逻辑)控制器设计

硬布线控制器框图:

基本思路:

  • CU 发出一个微命令(即微操作的控制信号),可完成对应微操。
  • 一个节拍内可以并行完成多个 “相容的” 微操作(即控制信号可以同时出现)。
  • 同一个微操作可能在不同指令的不同阶段被使用。
  • 不同指令的执行周期所需节拍数各不相同,为了简化设计,选择定长的机器周期,以可能出现的最大节拍数为准(通常以访存所需节拍数作为参考)。
  • 若实际所需节拍数较少,可将微操作安排在机器周期末位几个节拍上进行。

根据指令操作码、目前的机器周期、节拍信号、机器状态条件,即可确定当前节拍应该发出哪些 “微命令”。

设计步骤:

  1. 分析每个阶段的微操作序列(取值、间址、执行、中断);
  2. 选择 CPU 的控制方式;
  3. 安排微操作时序;
  4. 确定每个微操作命令的逻辑表达式,并用电路实现。

分析各个阶段的微操作序列:

  1. 取指周期:

    PC → MAR
    1 → R
    M(MAR) → MDR
    MDR → IR
    OP(IR) → ID
    (PC) + 1 → PC

  2. 间址周期:

    Ad(IR) → MAR
    1 → R
    M(MAR) → MDR
    MDR → Ad(IR)

  3. 执行周期:各个指令不相同

    • ADD X 指令:

      Ad(IR) → MAR
      1 → R
      M(MAR) → MDR
      (MDR)+
      (ACC) → ACC

    • STA X 指令:

      Ad(IR) → MAR
      1 → W
      (ACC) → MDR
      MDR → M(MAR)

    • LDA X 指令:

      Ad(IR) → MAR
      1 → R
      M(MAR) → MDR
      MDR → ACC

  4. 中断周期:

    0 → MAR
    1 → W
    0 → ENIT
    PC → MDR
    MDR → M(MAR)
    向量地址 → PC

安排微操作时序的原则:

  1. 微操作的先后顺序不得随意更改。
  2. 被控对象不同的微操作,尽量安排在一个节拍内完成。
  3. 占用时间较短的微操作,尽量安排在一个节拍内完成,并允许有先后顺序。

微操作的节拍安排:

  1. 取指周期:
节拍 微操作
T0 PC → MAR
1 → R
T1 M(MAR) → MDR
(PC) + 1 → PC
T2 MDR → IR
OP(IR) → ID
  1. 间址周期:
节拍 微操作
T0 Ad(IR) → MAR
1 → R
T1 M(MAR) → MDR
T2 MDR → Ad(IR)
  1. 执行周期:

    • ADD X 指令:
    节拍 微操作
    T0 Ad(IR) → MAR
    1 → R
    T1 M(MAR) → MDR
    T2 (AC) + (MDR) → ACC
    • STA X 指令:
    节拍 微操作
    T0 Ad(IR) → MAR
    1 → W
    T1 ACC → MDR
    T2 MDR → M(MAR)
    • LDA X 指令:
    节拍 微操作
    T0 Ad(IR) → MAR
    1 → R
    T1 M(MAR) → MDR
    T2 MDR → ACC
  2. 中断周期:

节拍 微操作
T0 0 → MAR
1 → W
T1 PC → MDR
T2 MDR → M(MAR)
向量地址 → PC

微程序控制器设计

微程序的概念: 由微指令序列组成,每一条机器指令由一段微指令编写的微程序来解释执行。

微程序控制器的工作原理:

  • 控制存储器 CM:存放微程序,由 ROM 组成。
  • 微地址寄存器 CMAR:接受微地址形成部件送来的微地址,为在 CM 中读取微指令作准备。
  • 微数据寄存器 CMDR:用于存放从 CM 中取出的微指令,它的位数和微指令字长相等。

工作过程:

  1. 将取指微程序入口自动送入 CMAR,从 CM 中读出微指令送入 CMDR;
  2. 机器指令操作码字段通过微地址形成部件产生微程序的入口地址,并将其送入 CMAR;
  3. 从 CM 中按地址逐条取出对应的微指令并执行;
  4. 执行完后,继续从头循环往复。

微指令编码方式:

  • 直接编码方式:微指令的微命令字段中每位都代表一个微命令,是否选用只需要将对应位置置 0 或 1。
  • 字段直接编码方式:将微指令的控制字段分成若干段,互斥微命令组合装同一段,每个字段独立编码,每个编码代表一种微命令。
  • 字段间接编码方式:一个字段的微指令由另一个字段中的微指令解释(两层译码,缩短指令字长,但削弱并行控制能力)。
  • 混合编码方式:直接编码和字段编码混合使用。

微指令序列地址的形成:

  • 断定(下址字段)法:在本条微指令中用一个专门字段明确指定下条微指令地址。
  • 根据机器指令的操作码形成。
  • 增量计数器法:下条微指令地址隐含在微程序计数器中,(CMAR) + 1 → CMAR。
  • 分支转移法

微指令格式:

  • 水平型微指令:

    • 一条微指令能定义多个可并行的微命令。
    • 微程序短、微指令长、执行速度快、并行能力强。
  • 垂直型微指令:

    • 一条微指令只能定义一个微命令。
    • 在指令字中,设置微操作码字段,由微操作码规定微指令的功能。
    • 微程序长、微指令短、执行速度慢、规整便于编写微程序。
  • 混合型微指令

静态/动态微程序设计:

  • 静态:微程序无须改变,采用 ROM。
  • 动态:通过改变微指令和微程序改变机器指令,有利于仿真,采用 EPROM。

毫微程序设计: 主存的每条指令都由放在控制存储器中的微程序解释执行,通过控制线对硬件进行直接控制。

I/O 系统

I/O 接口

I/O 接口的概念: I/O 接口通常是指主机与 I/O 设备之间设置的一个硬件电路及其相应的软件控制

I/O 端口的概念: 端口是指接口电路中可以被 CPU 直接访问的寄存器,这些寄存器分别用来存放数据信息、控制信息和状态信息,相应的端口分布称为数据、控制、状态端口。若干个端口加上相应的控制逻辑才能组成接口。

I/O 接口的功能:

  • 数据缓冲:通过数据缓冲寄存器 DBR 达到主机和外设工作速度的匹配。
  • 错误或状态检测:提供状态寄存器,保存错误或状态信息供 CPU 查用。
  • 控制和定时:接受从控制总线发来的控制信号、时钟信号。
  • 数据格式转换:将外部接口数据转换为内部接口格式(串 - 并、并 - 串)。
  • 主机和设备通信:实现主机 - I/O 接口 - I/O 设备之间的通信。

I/O 接口的分类:

  • 按数据传送方式:

    • 并行接口
    • 串行接口
  • 按功能选择的灵活性:

    • 可编程接口
    • 不可编程接口
  • 按通用性:

    • 通用接口
    • 专用接口
  • 按数据传送的控制方式:

    • 中断接口
    • DMA 接口

I/O 接口的基本结构:

系统总线:

  • 数据线:读写数据、状态字、控制字(命令字)、中断类型号。
  • 地址线:指明 I/O 端口。
  • 控制线:读/写、I/O端口信号、中断请求类型号。

触发器:

  • 完成触发器 D
  • 工作触发器 B
  • 中断请求触发器 INTR
  • 屏蔽触发器 MASK

工作步骤:

  1. 发命令:发送命令字到 I/O 控制寄存器,向设备发命令(驱动程序协助)。
  2. 读状态:从状态寄存器读取状态字,获得设备或I/O控制器状态。
  3. 读/写数据:从数据缓冲寄存器发送或读取数据,完成主机与外设的数据交换。

I/O 设备编址方式:

  • 统一编址(存储器映射方式):

    • I/O 端口当作存储器单元进行地址分配。
    • 不需要专门输入输出指令,占用存储器地址,速度慢。
    • RISC 常用,以不同地址码区分。
  • 独立编址(I/O 映射方式):

    • I/O 端口地址与存储器地址相互独立。
    • 需要专门的输入输出指令,I/O 指令类型少,程序灵活性差。
    • I/O 指令是指令系统的一部分,格式和其他通用指令有所不同。

I/O 传输方式

程序查询方式:

原理:用户在程序中安排一段 I/O 程序,它由 I/O 指令、测试指令和转移指令等组成。CPU 一旦启动 I/O 后,就进入这段程序,时刻查询 I/O 准备的情况,若未准备就绪就踏步等待;若准备就绪就实现传送。在 I/O 的全部过程中,CPU 停止自身的操作。

查询流程:

程序工作流程:

程序中断方式:

原理:CPU 启动 I/O 后,继续自身的工作,不必查询 I/O 的状态。在 I/O 被启动后,便进入自身的准备阶段,当其准备就绪时,向 CPU 提出中断请求,此时若满足条件,CPU 暂停现行程序,转入该设备的中断服务程序,在中断服务程序中实现数据的传送。

以 I/O 设备的中断处理过程为例,说明一次程序中断的全过程:

  1. CPU 发送启动 I/O 设备的命令,将接口中的工作触发器置 1,完成触发器置 0;
  2. 输入设备开始工作,需要 CPU 传送数据时,输入设备将数据送入数据缓冲寄存器中;
  3. 输入设备向接口发出 “设备工作结束” 信号,将工作触发器置 0,完成触发器置 1;
  4. CPU 在每条指令执行结束时,发出中断查询信号,若设备准备就绪(D = 1)且未被屏蔽(MASK = 0)时,中断请求触发器(INTR)置 1,代表该设备正式向CPU提出中断请求;
  5. INTR 序列被送至排队器,进行中断判优;
  6. 在 CPU 允许中断(EINT = 1)的情况下,若设备被选中,则进入中断响应阶段,将 INTR 发送到编码器形成向量地址,送至 PC 作为下一条指令的地址;
  7. 指令执行结束后无条件转至该设备的服务程序入口地址,开始执行中断服务程序;
  8. 进入中断服务阶段,通过输入指令将数据缓冲寄存器的输入数据送至 CPU 的通用寄存器,再存入主存相关单元;
  9. 在中断服务程序执行结束后,返回至原程序的断点处。

直接存储器访问(DMA)方式:

原理:I/O 设备需要进行数据传送时,向 DMA 接口发送 DMA 请求,DMA 控制器向 CPU 发送 I/O 请求,CPU 响应后让出系统总线,由 DMA 控制器接管总线,磁盘等高速外设成批地直接和主存进行数据交换。

DMA 控制器的结构:

主要功能:

  • 传送前:接受外设的 DMA 请求,向 CPU 发出总线请求,接管总线控制权。
  • 传送时:管理总线,控制数据传送;确定主存单元地址及长度,能自动修改对应参数。
  • 传送后:向 CPU 报告 DMA 操作的结束。

组成:

  • 主存地址计数器 AR:存放要交换数据的主存地址。
  • 传送长度计数器 WC:记录传送数据的长度,计数溢出时,数据即传送完毕,自动发中断请求信号。
  • 数据缓冲寄存器 BR:暂存每次传送的数据。
  • DMA 请求触发器:I/O 发出控制信号,触发 DMA 请求触发器。
  • 控制/状态逻辑:由控制和时序电路及状态标志组成,用于指定传送方向,修改传送参数,并对 DMA 请求信号和 CPU 响应信号进行协调和同步。
  • 中断机构:当一个数据块传送完毕后触发中断机构,向 CPU 提出中断请求。
  • 设备地址寄存器 DAR

DMA 传送方式:

  1. 停止 CPU 访存:需要数据传送时,停止 CPU 访问主存,将总线控制权交给 DMA 控制器。
  2. 周期挪用(周期窃取):当 I/O 设备需要访问主存时,挪用(窃取)一个或多个存取周期,当不需要时,CPU 仍继续访问主存。
  3. 交替访存:将 CPU 周期分为 DMA 访存和 CPU 访存两个部分,不需要申请建立和归还总线的使用权。

DMA 传送过程:

  1. 预处理:CPU 完成一些必要的准备工作(如寄存器置初值、设置传送方向、启动该设备)。设备地址 → DAR,主存地址 → AR,传送子数 → WC。
  2. 数据传送:CPU 继续执行主程序,DMA 控制器完成数据传送,传送以数据块为单位进行。
  3. 后处理:CPU 执行中断服务程序,做 DMA 结束处理(校验送入主存的数是否正确,是否继续使用 DMA,测试传送过程是否正确)。

DMA 方式与程序中断方式的区别:

区别 程序中断方式 DMA 方式
数据传送 程序控制
程序切换 → 保护和恢复现场
硬件控制
CPU 只需要预处理和后处理
中断请求 传送数据 后处理
响应时机 执行指令周期后响应中断 每个机器周期结束均可,总线空闲时即可响应 DMA 请求
应用场景 CPU控制,低速设备 DMA 控制器控制,高速设备
优先级
异常处理 能处理异常事件 仅传送数据

DMA 接口的类型:

  • 选择型:在物理上连接多个设备,在逻辑上只允许连接一个设备。
  • 多路型:在物理上连接多个设备,在逻辑上允许连接多个设备同时工作。分为链式和独立请求式。

三种传输方式的比较: 主机与设备交换数据的控制方式中,程序查询方式主机与设备是串行工作的,程序中断方式和 DMA 方式主机与设备是并行工作的,且 DMA 方式主程序与数据传送是并行进行的。