计算机组织结构
计算机组织结构
系统概述
1.5 单选
- 指令和数据在关机时储存在外存中,开机后存储在内存
- 冯·诺依曼计算机工作方式的基本特点是按地址访问指令并自动按序执行程序
- 指令由操作码和地址码组成
- 控制器通过执行指令来控制整个机器运行
- 注意对存储器来讲,例如 \(32K\times16位\)的存储器意为,该存储器为 16 位可寻址, 共有 32K 个存储单元, 若对于芯片来讲,不能得到什么信息
结构 ( Architecture ) :对程序员可见
- 对于程序的逻辑执行有着直接影响
- 例如: 该计main算机有无乘法器
组织 ( Organization ) : 对程序员不可见
- 操作单元及其相互联系
- 该计算机中的乘法器是如何实现的
Stored Program: 意为将指令、数据以二进制的方式存储到主存中.
摩尔定律: 每 18 个月,晶体管的数量增加一倍,价格下降一半,性能提高一倍
冯·诺依曼体系结构:
- 输入输出设备
- 存储(内存)
- 控制器: 指挥信息的处理.
- 处理器: 实际处理信息
只有在涉及到存储器相关时,用到的是 \(2^n\), 其他任何时候都是 \(10^n\), 比如时钟频率.
衡量 CPU 性能的依据
9.22 星期二:
存储
- cache:主存速度较慢,如果所有指令都从 memory 中取,速度很慢。从 cache 中读取会很快。
- memory hierarchy:
- 三要素:容量、存取时间和价格,关系如下:
- 存取时间越短,平均每位的花费就越大
- 存储容量越大,平均每位的花费就越小
- 存储容量越大,存取时间就越长
- 为了满足容量要求、性能要求,也使每位的价格低,采用了 memory hierarchy 的结构。随着层次的下降:
- 每位价格下降
- 容量增大
- 存取时间变长
- 处理器访问存储器的频率变少
buffer:
- i/o输入效率比处理慢,提高效率
- 减小丢失和等待
中断:
有了中断,处理器可以在进行 I/O 操作时执行其他指令。提供中断主要是为了提高效率,因为大部分外设的速度都比处理器慢得多,假如没有中断,每次 I/O 操作后处理器都会进入空闲状态直到外设跟上进度。
-
默认开
-
程序可以在执行指令的时候执行另一条指令
多个中断处理的方式:
- 顺序处理
- 根据优先级决定优先处理的指令
总线
总线:各部分信息共享,包含地址线、数据线和控制线,前两者可以复用。
数的二进制表示
二进制补码整数:
补数:负数加模得补数,负数的补数和负数的绝对值相加等于模
浮点数:
小密 大稀疏
定点运算
1. 移位运算
1.算数移位:
- 符号位不变, 左移相当于乘以 2, 右移相当于除以 2(左侧全补符号位).
2. 逻辑移位:
- 无符号数的移位, 右移时永远在高位填 0.
2. 加法运算
1. 全加器
- \(𝑆_𝑖=𝑋_𝑖⊕𝑌_𝑖⊕𝐶_{𝑖−1}\)
- \(𝐶_𝑖=𝑋_𝑖𝐶_{𝑖−1}+𝑌_𝑖𝐶_{𝑖−1}+𝑋_𝑖𝑌_𝑖\)
2. Serial Carry Adder
- 缺点: 速度慢.
- 延时(OR AND 1ty, XOR 3ty)
- Cn: 2n ty
- Sn: 2n+1 ty
3. Carry Look Ahead Adder
注意:这里的+均为“或”
可见,\(Ci\) 仅与最初的X Y和 \(C_0\)有关.
令\(𝑃_𝑖=𝑋_𝑖+𝑌_𝑖, 𝐺_𝑖=𝑋_𝑖𝑌_i\)
则:
总结得:\(C_{i+1} = G_{i+1}+P_{i+1}C_i\), 超前进位加法器采用的是将低一位的逻辑代数代入高一位, 依此类推最终每一个进位输出仅考虑 \(C_0, X_i, Y_i\)几个信号, 于是所有的进位都能同时计算.
- 缺点:复杂
- 延时: 1 ty+ 2ty + 3 ty = 6 ty
4. Partial Carry Look Ahead Adder
结合两者
5. 溢出判断
- \(C_n\oplus C_{n-1} =1\), 即符号位进位与最高有效位进位不同时,发生溢出.
- \(𝑋_𝑛 𝑌_𝑛 \overline{𝑆_𝑛}+\overline{𝑋_𝑛𝑌_𝑛}𝑆_𝑛=1\),则溢出,与上面等价.
3. 减法运算
减法运算大致与加法相同,只需要将减数取反加一然后按加法算即可, 注意加一的操作是令 \(C_0 = 1\).
4. 乘法运算
1. 无符号整数乘法
通过加法和移位实现,与竖式乘法极其类似,但是计算机很难像人类那样一次性把各位乘的结果一次性相加,因此采用部分积的方式:
例:\(0111\times0110\)
部分积 | 乘数 | 得到当前行的操作 |
---|---|---|
0000 | 0110 | 部分积+乘数末位\(\times 0111\) |
0000 | 0011 | 右移 |
0111 | 0011 | 部分积+乘数末位\(\times 0111\) |
0011 | 1001 | 右移 |
1010 | 1001 | 部分积+乘数末位\(\times 0111\) |
0101 | 0100 | 右移 |
0101 | 0100 | 部分积+乘数末位\(\times 0111\) |
0010 | 1010 | 右移 |
- 乘数末位决定被乘数是否加到部分积,然后部分积和乘数均右移,部分积低位保存到乘数高位.
- 被乘数只与部分积高位相加
原理:
2. 补码整数乘法
根据上面无符号整数的原理, 可以将二进制补码整数相乘变形如下:
形式上还原了,只是每次乘的不是乘数的末位数, 且注意是算数右移,需要补符号位,
例: \(-7\times-6 = 42,即 1001\times1010=00101010\)
部分积 | 乘数 | 得到当前行的操作 |
---|---|---|
0000 | 10100 | 部分积+\((Y_0-Y_1)\times 1001\) |
0000 | 01010 | 右移 |
0111 | 01010 | 部分积+\((Y_1-Y_2)\times 1001\) |
0011 | 10101 | 右移 |
1100 | 10101 | 部分积+\((Y_2-Y_3)\times 1001\) |
1110 | 01010 | 右移 |
0101 | 01010 | 部分积+\((Y_3-Y_4)\times 1001\) |
0010 | 10101 | 右移 |
5. 除法运算
1. unsigned
1.人的计算:除数右移, 2n位
- 竖式计算:
余数 | 除数 | 商 |
---|---|---|
00000111 | 00110000 | 0000 |
00000111 | 00011000 | 0000 |
00000111 | 00011000 | 0000 |
00000111 | 00001100 | 0000 |
00000111 | 00001100 | 0000 |
00000111 | 00000110 | 0000 |
00000001 | 00000110 | 0001 |
00000001 | 00000011 | 0001 |
00000001 | 00000011 | 0010 |
- 计算机的计算: 余数左移, n位
余数 | 商 | 除数 |
---|---|---|
0000 | 0111 | 0011 |
0000 | 111 | 0011 |
0000 | 1110 | 0011 |
0001 | 110 | 0011 |
0001 | 1100 | 0011 |
0011 | 100 | 0011 |
0000 | 1001 | 0011 |
0001 | 001 | 0011 |
0001 | 0010 | 0011 |
2. 带有符号的除法
- 如何判断余数(的绝对值)是否大于除数(的绝对值)?
- 同号则减, 异号则加. 与结果符号相同的那个数绝对值大
remainder sign | Divisor sign | Subtraction | Addition | ||
0 | 1 | 0 | 1 | ||
0 | 0 | Enough | Not enough | ---- | ---- |
0 | 1 | ---- | ---- | Enough | Not enough |
1 | 0 | ---- | ---- | Not enough | Enough |
1 | 1 | Not enough | Enough | ---- | ---- |
![](https://i0.hdslb.com/bfs/article/aadda87e9086a37cb714b2970fa7596c0721f939.png)
-
恢复余数法 在下面的步骤中,余数和除数的和是存储在余数寄存器里面的,判断完成后,还要恢复原来的余数(即减去余数).之前的不带符号位除法也都是恢复余数法,只是没有表示出来.
余数 商 除数 得到本步操作 1111 1001 0011 - 1111 001 0011 左移 1111 0010 0011 1111+0011 =0010,not enough 1110 010 0011 左移 1110 0100 0011 1110+0011=0001, not enough 1100 100 0011 左移 1111 1001 0011 1100+0011=1111, enough 1111 001 0011 左移 1111 0010 0011 1111+0011=0010,not enough 最后,结果取 0010 的补码整数 1110 为最终结果.
- 缺点:Problem: recover remainder is high cost
- 解决方案:使用不恢复余数法(加减相消法)
-
加减相消法.
- 规则
- 将被除数符号拓展 n 位后存储在余数和商寄存器.
- 如果被除数与除数符号相同, 作减法; 若符号位不同, 作加法.
- 若新的余数与除数符号相同, 上商 1; 否则上商 0.
- 新的余数(指左移前的余数)与除数符号位相同, 则 \(R_{i+1}= 2R_i-Y\), 即
余数=余数<<1-除数
;否则\(R_{i+1}= 2R_i+Y\)
- 商的修正:
- 商左移一位. 若被除数和除数异号(即商为负), 商加一
- 若余数与被除数符号不同:
- 若被除数和除数同号,余数加除数
- 若被除数和除数异号,余数减除数
- 注意:若做完如上修正后,余数为除数相反数,需要将余数置为0,同时商减一
- 示例:
- 规则
BCD 码
- 每 4 位二进制数表示十进制的一位数
- 加法:由于真值的进位是 10,而 BCD 码的进位是 16,所以在真值产生进位的时候需加 6 强制进位.
- 减法:类似于补码减法. BCD"补码"与原码相加得 9.若结果是负数("补码"表示),需转化成负号+原码的形式.
浮点数四则运算
浮点数的加减运算
\(X=X_S \times 2^{X_E},Y=Y_S \times 2^{Y_E}\)
- 步骤
- 检查是否为零
- 阶码对齐,尾数移位
- 对尾数加或减
- 标准化结果
- 溢出判断
-
对阶
- 求阶差
\(\Delta E=\begin{cases} =0,已经对齐\\ \ne0,\begin{cases}大的向小的对齐:减小较r大的阶码,同时扩大其尾数\\小的向大的对齐:增大较小的阶码,同时减小其尾数 \end{cases} \\ \end{cases}\)
在计算机中,尾数左移可能会使最高位数据丢j失,故采用小阶向大阶对齐
浮点数加减的过程 - 求阶差
一些溢出情况
1. Exponent overflow
- 一个正的指数超出了指数的最大值(即127)
- 指定为\(-\infty 或 +\infty\)
2. Exponent underflow
- 一个负的指数小于了指数的最小值(即-126)
- 指定为0.
3. Significand overflow
- 同号的两个数字相加时,在最重要的位上产生了进位.
- 在realignment时修正
4. Significand underflow
- 在对齐尾数的时候, 数据可能从尾数的最右端流失
- 需要某种形式的四舍五入
原码加减法(用于尾数的加减)
-
如果两个操作数符号相同,做加法,否则做减法.
- 加法:
- 若最高位产生了进位,溢出
- 符号同加数
- 减法:加第二个数的补数
- 若最高位产生进位,结果正确(符号等同于被减数)
- 若没有进位,应该取结果的补数,最终结果与被减数相反.
注意:此处可以是认定为没有符号位的补码在做计算,所以最终结果需要进行修正.(因为正数补码是它自身,负数补码是其反码加一)
更通俗的说法:最终算A+B的时候(无论是一开始就是A+B还是减法转化而来).如A,B同号,尾数是正常相加;若A,B异号,尾数为\(A_S+[B_S]_补\)
- 加法:
浮点数加减法举例
-
减法
0.5-(-0.4375)=0.5+0.4375=0.9375
0.5 0 01111110 00000000000000000000000
-0.4375 1 01111101 11000000000000000000000
0.4375 0 01111101 11000000000000000000000
01111110-01111101=01111110+10000011=00000001
则前者阶码比后者大,后者向前者对齐(后者阶码加1,尾数右移一位,此处尾数包含隐藏位,即橙色位).减法经处理后,两个操作数同号,尾数做正常加法1 0000...00 + 0 1110...00 —————————— 1 1110...00 加法计算没有进位,则结果正确,为
-
加法
0.5+(-0.4375)=0.0625
0.5 0 01111110 00000000000000000000000
-0.4375 1 01111101 1100000000000000000000001111110-01111101=01111110+10000011=00000001
则前者阶码比后者大,后者向前者对齐(后者阶码加1,尾数右移一位,此处尾数包含隐藏位,即橙色位).两个操作数异号,尾数加法做加后者补数.1 0000...00 + 1 0010...00 —————————— 1 0 0010...00 符号相异产生进位,结果正确,与第一个操作数符号相同.经规格化后:
1 01111011 00000000000000000000000
浮点数乘法
- 步骤
- 如果任何一个操作数为0,返回0.
- 指数相加时需要减去偏差值,因为阶码用移码表示.
- 尾数相乘.
- 结果规格化并舍入.(可能造成指数溢出).
浮点数除法
- 步骤
- 除数为0,报错或设为无穷.
- 被除数为0,设为0.
- 被除数的阶码和除数的阶码做差,并加回偏差值.
- 尾数相除.
- 结果标准化并舍入.
注意:和无符号整数除法不同:浮点数除法给被除数后面填零存入余数和商寄存器,而整数是高位填零.
保护位
为了提高精度,在计算时每个数字都存在保护位,暂时储存着计算后(比如右移)后的超出低位的数据.
内置存储器
Memory
存储器由一定数量的单元构成,每个单元可以被唯一标识,每个单元都有存储一个数值的能力.
- 地址:单元的唯一标识符(采用二进制).
- 地址空间:可唯一标识的单元总数.
- 寻址能力: 存储在每个单元中的信息的位数
- 大多数存储器是字节可寻址的,执行科学计算的计算机通常是64位寻址的.
半导体存储器
- 主存中广泛地运用了半导体芯片.
- Memory Cell:半导体主存的基本元素.
- 特性:
- 它们展示了两种稳定(半稳定)的状态,可以用于表示二进制0和1.
- 能够被写入至少一次.
- 可以被读.
- 特性:
半导体存储器类型
RAM
RAM
- Random-Access Memory
- Characteristics
- 易于读/写且快速
- 易失(断电丢失数据)
- 类型
- DRAM:Dynamic RAM
- SRAM:Static RAM
DRAM
-
以电容器上的电荷来存储数据
- 电容器中是否存有电荷被解释称二进制1和0
-
需要定期刷新来维持数据,因为电容器有放电的趋势
-
本质是模拟设备,因为电容可以存储一定范围内的任何电荷值,因此需要使用一个阈值来确定保存的是1还是0.
SRAM
- 用传统的触发逻辑门配置存储数据
- 处理器中使用了相同的逻辑单元
- 只要供应电力就能一直保存数据(无需刷新)
DRAM 和 SRAM 之间的比较
-
相似点:
- 易失.必须持续供应电力来保存位值
-
不同点:
- DRAM 比 SRAM 的单元更小且更简单,但是需要刷新电路
- DRAM 比 SRAM 集成度更高,更便宜
- DRAM 通常用于大内存需求
- SRAM 通常比 DRAM 快
- SRAM 用于 Cache DRAM 用于主存
- DRAM 比 SRAM 的单元更小且更简单,但是需要刷新电路
高级DRAM 组织
- 问题
传统的DRAM 芯片受限于其内部结构及其与处理器的存储总线的连接. - 解决方案:
- SDRAM(Synchronous DRAM)
- DDR (DDR SDRAM)
SDRAM
- 传统的 DRAM 是异步的.
- 处理器将地址和控制信号提供给存储器,表示存储器中特定单元的一组数据应当被读出或写入DRAM.
- 经过一段延时后,DRAM写入或读出数据.在这段时间内,DRAM 执行各种内部功能,如激活行地址线或列地址线的高电容, 读取数据,以及通过输出缓冲将数据输出,而处理器只是等待,降低了性能.
- SDRAM 与处理器交换数据同步于外部时钟信号,可以以处理器/存储器总线全速运行,而不必等待.
- 由于SDRAM随系统时钟移动数据,CPU 知道数据何时能够准备好.
DDR SDRAM
- Double-data-rate SDRAM双速率 SDRAM.
- 每个时钟周期发送两次数据,一次在脉冲上升沿,一次在下降沿.
- DDR 技术的更迭
- 提升操作频率
- 提升预取缓冲器位数
ROM
Read-only memory
ROM
- 只读存储器
- 特点
- 不易失性:无需电源来维持数据.
- 可读但不可写.
- 应用
- 微程序设计,库子程序,系统程序,函数表.
- 问题
- 固化数据需要较大的固定成本,不论是制造一片还是复制上千片特殊的ROM 。
- 无出错处理机会,如果一位出错.则整批的ROM 芯片只能报废。
PROM
- Programmable ROM
- 特征
- 非易失性
- 可以但只能写入一次
- 用电信号写
- 需要特殊设备
- 与ROM相比
- PROM 更灵活方便
- ROM在大批量生产领域仍具有吸引力
Read-mostly Memory
- 特征
- 读操作比写操作更为频繁
- 非易失性存储
- 类型
- EPROM
- EEPROM
- Flash Memory
EPROM
- Erasable PROM
- 特点
- 用电信号读写
- 擦除:在写入新的数据之前,用紫外线辐射芯片
- 所有的存储位元都还原为初始状态
- 需要20分钟
- 与 PROM 相比
- EPROM更贵,但可以多次改写
EEPROM
-
Electrical EPROM
-
特点
- 任何时候都可以写入,无需擦除原有数据
- 只需要更新寻址到的一个或者多个字节
- 写操作耗费时间更长,每个字节需要几百微秒
-
与 EPROM 相比
- EEPROM 更加昂贵,且密度更小,适合小容量芯片
Flash Memory
- 特点
- 电擦除
- 擦除至多需要数秒,比 EPROM 要快得多
- 可以擦除存储器中的某些块,但不能提供字节级擦除
- 相较于 EEPROM ,闪存与EPROM有一样的高存储密度
芯片逻辑
- 可寻址单元
- 由拥有相同地址的存储位元(memory cell)组成
- 寻址模式
- 字节可寻址
- 字
- 存储阵列(Memory array)
- 由许多存储单元组成(如下图中有\(2048\times 2048\)个存储单元)
- 由许多存储单元组成(如下图中有\(2048\times 2048\)个存储单元)
刷新(Refreshing)
- 集中式刷新
- 停止读写操作,刷新每一行.
- 当刷新时存储器不能进行操作
- 分散式刷新
- 在每一个存储周期内当读写操作完成后对一部分刷新
- 增加了存储的时间
- 异步刷新
- 64ms 内对每一行刷新完毕,每行刷新间隔不变
- 效率高
字扩展,位扩展和字位扩展
- 字扩展
- 增加了存储器中字的个数,地址线增加,数据线不变.由片选信号来区分各芯片的地址范围.
- 位扩展
- 增加了字长.地址线不变,数据线增加.读写的时候,一个地址对应几块芯片的同一位置.
- 字位扩展
- 二者结合
Cache
为什么需要 cache?
- 因为 CPU 比 内存的速度要快得多.`
基本思路
- 使用较小, 较快的 Cache 和相对较大,更为缓慢的 Memory
- Cache 中包含了 Memory 中数据的副本
- Cache 位于中央处理器和存储器之间,并可以被集成在 CPU 或者作为主板上的一个模块.
Cache 工作的原理
-
Check :当处理器试图读取内存中的一个字的时候,会先检查该字是否在 Cache 中.
-
Hit : 如果确实在, 这个字被传送给处理器.
-
Miss : 否则,由一定数量的字组成的一块( block )主存中的数据 被读入 Cache ,然后传给处理器.
-
时间局部性:
未来将要使用的信息(指令和数据), 可能是现在正在使用的信息. -
空间局部性:
未来将要使用的信息, 很可能与正在使用的信息在存储空间上是邻近的(比如遍历一个一维数组).
判断 Hit 与 Miss
- 冯诺依曼计算机的设计:
内存中的内容按位置寻址,而不考虑其中的数据类型. - Cache 中有 标记(tag) 来判断需要读取的信息是否存在于 Cache.
移动"块"而不是字
![](https://i0.hdslb.com/bfs/article/10d416f2051d0ff9ed1a4d60861da6582a74da44.png)
证明 Cache 机制能够提高性能
- 设命中率为 \(p\), \(T_C\) 为访问Cache 的时间,\(T_M\) 为访问主存的时间,则总时间为(可以认为返回数据不需要时间, 寻找花时间)\[T=T_Cp+(1-p)(T_C+T_M) \]由上面可以推出,若 \(T<T_M\), 则 \(p>\frac{T_C}{T_M}\) ,虽然\(\frac{T_C}{T_M}\)非常小,但是 Cache 的容量更要远远小于主存的容量,这就体现了局部性的作用.
Cache 是否越大越好?
Cache 容量变大, 命中率增加会变得缓慢,因为搬来的数据可能关联性弱,对效果提升十分有限.此外,Cache 规模变大会使得 check 的时间变长.
映射功能
- 因为 Cache 的行比主存块要少, 所以需要一个算法将主存中的块映射到 Cache 中的行.
1. 直接映射
- 地址组成:
-
定义: 内存中的一个块映射到 Cache 中固定的行.
-
将主存中的每个块映射到固定的可用 Cache 中行.直接映射可以表示为:
\[i=j\space mod\space m \]其中 i 为 Cache 行号, j 为主存块号, m 为 Cache 行数 .
为了实现访问 Cache 每一个主存地址可以看作由三个域组成:- 低 \(w\) 位标识某个块中的唯一一个存储单元(字节或字).
- 剩余 \(s\) 位标识了主存 \(2^s\) 个块中的一个.
- 其中 \(r\) 位标识了 cache 中的行号(cache 的行数为 \(m=2^r\))
- \(s-r\) 位为 tag 位.用以区分映射到同一行的不同块.
总结:
- 地址长度: \((s+w)\) 位
- 可寻址单元数: \(2^{s+w}\)
- 块大小=行大小=\(2^w\) 个存储单元(字节或字)
- 主存的块数:\(\frac{2^{s+w}}{2^w}=2^s\)
- cache 行数:\(m=2^r\)
- cache 容量: \(2^{r+w}\) 个字或者字节
- 标记长度: \((s-r)\) 位
-
举例:
\(m=16K=2^{14},i=j\space mod\space 2^{14}\),用 16 进制 表示地址有cache 行 主存块的起始地址 0 000000,010000,....FF0000 1 000004,010004,...,FF0004 ... ... \(2^{14}-1\) 00FFFC,01FFFC,...,FFFFFFC 地址24位,其中,高8位为 tag 位,若当前存在该行的标记数与地址中的相同,则14位标识 cache 行号, 低2位标识行中的4个字节(或者字);否则,前22位标识为从主存中取一块.取的主存块的地址为22位加两位0(因为块都是以4倍数开始的,每个块有4个单元)
-
优点:
- check快,从主存中存取的时候快
- tag 短,额外存储少.
- 不会随着容量增大而变慢
- 实现简单
-
缺点:
- 容易发生抖动:用到的两个块映射到 cache 中的同一行,于是频繁的替换.
- 命中率低
2. 全相联映射
-
地址图示:
-
定义: 内存中的块可以映射到 Cache 中的任意一行.
-
总结:
- 地址长度 s+w 位
- 可寻址单元数 \(2^{s+w}\) 个字(字节)
- 块大小=行大小=\(2^w\) 个字(字节)
- 主存的块数:\(\frac{2^{s+w}}{2^w}=2^s\)
- cache 的行数: 不由地址格式决定
- 标记长度=s 位
-
优点:
- 避免"抖动".
- 命中率高
-
缺点:
- check 慢, 从内存中放到 cache 中慢.
- 实现较为复杂
3. 组相联映射
- 图示:
-
定义: Cache 中的行分成组(Set),内存中的块搬到固定的组,组中具体的哪一行不固定.第一步类似直接映射,第二部类似全相联映射. Cache 中分为 \(v\) 个组,每组包含 \(k\) 个行,则:
\[\begin{aligned} &m=v\times k\\ &i=j\space mod\space v\\ \end{aligned}\]其中: i 为组号, j 为主存块号,m 为主存块数,v 为组数,k 为每个组中的行数, 即 k路组(K-way Set).
-
总结:
- 地址长度 s+w 位
- 可寻址单元数 \(2^{s+w}\) 个字(字节)
- 块大小=行大小=\(2^w\) 个字(字节)
- 主存的块数:\(\frac{2^{s+w}}{2^w}=2^s\)
- cache 中每组行数= k
- 组数 = v = \(2^d\)
- cache 中的行数 = m = \(k\times v=k\times 2^d\)
- 标记长度 s-d 位(同一个组中不会出现标记位相同的两个块)
-
优点:
- 固定组 check ,存取,速度比全相联快
- 命中率比直接映射高
-
缺点:
- 实现复杂.
- 若反复用的的块很多的话,仍然无法避免抖动.
替换算法
1.最近最少用
2.先进先出
3.使用最少
4.随机
写策略
1.写入
- 每一次改了之后都更新内存
- 好处:提升cache和主存一致性,保证主存中的内容都是最新的
2.写回
- cache 中的行要被替换时不得不写回去,用 dirty bit 来判断数据是否发生过改写,若没有改过无需写回.
块大小(Cache Line Size)
- 由极小变大,根据局部性原理命中率先是提升,因为每个块所能容纳的有用数据增多了.
- 到极大时,且新取信息的概率小于重用信息概率时,命中率会减小.因为较大的块减少了块的个数,少量的块导致装入的数据很快会被改写;当块变大时,每个附加字距离所需字就更远,被使用的概率低.
cache 数目
- 多级 cache 比单一大容量 cache 效率更高
外存
- 特点
- 大容量,非常用
- 非易失性
- 类型
- 磁盘
- 光盘
- 磁带
- U盘,SSD
磁盘
- 磁盘是一种由非磁性材料制成的称为衬底的圆盘,其上涂有一层磁性材料.
- 衬底材料: 铝合金,铝,玻璃..
- 玻璃衬底的优点:
- 改善磁层表面的均匀性,增加磁盘的可靠性.
- 显著减少整个表面的缺陷,有助于减少读写错误.
- 支持更低的飞行高度.
- 更好的刚度,降低了磁盘的动力需求.
- 更好的耐冲击和耐磨损能力.
- 分类:
- 软盘
- 硬盘
物理特性
![](https://i0.hdslb.com/bfs/article/3e4cbe481f534268d23e2afca86fc7c67241ab98.png)
- 采用可移动磁头,每面只有一个读-写头.磁头固定在支架上,支架可以伸缩,使磁头可以定位到任意磁道.
- 任何时候,所有的磁头都定位在磁道上,所有的磁道都是同心圆.
- 磁盘上相对位置相同的所有磁道的集合称为柱面.
读写机制
![](https://i0.hdslb.com/bfs/article/e05df25e7ef8c81a42d80706580c0351ca98ce24.png)
- 读-写是通过一个叫做磁头的导电线圈进行的.
- 读写期间,磁头静止不动,盘片高速旋转
- 头的数量:
- 单: 读写共用一个头.用于软盘, 老式硬盘.
- 双: 单独的读,写头.用于现代硬盘.
写机制
- 脉冲电流送入写磁头.
- 利用通电线圈周围产生磁场的性质,线圈中的电流在缝隙中感应出一个磁场.
- 产生的磁化模式被记录在其下的磁盘表面
- 逆转电流的方向将逆转记录介质上的磁化方向.
读机制
- 传统的读机制采用磁盘相对线圈运动产生磁场的效应.
- 当代读机制采用一个单独的读磁头,由一个部分被屏蔽的磁阻(MR)传感器组成.当下方介质的磁化方向改变的时候,电阻会发生变化.
- 让电流通过 MR 传感器,电阻的变化作为电压变化被检测出来.
- MR 设计允许高频操作, 这等同于更高的存储密度和更快的操作速度.
磁头机制
磁头必须产生或者感应到足够大小的电磁场,以便正确读写.
- 较窄的磁头要求与盘面距离更近.
- 更大的数据密度需要更窄的磁头和更窄的磁道.这将导致更大的出错率.
- 温切斯特磁盘:
- 磁头是一个空气动力箔片,盘片静止时,他停靠在盘面上.
- 旋转盘片产生的气压足以使滤波从表面上升起.
数据组织和格式化
![](https://i0.hdslb.com/bfs/article/fca4b3384798d7895a61507b0374a7cd767c1c06.png)
- 盘上的数据组织呈现为一组同心圆环,圆环被称为磁道(track).
- 数据以扇区(sectors)为单位传入或者传出磁盘.通常大小为 512 字节
- 相邻此岛之间有间隙(gap),它可以防止或减少由于磁头未对准或磁域干扰引起的错误.为了防止对系统提出不合理的定位要求,相邻的扇区也留有间隙.
恒定角速度(CAV)
- 盘外沿的传输要比靠近盘中心快, 通过增加位之间的间隔,使磁盘以固定的速度扫描信息.
- 优点:
- 可以用磁道号和扇区号直接寻址.
- 缺点:
- 外围长磁道与内圈短磁道存储的数据一样多.
多重区域记录
- 盘面被分为多个区域,每个区域中各磁道的扇区数是一定的,远离中心的磁道能够容纳更多的扇区.
- 优势: 提升了存储容量.
- 劣势: 实现的电路更加复杂.
格式化
![](https://i0.hdslb.com/bfs/article/8f96c47ff22976a116674aba9e61d84bd1fdb87a.png)
- 磁道必须有一些起始点和辨识每个扇区的起点及终点的方法.
- 格式: 附加一些仅被磁盘驱动器使用而不被用户存取的额外数据.
- ID 域是唯一的一个标识或地址,用于定位具体的扇区.
- 同步字节是一个特殊的位模式,用来定义区域的起始点.
- 磁道号标识磁盘表面上的一个磁道.
- 磁头号标识一个磁头,因为磁盘有多个面.
- ID 和数据域各包含一个检错码.
磁盘性能参数
![](https://i0.hdslb.com/bfs/article/dffc832d9baadeeeae29a68f40aed1b8868f484e.jpg)
寻道时间
- 磁头定位到该磁道所花的时间.
- 初始启动的时间
- 穿越磁道的时间
旋转延迟
- 等待相应扇区的起始处到达磁头的时间.
- 平均为磁盘周期的一半.
存取时间
- 寻道时间和旋转延迟总和
传送时间
- 数据传送到磁盘所需时间\[T=\frac {b}{rN} \]
- \(b\) 待传送字节数
- \(N\) 各磁道的字节数
- \(r\) 转速
总平均存取时间
- 可以证明磁盘整理加快存取速度.
磁盘调度算法
- 先来先服务(FCFS)
- 按 I/O 请求的顺序处理.
- 最短寻道时间(SSTF)
- 优先处理距离当前磁头位置的最短寻道时间的请求.
- SCAN
- 在 0 和 N 之间移动磁头,优先处理当前移动方向上的请求,到达一端后反向.
- C-SCAN
- 将磁头从 N 移动到 0, 到达 0 后立即返回 N
- LOOK
- 建立在 SCAN 和 C-SCAN 的基础上, 磁头只移动到一个方向最远的请求.
光盘
CD 和 CD-ROM
![](https://i0.hdslb.com/bfs/article/7fb8c174c901eee86e22e7ba055ac09d454ae5c6.jpg)
- 生产
- 用精密聚焦的高强度激光制造母盘.
- 用母盘在聚碳酸酯上压印出复制品.
- 在凹坑表面镀上高反射的材料.
- 表面涂一层丙烯酸树脂防止灰尘或划伤.
- 用丝网印刷术把标签印刷在丙烯酸上.
- 读
- 通过安装在光盘播放机或驱动器中的低功率激光从CD或CD-ROM中检索
- 如果激光束落在表面有点粗糙的凹坑上,光就会散射,低强度的光就会反射回来
- 如果激光束落在一个光滑的表面上,更高的强度会被反射回来
- 磁盘包含一个单一的螺旋轨道,和所有扇区是相同的长度
- 以变速旋转磁盘
- 然后激光以恒定的线速度读取凹坑
- CD和CD - ROM的区别
- CD-ROM player更坚固,并有错误纠正设备,以确保数据正确传输
- 优势
- 光盘和存储在上面的信息可以廉价地大量复制
- 光盘是可移动的
- 缺点
- 它是只读的,不能更新
- 它的存取时间比磁盘长得多
CD-R
- 包括染色层,用于改变反射率,并被高强度激光激活
- 可以用适当强度激光写入一次
- 生成的磁盘可以在CD-R或CD-ROM驱动器上读取
CD-RW
- 使用一种在不同相位下反射率显著不同的材料, 可以被激光改变.
- 会随着使用老化最终完全失去性能.
DVD
![](https://i0.hdslb.com/bfs/article/d44806d7159cd21cf86706a28d258d64997d5484.png)
- 与CD相比
- 位组装更加紧密.
- DVD 采用双层结构
- DVD-ROM可以是双面的, CD只能是单面的.
磁带
- 顺序存储
- 廉价
- 写方式
- 并行写:多个磁道同时写
- 串行写:一个磁道返回来写另一个
纠错
基本思想
- 方法: 添加一些位来存储附加信息以便校正
- 过程:
- 读入:\(M\) 位的数据 \(D\) 通过函数 \(f\) 产生 \(K\) 位的校验码 \(C\)
- 被读出:通过 \(f\) 由\(D'\) 生成 \(C''\)与 \(C'\) 相比较
- 无错误: 发送 \(D'\)
- 有错误并可以纠正,发送 \(D''\)
- 有错误且不能纠正, 报告
奇偶校验法
- 过程
\(D=D_M...D_2D_1\)- 奇校验: \(D_M \oplus ...D_2 \oplus D_1 \oplus 1\)
- 偶校验: $$D_M \oplus ...D_2 \oplus D_1$
- 检查 \(S=C' \oplus C''\)
- \(S=1\) 错误的位数为奇数
- \(S=0\) 错误的位数为偶数或者无错误
- 注意: 此处是指\(C\)与\(D\)合在一起
- 优势:
- 廉价
- 劣势:
- 无法确定出错的位置
- 无法纠正错误
- 适用于较短的 \(D\)
汉明码
- 基本思想:
- 将数据的位分组, 每位都分到多个组且分到的组的情况不同, 每个组中奇偶校验产生一位校验码, 最后根据所有组的校验码可以定位到这位数据
- 前提:仅有一位出错
- 具体过程:
- 将 \(M\) 位数据 \(D\) 分成 \(K\) 组
- 每个组中产生一位奇偶校验码, 最终产生一位\(K\) 位的校验码 \(C'\)
- 由 \(D'\) 产生 \(C''\)
- 检查: 故障字 \(SW=C'\oplus C''\), 长度为 \(K\) 位
- 校验码的长度
- 要确保故障字的情况能够包含所有的情况在内.即$$2^K\geq 1+ M+K$$
其中 \(K\) 为校验码出错情况,\(M\) 为数据出错情况, 1 未出错情况
- 要确保故障字的情况能够包含所有的情况在内.即$$2^K\geq 1+ M+K$$
- 故障字分析:
- 如果是数据位出错,那么至少有两位校验码会出错, 即故障字至少有两位为1,可得下面规则
- 全为0 : 没有错误
- 只有一位为 1: 校验码 \(C'\) 出错,无需纠正
- 多位为 1: 数据位出错,需要纠正(对相应位置的数据取反)
- 如果是数据位出错,那么至少有两位校验码会出错, 即故障字至少有两位为1,可得下面规则
- 数据位划分
- 以 8 位的数据 \(D = D_8...D_2D_1\)为例子,校验码\(C_1C_2C_3C_4\)
- 关系如下
数据在传输的时候也正是这样穿插进行的 - 数据位划分\[\begin{aligned} C_{1}=D_{1} \oplus D_{2} \oplus D_{4} \oplus D_{5} \oplus D_{7} \\ C_{2}=D_{1} \oplus D_{3} \oplus D_{4} \oplus D_{6} \oplus D_{7} \\ C_{3}=D_{2} \oplus D_{3} \oplus D_{4} \oplus D_{8} \\ C_{4}=D_{5} \oplus D_{6} \oplus D_{7} \oplus D_{8} \end{aligned}\]
循环冗余校验 (CRC)
- 奇偶校验问题:
- 需要将数据 划分为字节级
- 额外开销很大
- CRC 适用于以流形式存储和传输大型数据
- 用数学函数产生数据和校验码的关系
- 过程:
- 对于 \(n\) 位的数据 \(D\), 次数为 \(K\) 的生成多项式(用二进制表示的话有 \(K+1\) 位),需要将 \(D\) 左移 \(K\) 位.
- 进行模二取余的除法运算, 具体过程如下图:
- 检查:
- 将 \(n+k\) 位的内容对生成多项式做上述操作,如果无误,所得结果为0
RAID 磁盘冗余阵列
RAID
基本思想
使用多个磁盘, 分散的 I/O 请求, 以至于单一的 I/O 请求可以被并行处理, 只要请求的数据分散在不同的磁盘上.
特点
- RAID 是被视为一块逻辑磁盘的一组物理磁盘.
- 数据交叉分布在物理磁盘上.
- 冗余的磁盘可用于存储奇偶校验信息, 以保证再磁盘故障的情况下的数据可恢复性.
RAID 0
数据在可用的磁盘上条带 (strip) 状排列, 如果数据跨物理磁盘, 则同时读写
不含冗余盘
用途:
- 高速率数据传输
- 高速 I/O 请求
与单个的大容量磁盘相比:
优点: 若两个不同的 I/O 请求等待不同的两块数据, 如果这两块数据位于不同的物理磁盘, 就能加速.
缺点: 若数据跨盘, 只要其中的一块硬盘坏了, 所有的都不能读取.
RAID 1
所有的数据都按 RAID 0 的方式存取, 只是每个数据都存两份 ( 镜像 ).
优点: 恢复很简单, 可以加速读取 ( 若两块硬盘中同时有这个数据 ).
缺点: 浪费, 性能会降低为较慢的盘.
用途: 仅用于存储系统文件, 数据和其他高度关键文件的驱动器.
与 RAID 0 相比:
- 若请求的大部分是读取, RAID 1 可以实现较高的 I/O 请求率, 性能几乎是 RAID 0 的两倍.
- 若大部分是写请求, 性能没有显著的优势.
RAID 2 (未商业化)
使用并行存取技术(为一个客户服务):
- 所有的成员磁盘参与 I/O 的运算,
- 各自驱动器的轴是同步旋转的, 以便每个磁盘磁头的位置在同一时刻是相同的.
使用数据条带: 条带很小, 一个字节或者一个字.
纠错机制:
- 每个磁盘相应位置计算校验码, 并存在多个校验盘的相应位置上.通常使用汉明码.
- 读: 获取所请求的数据以及校验码.
- 写: 必须访问所有的数据盘和校验盘.
优点:
- 高速率数据传输
- 数据丢失可以恢复
缺点:
- I/O 响应慢, 同时只能处理一个 I/O
- 成本过高, 因为磁盘可靠性已经得到了极大提高, 不容易出现大量错误
RAID 3
使用并行存取技术.
使用很小的条带
纠错机制:
-
一个奇偶校验盘, 存有数据盘相同位置数据的奇偶校验码
-
若有一个磁盘失效, 可以由其他磁盘和校验盘恢复出这个数据, 如 \(b_0\) 失效:
\[b_0 = P(b)\ \oplus b_1 \oplus b_2 \oplus b_3 \]
性能:
- 高速率传输数据, 对大型传输改善尤为明显.
- 一次只能执行一个 I/O 请求
RAID 4(未实现商业化)
使用独立访问技术: 期望每个成员磁盘独立操作, 可以独立地并行完成 I/O 请求.
使用较大的数据条带
纠错机制: 每个数据盘上相应的条带上逐位计算奇偶校验带, 存储在奇偶校验盘的相应位置.
性能:
-
执行小规模 I/O 写请求时, RAID 4 遭受写损失
-
每次写操作, 阵列管理软件不仅需要更新数据 , 还需要更新对应的奇偶校验码. 两读两写.
\[P' = P \oplus b_0\oplus b_0' \] -
涉及大规模 I/O 写入, 仅根据新数据原数据和校验码就能得到新的校验码.
-
冗余盘不能同时进行多个 I/O 操作, 成为写的瓶颈.
RAID 5
与 RAID 4 相类似, 但是没有专门的冗余盘, 而是分散到各个盘, 减少了 I/O 瓶颈.
RAID 6
多一块磁盘, 两种纠错码相互印证.
内存管理
过去, 只有操作系统和一个程序在内存中.
现在, 操作系统和多个程序都在内存中. 程序等待 I/O 时, 为了避免处理器等待, 需要进行优化, 使得更多的程序可以加载入内存.
内存管理: 在多程序设计系统中, 内存的 "用户部分" 应该被进一步划分以适应多个程序, 这是由系统动态决定的.
加载更多程序的途径
-
增大内存
-
使用交换和重叠技术
-
当没有程序就绪的时候, 系统载入程序
-
分区和分页
-
-
虚拟内存
- 请求分页
- 虚拟地址
分区
固定大小分区
系统: 固定的大小
用户程序: 固定的大小, 但各不相同. 当加载一个程序的时候, 将其载入刚好能够容纳下这个程序的最小的区中.
缺点: 产生大量内部碎片.
可变大小分区
系统: 固定的大小
用户程序: 按需分配
缺点: 产生大量外部碎片
分页
基本思想:
-
将内存分为固定大小的块, 称为页框(页帧), 将程序分为固定大小的块, 称为页
-
将页加载入页框中
逻辑地址: 指令中的地址
物理地址:主存中的地址
虚拟内存
内存的大小是有限的,但是对内存的需求在不断增加
基本思想:请求分页,一个进程的页只有在需要的时候才被调入
本质:
- 在比内存大的逻辑地址空间中编程
- 只调入需要的程序和数据
- 通过硬件将逻辑地址转化为物理地址
- 当发生页缺失的时候在内存和硬盘之间交换信息
一些问题
- 页的大小: 4KB, 8Kb...
- 映射函数: 关联映射
- 类型:
- 基于页的虚拟内存
- 基于段的虚拟存储器
- 基于段和页的虚拟内存
- 写策略: 写回
基于页的虚拟内存
将主存和虚拟内存分成相同大小的页
- 虚页(Virtual page)/逻辑页(Logical page): 虚拟内存中的页
- 物理页(Physical page)/页框(page frame): 主存中的页
页表:
- 包含着所有虚页的信息, 包括位置, 有效位, 脏位, 可读写位
- 存储在主存中
- 虚拟地址 \(<-\) 虚页号 + 页内地址 (偏移量)
快表 (TLB)
页表的使用增加了主存的访问
为了减少访问主存, 将最常用的页表项加载进 cache
TLB: 页表项被载入 cache
- 全相联映射, 组关联映射
- 随机替换策略
No. | TLB | page table | cache | possibility | |
---|---|---|---|---|---|
1 | hit | valid | --------- | hit | possible, in cache | |
2 | hit | invalid | --------- | hit | impossible | |
3 | hit | invalid | --------- | miss | impossible | |
4 | hit | valid | --------- | miss | possible, in memory bu not in cache | |
5 | miss | valid | hit | possible, in cache | |
6 | miss | invalid | hit | impossible | |
7 | miss | valid | miss | possible, in memory bu not in cache | |
8 | miss | invalid | miss | possible, not in memory |
ps: 快表中只有 valid 情况下才能算 hit
分析:
- 最好: 1, 未访问内存
- 好 4, 5 只访问一次内存
- 坏 7 两次访问主存
- 最坏 8 两次访问主存, 并访问硬盘
基于段的虚拟存储器
将程序和数据分成不同长度的段, 并将需要的段载入主存
虚拟地址: 段号 + 段内偏移量
与基于页的虚拟内存相比:
- 基于页的虚拟内存
- 优势: 简单, 成本低
- 劣势:指令和数据可能跨页
- 优势: 简单, 成本低
- 基于段的虚拟内存
- 优势: 数据和程序自然划分
- 劣势: 长度并非固定
基于段和页的虚拟内存
将程序和数据划分为段, 并进一步将段划分为页, 每一个段都有它自己页表
虚拟地址: 段号 + 页号 + 偏移量
优势: 程序在段中可以共享和保护
劣势: 需要多次查表
补充 PA 中的内存管理部分
实模式
8086的实模式
- 寄存器长度:16 位
- 访问内存需要结合段寄存器(segment register)进行
- 地址线:20 根
- 物理地址计算方式
- physical address = (seg_reg<<4)+offset,offset 为 16 位的偏移量
- 可寻址空间:\(2^{20}\)=1MB
分段机制
x86 的机器开机后首先进入实模式
- 加载操作系统
- 操作系统初始化段表
- 拨动一个"开关", 从实模式切换到保护模式
进入保护模式后
- 程序给出 48 位逻辑地址(16位段选择符 + 32 位有效地址)
- 使用段选择符来查段表
- 进行段级地址转换得到线性地址
分段机制(地址转换)
80386 保护模式下的地址转换
-
逻辑地址到线性地址的转换
-
逻辑地址: 48 位, 又叫虚拟地址,其中
段选择符: 16 位(sreg对应的段寄存器的内容)
段内偏移量(有效地址): 32 位(vaddr给出的32位地址)
-
总线
芯片内部总线
连接芯片的各个部分
例如连接寄存器, ALU和 CPU 的其他部分
通信总线
连接主机和 I/O 设备或者连接不同的计算机系统
系统总线
连接 CPU, 主存, I/O 控制器和其他的功能设备
内容
总线可以分为三种功能组
-
数据线: 在系统模块之间移动数据. 数据线的数量决定了一次能能够传送的数据的最大容量
-
地址线: 指定数据线上的数据的来源或者去向. 地址线也用于 I/O 端口的寻址. 地址线的数量决定了寻址空间的大小
-
控制线: 控制对数据和地址线路的访问和使用.
各种控制信号:
- 时钟: 用于总线同步
- 总线请求(Bus Request): 表示模块需要获得对总线的控制
- 总线允许(Bus Grant): 表示发出请求的模块已经被允许控制总线
- 中断请求: 表示某个中断尚未被处理
- 中断响应: 未决的中断请求被响应
- 存储器写: 引起总线上的数据写入被寻址的单元
- 存储器读: 使所寻址的单元的数据放在总线上
- I/O 读: 从 I/O 端口读取数据到总线
- I/O 写: 将数据从总线写入到 I/O 端口
设计要素
总线类型
专用:
永久地分配给一个功能或者计算机部件的物理子集
优势:高吞吐率, 因为有更少的总线竞争
缺点: 增加了尺寸和成本
复用:
多种用途使用相同的线路
优势: 更少的线路, 节省了空间和成本
缺点: 每个模块中需要更加复杂的电路, 可能会降低共享的性能
仲裁
总线可以被多个设备监听, 但只能被一个设备发送信息
总线仲裁: 当多个设备要与总线通信的时候, 用某种策略选择一台设备
平衡:
- 优先级: 优先级高的设备应该先得到服务
- 公平性: 优先级最低的设备不可能永远被推迟
集中式:
一个被称为总线控制器的单独的硬件设备, 负责位总线分配时间
-
菊花链
所有的设备串行连接, 许可从最高优先级设备传到最低优先级设备
若一个设备收到授权, 并且有总线请求, 设置总线忙并且许可不再被传递.
优势: 确定优先级很容易, 添加设备很灵活
劣势:无法兼顾公平性, 对设备故障敏感, 限制了总线速度
-
计数器查询
移除了总线许可线, 使用设备 ID 线.
若总线不繁忙, 仲裁器将通过设备 ID 线发送计数, 若设备 ID 线上的 ID 与一设备 ID 相同, 同时该设备发出请求, 则将总线设为忙, 同时停止计数
优势:对电路故障不敏感, 可以通过灵活地报数来兼顾公平和优先性
劣势:增加了 ID 线, 需要解码和比较 ID 信号
ps: ID 线是一组而不是一根
-
独立请求
每个设备都有它的总线请求和总线许可线
当一个设备请求总线时, 它通过总线请求先向总线仲裁器发送请求信号.由仲裁器决定哪些设备可以使用总线.
确定策略: 固定优先级, 菊花链, LRU, FIFO
优势:响应快,无等待, 优先级很灵活
劣势:控制逻辑复杂, 更多的控制线
分布式:
没有中央控制器, 而是在每个模块中包含访问控制逻辑, 这些模块共同作用, 分享总线.
-
自举式
固定优先级
每个设备在它的总线请求线上发送请求, 最低优先级的设备没有请求线(但是有道作业题说优先级最低的设备的请求线用来设置总线忙)
每个设备独立决定它是否拥有最高优先级
-
碰撞检测
当一个设备想要使用总线的时候, 检查总线是否为忙, 如果不忙, 使用总线.
若发生碰撞(冲突),即两个设备发现总线不忙, 但是它们同时发起请求. 在数据传输时, 设备会监听总线, 检查是否存在碰撞, 如碰撞发生了, 所有使用总线的设备将停止数据传输, 并在随机持续一段时间后再次请求总线.
时序
总线上协调时间的方式: 决定每个总线事务的开始和结束时间
-
同步时序: 总线上的事件的发生由时钟决定
总线事务: 地址 + 数据 + 数据 +...+ 数据
优势:容易实现 , 测试
劣势: 所有的设备共享时钟; 无法避免时钟漂移的影响
CLK 时钟, BReq 总线请求, BG 总线许可
-
异步时序: 总线上一个事件的发生遵循并取决于前一个事件的发生
总线事务: 地址 + 数据 + 数据 +...+ 数据
使用 握手协议
优势: 对速度不同的各种设备都很灵活
劣势: 对噪声敏感; 接口逻辑复杂
握手的样例:
-
半同步时序: 结合同步时序(时钟)和异步时序(握手)
为了减小噪声的影响, 在异步时序中使用时钟.时钟上升沿的就绪信号和应答信号都是有效的. 额外加一条等待线, 以协调不同速度的设备, 比如图中在第三个时钟周期时, Data1 尚未准备完毕, 所以继续等待直到 Data1 准备好, 释放等待线.
-
分割事务: 分割总线事务: 当设备准备好数据时释放总线
将一个总线事务分割成两个过程
优势:提高了总线利用率
缺点:增加了每个总线事务的持续时间和系统复杂性
总线带宽和数据传输率
总线带宽:总线的最大数据传输率
- 不考虑总线仲裁, 地址传送
数据传输率:
- 考虑地址传输
总线宽度:组成总线的总的线路数
- 数据线越宽, 一次传输的位数就越大
- 地址总线越宽, 可寻址的范围也就越大
数据传输类型
指令集: 特征
机器指令特征
CPU 的操作由它所执行的指令确定, 这些指令被称为机器指令. CPU 能执行的各种不同指令的集合称为 CPU 的指令集
指令周期
指令周期: 指单条指令所需的处理过程
- 取指令: 每次从内存中取一条指令
- 执行指令: 执行每条指令
只有关机时, 程序执行才会停止, 或者遇到致命错误或者停止计算机的指令.
指令周期状态图:
带有中断的指令周期
带有中断的指令周期:
带有中断的指令周期状态图:
机器指令要素
-
操作码:指定要执行的操作
-
源操作数引用:操作会涉及一个或多个源操作数, 这是操作所需的输入
-
结果操作数引用:该操作可能产生一个结果
-
下一指令引用:它告诉处理器这条指令执行完成后到哪儿去取下一条指令
指令表示
- 每条指令都由一个位序列表示
- 指令格式:指令被划分为字段,对应于指令的要素
- 对于大多数指令集,使用一种以上的格式
- 符号表示:帮助程序员和教科书的读者处理指令
- 操作码用缩写表示,称为助记符
- ADD: ADD, SUB: subtract, MUL: multiply, DIV: divide,
- LOAD:从内存加载数据,STOR:将数据存储到内存
- 操作数也用符号表示
- 用寄存器名或内存地址替换操作数
指令类型
- 数据处理:算数和逻辑指令
- 数据存储: 存储器指令
- 数据传送:I/O指令
- 控制: 测试和分支(branch)能力
操作类型
- Data transfer
- Arithmetic
- Logical
- Conversion
- I/O
- System control
- Transfer of control
操作数类型
- 地址
- 数字
- 字符
- 逻辑(布尔)量
指令集:寻址方式和指令格式
表示:
- A: 指令中地址字段的内容
- R: 指向寄存器的指令字段的内容
- EA: 被访问未知的实际(有效)地址
- (X): 存储器位置 X 或者寄存器 X 的内容
立即寻址 (Immediate Addressing)
操作数存在于指令中:
应用: 定义和使用常数, 或者设置变量的初始值.
优点: 获取操作书不需要访问存储器, 只获取指令
缺点: 数字的大小被限制为地址字段的大小
直接寻址 (Direct Addressing)
地址字段包含着操作数的有效地址, 早期计算机常见
优点: 只有一次存储器访问, 不需要进行专门计算
缺点: 只能提供有限的地址空间
间接寻址(Indirect Addressing)
指令中地址字段只是一个存储器字地址, 而这个地址保存着操作数的全长度地址
优点: 扩大了寻址空间
缺点: 需要访问两次内存来获取操作数
评价: 一次能够引用的不同地址数存在限制
寄存器寻址 (Register Addressing)
类似直接寻址, 地址字段指的时寄存器而不是一个主存地址.
优点: 指令中只需要一个很小的地址字段用来指向寄存器, 不需要访问内存
缺点: 寻址空间极其有限
注意: 只有寄存器得到了有效的使用才有意义
寄存器间接寻址(Register Indirect Addressing)
地址的字段指向一个寄存器
优点: 扩大了寻址空间, 比间接寻址少访问一次主存
劣势: ?
偏移寻址(Displacement Addressing)
结合直接寻址和间接寻址
指令中有两条地址字段, 其中至少一个是显性的. 其中一个地址字段(val = A) 被直接使用, 另一个地址字段指向寄存器. 寄存器的内容加上 A 产生有效地址.
三种偏移寻址:
1.相对寻址
隐式引用的寄存器时程序计数器PC
, 即当前 PC 的值 (为现执行指令的下一条指令的地址), 加上地址字段的值(A, 通常为补码整数), 得到有效地址
优点: 利用了程序局部性的概念, 并在指令中保存了地址位.
用途: 子程序跳转?
2.基址寄存器寻址
引用的寄存器含有一个主存地址, 地址字段含有一个相对于那个地址的偏移量(usually unsigned)
可以是显式引用, 也可以是隐式引用
3.变址
地址字段引用一个主存地址, 被引用的寄存器对于那个地址有一个正的偏移量
用法: 高效完成重复操作, 将值 A 存入指令的地址字段, 选取一个寄存器作为变址寄存器, 初始化为0, 每次操作之后, 变址寄存器加1
扩展:结合间接寻址和变址:
-
后变址: 间接寻址之后变址
EA = (A) + (R) -
前变址: 变址在间接寻址之前
EA = (A+(R))
栈寻址
栈指针维护在寄存器中, 所以对内存栈位置的访问实际上是一种寄存器间接寻址方式.
注意: 与栈相关的是一个指针, 它的值可能是栈顶地址或者第三个元素的地址(前两个可能已经进入寄存器)
指令格式
指令长度, 位分配, 可变长度指令