一、计算机组成概论

硬件组成

早期冯诺依曼机

  • 由五大部件组成;
  • 指令和数据以同等地位存储于存储器,可按地址寻访;
  • 指令和数据用二进制表示;
  • 指令由操作码和地址码组成;
  • 提前把程序放到存储器中;
  • 以运算器为中心;(输入/输出设备与存储器之间的数据传送通过运算器完成)

image-20220107160155158

在计算机系统中,软件和硬件在逻辑上是等效的。
例如:对于乘法运算,可以设计一个专门的硬件电路实现乘法运算,也可以用软件的方式,执行多次加法运算来实现。

现代计算机

  • 以存储器为中心,CPU = 运算器+控制器;

image-20220107160853468

image-20220107160814200

CPU、存储器及工作过程

CPU

  • 运算器

    • ALU:算数逻辑单元(Arithmetic and Logic Unit)(组合逻辑),通过内部复杂的电路实现算数运算、逻辑运算;

    • MQ:乘商寄存器(Multiple-Quotient Register),在乘除运算时,用于存放操作数或运算结果;

    • ACC:累加寄存器(Accumulator),用于存放操作数,或运算结果;

    • X:通用寄存器(有很多个,X只是指在用其中某一个),用于存放操作数;

    • PSW:程序状态寄存器,存放状态信息和控制信息(Program Status Word)

    • MQ, ACC, X主要存放计算的中间结果:

      加 减 乘 除
      ACC 被加数,和 被减数,差 乘积高位 被除数,余数
      MQ 乘数,乘积低位 商
      X 加数 减数 被乘数 除数
  • 控制器

    • CU:控制单位,分析指令,给出控制信号(Control Unit)(时序逻辑)
    • IR:指令寄存器,存放当前执行的指令(Instruction Register)
    • PC:指令地址,存放下一条指令地址,可以自动加1

主存储器

  • 存储体:数据在存储体内按地址存储;每个地址对应一个存储单位(存储字)
  • MAR:地址寄存器
  • MDR:数据寄存器

注:MAR位数反映存储单元的个数,MAR=4位:总共有2^4^个存储单位

MDR位数=存储字长,MDR=16位:每个存储单元可存放16bit,一个存储字(word)=16bit; 易混淆:1个字节(Byte)=8bit,1B=1个字节,1b=1bit

计算机工作过程—取数指令

(这里用M表示主存中某存储单元)

M(MAR):根据MAR的数据访问存储体中的数据

(ACR):取相应寄存器中的数据

指令:操作码+地址码;

OP(IR):取操作码; Ad(IR):取地址码

过程演示:取指令—分析指令—执行指令(指令周期)

1 (PC) —> MAR:将PC(指令地址) 中的指令地址放到MDR(地址寄存器)中;

2,3 M(MAR)—>MDR:根据MAR中的地址,访问存储体中的数据,再将数据放入MDR(数据寄存器)(这里的数据是一条指令);

4 (MDR) —> IR:将MDR拿到的指令放到 IR(指令寄存器);(到这里取指令阶段结束)

5 OP(IR) —>CU:从IR中取出操作码,放入CU(控制单元) ,CU会分析指令;(分析指令阶段结束)

6 Ad(IR) —> MAR:从IR中取出地址码,放入MAR;

7,8 M(MAR) —>MDR:根据MAR中的地址,访问存储体中的数据,再将数据放入MDR(数据寄存器)(这里的数据是要进行操作的数据);

9 MDR—>(运算器中的寄存器) :将MDR拿到的数据放到运算器中的对应的寄存器中(指令执行阶段结束)

注:CPU区分MDR中取出的是指令还是数据的依据:指令周期的不同阶段

image-20211121101940553

计算机的层次结构

从高到低依次为:

  • 软件
    • 虚拟机器M4(高级语言机器):用编译程序翻译成汇编语言程序
    • 虚拟机器M3(汇编语言机器):用汇编程序翻译成机器语言程序
    • 虚拟机器M2(操作系统机器):向上提供“广义指令”(即系统调用)
  • 硬件
    • 传统机器M1(机器语言机器):执行二进制机器指令
    • 微程序机器M0(微指令系统):用硬件直接执行微指令

计算机的性能指标

存储器的性能指标

存储器=存储体+MAR+MDR

其中MAR位数反映存储单元的个数(最多存多少个),MDR位数=存储字长=每个存储单元的大小

总容量 = 存储单位个数 * 存储字长(bit)

例:MAR为32位,MDR为8位,则总容量 = 2^32^ * 8 bit = 4GB


CPU的性能指标

CPU时钟周期:又称震荡周期,是计算机中最基本的,最小的时间单位。在一个时钟周期内,CPU仅能完成一个最基本的动作。单位:微秒、纳秒

CPU主频(时钟频率):1 / CPU时钟周期, 单位:赫兹,Hz

CPI(Clock cycle Per Instruction):执行一条指令所需的时钟周期数。不同指令或相同指令的CPI都可能不同

执行一条指令的耗时 = CPI * CPU时钟周期

CPU执行时间 = CPU时钟周期数 / 主频 = (指令条数 * CPI)/ 主频

IPS(Instructions Per Second):每秒执行多少条指令 (KIPS, MIPS….)

IPS = 主频 / 平均CPI

FLOPS(Floating-point Operations Per Second):每秒执行多少次浮点数运算(KFLOPS, MFLOPS, GFLOPS, TFLOPS….)


系统整体的性能指标

数据通路带宽:数据总线一次所能并行传递信息的位数;

吞吐量:系统在单位时间内处理请求的数量(主要取决于主存的存取周期);

响应时间:指从用户向计算机发送一个请求,到系统对该请求做出响应并获得所需结果的等待时间;


二、数据的表示和运算

进位计数制

r进制:使用符号 和 符号所在的位置也反映权重。

  • 基数:每个位所能使用的不同符号个数,r进制的基数为r;

计算机采用二进制:

  • 数值的每个位,可以使用具有两个稳定状态的物理器件表示;
  • 0,1正好对应逻辑值 真/假,方便实现逻辑运算;
  • 可利用逻辑门电路实现算术运算;

进制转换:

  • r进制 到 十进制:

    r 进制的数值 = 各数码位与位权的乘积之和。

  • 二进制 到 八进制:

    每3个二进制位 对应一个八进制位;

  • 二进制 到 十六进制:

    每4个二进制位 对应一个八进制位;

  • 十进制 到 r进制:

    整数部分:除基取余法(先取得的“余”是整数的低位)

    小数部分:乘基取整法(先取得的“整”是小数的高位)


真值:符合人类习惯,实际的带正负号的数字;

机器数:数字实际存到机器里的形式,正负号需要被“数字化”;

BCD码

8421码

用二进制编码的十进制(Binary-Coded Decimal),使用 四位二进制 表示 十进制的 0 ~ 9,冗余6位,

BCD码的加法: 如果加法运算后,得到的十进制数为10 ~ 18,不在映射表内,即超过0~9的范围,则再加上6,即二进制的0110,则二进制数一定会前进一位,之后在前补3个0,则可以得到二个 四位二进制表示的数。

例:5 + 8 = 13 —> 0101 + 1000 = 1101,超出范围,则再加6,得到 1 0011,在前面补0得到 0001 0011,即13

除了8421码,还有余3码,2421码也是用二进制编码表示十进制

字符与字符串

在ASCII码中, 32~126为可印刷字符,其余为控制或通信字符(ASCII共128个)

数字0~9:48(00110000) ~ 57(00111001)

大写字母:65(01000001)~ 90(01011010)

小写字母:97(01100001)~ 122(01111010)

CB 2312-80码:汉字+各种符号共7445个

  • 区位码:94个区,每个区94个位置,如 汉字“啊”的区位码:10H 01H
  • 国标码:在区位码的两个标号上加上20H,防止信息交换时,与ASCII码的“控制/通信字符”冲突
  • 汉字内码:在国标码的两个标号上加上80H,即加上128,保证高位为1,与ASCII区分

输入:输入编码;

输出:汉字字形码

字符串存储

字母用一个字节存储,汉字用两个字节存储,

汉字的存储又分为大端模式和小端模式,大端模式是将数据的最高有效字节存放在低地址单元中,小端模式放在高地址单元中

校验码

奇偶校验码

奇校验码:整个校验码(有效信息位和校验位)中的“1”的个数为奇数;

偶校验码:整个校验码(有效信息位和校验位)中的“1”的个数为偶数;

奇偶校验码分为1位的奇偶校验位和n位的有效信息位,奇偶校验位是为了让“1”的个数维持想要的奇数或偶数。

偶校验位的硬件实现:各信息进行异或(模2加)运算,得到的结果即为偶校验位

进行偶校验:所有位进行异或,如果结果为1说明出错

偶校验只能发现奇数位错误,且无法确定哪一位出错。

海明码

将信息位分组进行偶校验,即设立多个校验位,可以标注出出错位置

需要设立多少个校验位?

设信息位有n位,校验位有k位,而k个校验位一共能表示2^k^种状态, 所以 2^k^ - 1 >= n + k(减1是因为有一个是正确的状态,没出错)

n与k的关系部分关系表:

n 1 2~4 5~11 12~26 27~57 58~120
k 2 3 4 5 6 7

校验位的分布:校验位 Pi 应放在海明位号为 2^i-1^ 的位置上,其他位放有效信息。

求校验位的值:设各信息所在的位数 的二进制表示为x,第一个校验位等于 所有 x 的第一位(最低位)为1的 信息位值 的异或运算 结果;第二个校验位等于 所有 x 的第二位(最低第二位)为1的 信息位值 的异或运算 结果。。。

纠错:将第 i 个校验位值 和 x 的第i位(最低第 i 位)为1的 信息位值 进行异或运算,如果所有 运算后都得到0,则没有出错,如果有 结果为1 的情况出现,则说明出错,将所有校验位 拼成一个二进制表示,其值就是出错的位数。

image-20211118185904877

海明码检错能力:1位, 纠错能力 : 2位,此时海明码没办法区分 是一个bit位出错还是两个bit位出错,为此,需加上全校验位,对全体再进行一次偶校验,才能识别是一位错还是两位错。

image-20211118185817499

循环冗余校验码(CRC)

CRC (Cyclic Redundancy Check)

  1. 确定K, R, 生成多项式对应的二进制码

    首先,需要先约定好 生成多项式 G(x) = x^n^ + x^n-1^+ ….. + x^0^,

    然后确定 信息位的长度K = 信息码的长度, 校验位的长度 R = 生成多项式最高次幂n,整个校验码位数= K + R;

    根据生成多项式里各项的常数部分,生成对应二进制码

  2. 移位

    将信息码左移R位,低位补0,

  3. 相除

    对移位后的信息码,用生成多项式的二进制码 进行模2除法,产生的余数 即为校验位信息

    模2除,模2减(异或运算):

  4. 检错和纠错

    对接收的数据,用约定好的生成多项式的二进制码 进行模2除,得到余数为R位全为0,说明没有出错;余数不为0,说明出错,余数是多少,就是多少位出错。

    CRC可检测出:所有奇数个错误;所有双比特错误;所有小于等于校验位长度的连续错误

    CRC码中的信息位太多,会使纠错得到的余数无法表示太高位,如果满足2^R^-1>=K+R,则CRC可纠正1位错,不过CRC通常用于网络传输,只发挥检错功能(网络传输一次会发送较多bit)

image-20211118190033659

定点数表示

原、补、移码

image-20211118190147440

image-20211118190157729

image-20211118190229297

image-20211118190237631

补码:

  • 正数的补码 = 原码
  • 负数的补码 = 反码末尾 + 1 (要考虑进位)

补码的正值0 只有一种: [+0]补 = [-0]补 = 000000000

定点整数补码 的表示范围:比原码多表示一个 -2^n^;

定点小数补码 的表示范围:比原码多表示一个 -1 ;

image-20211118190244928

image-20211118190252353

image-20211118190302522

image-20220419221426272

使用补码的意义:让减法操作转变为加法操作,节省硬件成本。(涉及求模运算的意义)

因为计算机是固定字长的,所以在进行运算时会舍去溢出的位,这相当于 直接对结果进行了求模运算(%2^n^)。

image-20211118190348822

符号拓展

image-20211118191549313

定点数运算

移位运算

算数移位

image-20211118190446667

image-20211118190500971

image-20211118190508649

image-20211118190521365

逻辑移位

image-20211118190549711

循环移位

image-20211118190557099

加减运算

补码的加减运算:运算同源码一样,求出结果后再转为原码

image-20211118190803498

对于补码的加减运算出现 溢出情况的判断,有三种判断方式:

image-20211118191231755

image-20211118191321945

image-20211118191330388

乘法运算

image-20211118191717510

计算机 的乘法运算 可以对比平时 手算乘法时列的竖式公式,其本质是利用r进制的位权。

计算机实现 原码的乘法运算:先加法,再移位,重复n次(左移位相当于手算时的错位)

image-20211118192237385

image-20211118192245580

image-20211118192252905

image-20211118192305905

image-20211118192328486

补码的乘法运算:

image-20211118192428730

image-20211118192540200

image-20211118192547837

image-20211118192558787

除法运算

根据手算除法的过程,计算机 实现原码的除法运算:看当前位的商为0/1,得到余数,余数末尾补0,得到的余数当作新的被除数。

(定点小数除法 规定 被除数一定要小于除数,不然结果会大于1,而定点小数无法表示大于1的数)

原码—恢复余数法

计算机不会去判断当前被除数和除数谁打谁小,而是直接将当前商位置为1(MQ里操作),计算得到余数( 余数 = 被除数 + [-|y|]补码 ),如果余数为负,说明商为1是错的,所以会将商位置为0,让余数重新加上除数,即让余数恢复为被除数,然后再计算商为0时应得的余数。

image-20211118192659788

image-20211118193424237

image-20211118193444434

image-20211118193453852

原码—加减交替法

恢复余数法中的一些步骤可以合并,根据恢复余数法前后的结果,可以算出:如果商位置1是错的(即得到余数为负),则商位置1,然后让余数左移一位(乘2),再加上|除数|,这样可以直接将错误的余数转化为正确的余数。

image-20211118193510093

image-20211118194222167

image-20211118194232160

补码—加减交替法

补码的加减交替法,与原码不同在于:补码除法的符号位会参与运算(求补码时不会先求绝对值),数据采用双符号位。

补码除法求余数时,余数不会直接等于(被除数 + [-|y|]补码 ),而是:1. 如果被除数和除数同号,则被除数减去除数,2. 如果异号,则被除数加上除数。

对于商位是1还是0:1. 余数和除数同号,则商为1,然后余数左移一位,减去除数;2. 余数和除数异号,商为0,余数左移一位,加上除数。过程重复n次。

最后,末尾商会恒置为1,这样可以不考虑最后算出的余数是否需要恢复余数,省去额外电路的设计,且这样做精度误差是不超过 2^-n^ 的。

image-20211118194241590

image-20211118194251001

数据存储|边界对齐

image-20211120184018313

浮点数

IEEE 754标准

IEEE读作 i triple e :triple是三倍的意思

image-20211120184237269

image-20211120184326877

image-20211120184331950

image-20211120184336345

浮点数的加减运算

image-20211120184152834

image-20211120184617835

强制类型转换

image-20211120184633939

ALU大致原理

电路基础知识

image-20211120184649625

image-20211120184653982

image-20211120184658348

image-20211120184706787

加法器的实现

image-20211120184713453

image-20211120184718342

image-20211120184732882

加法器、ALU改进

image-20211120184739339

image-20220111095619918

image-20220111095547417

三、存储系统

存储器

功能:存放二进制信息。

层次:

  • 高速缓冲存储器(cache)
  • 主存储器(主存、内存)
  • 辅助存储器(辅存、外存)

Cache解决CPU和主存之间速度不匹配的问题,由硬件自动完成;

辅存解决主存容量不够的问题,需要硬件和操作系统配合完成。

存储器模型

image-20211120185413723

  • 存储矩阵:由大量相同的位存储单元阵列构成。
  • 译码驱动:将来自地址总线的地址信号翻译成对应存储单元的选通信号,该信号在读写电路的配合下完成对被选中单元的读/操作。
  • 读写电路:包括读出放大器和写入电路,用来完成读/写操作。
  • 读/写控制线:决定芯片进行读/写操作。
  • 片选线:确定哪个存储芯片被选中。可用于容量扩充。
  • 地址线:是单向输入的,其位数与存储字的个数有关。
  • 数据线:是双向的,其位数与读出或写入的数据位数有关。
  • 数据线数和地址线数共同反映存储芯片容量的大小;如地址线10根,数据线8根,则芯片容量-=20×8-8K位。

寻址

有多种方式:可按 字节、字、半字、双字 寻址;

多字节存放方式:

  • 大端方式:数值的高位放在地址的低位;
  • 小端方式:数值的低位放在地址的低位;

随机存取器RAM

SRAM(Static Random Access Memory ):静态随机存储器

DRAM(Dynamic Random Access Memory):动态随机存取器

两者都是以电信号的形式存储0和1,断点就丢失信息,所以也叫易失性存储器。

SRAM:

  • 存储信息(0、1):使用触发器——双稳态;
  • 非破坏性读出:读——查看触发器状态;写——改变触发器状态;
  • 不需刷新:触发器能保持两种稳定的状态;
  • 同时送行列式地址;
  • 运行速度 快
  • 集成度 低:6个逻辑元件;
  • 发热量 大
  • 存储成本 高

DRAM:

  • 存储信息(0、1):使用电容——充放电;
  • 破坏性读出:读——连接电容,检测电流变化,读出后需要重新充电;写——给电容充/放电
  • 需刷新:电容上的电荷只能维持2ms;
  • 分两次送行列式地址:地址分成相同位的行列地址,地址线可以复用,线数减半;
  • 运行速度 慢
  • 集成度 高:1或3个逻辑元件;
  • 发热量 小
  • 存储成本 低

由于SRAM速度快,成本高,所以常用作Cache;而DRAM常用作主存;

SDRAM:同步动态随机存储器,是DRAM的发展变形



DRAM的刷新

刷新周期:一般2ms

每次刷新:以行为单位,每次刷新一行存储单元

为什么使用行列地址?

因为如果采用一维模式的话,2^n^个存储单元需要2^n^根选通线;如果使用行列地址,将一个地址分成两半,则每一半地址只需2^n/2^根线,一共需要2 * 2^n/2^ 根线。

如:2^8^ = 256根选通线,只需2 * 2^4^= 32根选通线

如何刷新:有硬件支持,读出一行的信息后重新写入,占用一个读/写周期;

刷新时机:

  • 分散刷新:

    每次读写完都刷新一行,这样系统的存取周期会翻倍。

  • 集中刷新:

    在刷新周期内集中安排一段时间用于刷新全部行,这段时间内无法访问存储器,称为访存“死区”。

  • 异步刷新:

    在刷新周期内刷新1次即可,即刷新请求在刷新周期内均匀分布,”死区“会被平均分散。

只读存储器ROM

(Read-Only Memory)

ROM是非易失性存储器

类型:

  • 膜式只读存储器(MROM):

    存储内容由半导体制造厂按用户提出的要求
    在芯片的生产过程中直接写入,无法修改。

  • 一次可编程只读存储器(PROM):

    存储内容由用户用专门的设备(编程器)一次性写入,之后无法修改。

  • 可擦除可编程只读存储器( EPROM):

    修改次数有限,写入时间很长;类型有 紫外线擦除(UVEPROM)、电擦除(EEPROM)。

  • 闪速存储器(Flash Memory):

    如U盘,写入速度较快。

  • 固态硬盘( Solid State Drives):

    控制单元 + FLASH芯片

主存与CPU连接

image-20220110112634686

连接原理:

  • 主存储器通过数据总线、地址总线和控制总线与CPU连接;
  • (数据总线的位数 * 工作频率 )正比于数据传输速率;
  • 地址总线的位数决定了可寻址的最大内存空间;
  • 控制总线(读/写)指出总线周期的类型 和 本次输入/输出操作完成的时刻;

主存容量的扩展:

由于单个存储芯片的容量有限,在字数或字长方面与实际的要求都有差距,因此需要在字和位两方面进行扩展。

  • 位扩展法

    CPU的数据线数与存储芯片的数据位数不一定相等,此时必须对存储芯片扩位,使其数据位数与CPU的数据线数相等。
    位扩展的连接方式是将多个存储芯片的地址端、片选端和读写控制端相应并联,数据端分别引出。

    image-20220110113624661

  • 字扩展法

    字扩展是指增加存储器中字的数量,而位数不变。字扩展将芯片的地址线、数据线、读写控制线相应并联,而由片选信号来区分各芯片的地址范围。

  • 字位同时扩展法

    实际上,存储器往往需要同时扩充字和位。字位同时扩展是指既增加存储字的数量,又增加存储字长。

    image-20220110113930006

    image-20220110113939759


存储芯片的地址分配和片选

CPU对存储器的访问:先片选 再字选。

  1. 片选:选择存储器芯片;
    • 线选法:用除片内寻址外的高位地址线分别接至各个存储芯片的片选。(线路简单,地址不连续,一条线只产生一个选片信号)
    • 译码片选法:用除片内寻址外的高位地址线通过地址译码器芯片产生片选信号。(电路复杂,地址空间连续,可增加逻辑设计,n条线可产生2^n^个选片信号)
  2. 字选:对选中的芯片,依据地址码 进行数据存取;

双口RAM和多模块存储器

提高CPU访问存储器的速度:

  • 双端口存储器:空间并行;
  • 多模块存储器:时间并行。

双端口RAM:

双端口RAM是指同一个存储器有左、右两个独立的端口,分别具有两组相互独立的地址线、数据线和读写控制线,允许两个独立的控制器同时异步地访问存储单元。

注:当两个端口同时对存储器的同一地址进行修改时,可能会发生数据错误或读取错误;

image-20220110115750687

存取周期:

image-20220111085521860

多模块存储器:

常用的有:单体多字存储器 ,多体低位交叉存储器。

  • 单体多字存储器:

    单体多字系统的特点是存储器中只有一个存储体,每个存储单元存储m个字,总线宽度也为m个字。一次并行读出m个字,地址必须顺序排列并处于同一存储单元。
    单体多字系统在一个存取周期内,从同一地址取出m条指令,然后将指令逐条送至CPU执行,即每隔1/ m 存取周期,CPU向主存取一条指令。显然,这増大了存储器的带宽,提高了单体存储器的工作速度。

    缺点:指令和数据在主存内必须是连续存放的,一旦遇到转移指令,或操作数不能连续存放,这种方法的效果就不明显。

  • 多体并行存储器:

    多体并行存储器由多体模块组成。每个模块都有相同的容量和存取速度,各模块都有独立的读写控制电路、地址寄存器和数据寄存器。它们既能并行工作,又能交叉工作。
    多体并行存储器分为 高位交叉编址(顺序方式)和低位交又编址(交又方式)两种。

    • 高位交叉编制:

      高位地址表示体号,低位地址表示体内地址;总是会把低位的体内地址送到由高位体号确定的模块内进行译码。

      访问一个连续主存块时,总是先在一个模块内访问,等到该模块访问完才转到下一个模块访问,CPU总是按顺序访问存储模块,存储模块不能被并行访问,因而不能提高存储器的吞吐率。

      模块内的地址是连续的,存取方式仍是串行存取,因此这种存储器仍是顺序存储器

      image-20220110120657545

    • 低位交叉编制:

      低位地址为体号,高位地址为体内地址。

      低位交叉编址方式下,总是把高位的体内地址送到由低位体号确定的模块内进行译码。程序连续存放在相邻模块中,因此称采用此编址方式的存储器为交叉存储器。

      采用低位交叉编址后,可在不改变每个模块存取周期的前提下,采用流水线的方式并行存取,提高存储器的带宽。

      image-20220110120837771

      image-20220110120848340

高速缓冲存储器Cache

提高整个存储系统的工作速度。

程序访问的局部性原理:

  • 时间局部性:在最近的未来要用到的信息,很可能是现在正在使用的信息,因为程序中存在循环。
  • 空间局部性:在最近的未来要用到的信息,很可能与现在正在使用的信息在存储空间上是邻近的,因为指令通常是顺序存放、顺序执行的,数据一般也是以向量、数组等形式簇聚地存储在一起的。

高速缓冲技术就是利用程序访问的局部性原理,把程序中正在使用的部分存放在一个高速的、容量较小的 Cache中,使CPU的访存操作大多数针对 Cache进行,从而大大提高程序的执行速度。



Cache基本工作原理:

Cache位于存储器层次结构的顶层,通常由SRAM构成,其基本结构如图:

image-20220111090254388

为了便于交换信息,Cache和主存都被划分为相等的块,Cache块也叫Cache行,每块的长度称为块长(Cache行长);

由于Cache的容量远小于主存的容量,因此它只保存主存中最活跃的若干块的副本。

  • 当CPU发出读请求时,若访存地址在Cache中命中,则将该地址转化为Cache地址,对Cache进行读操作,与主存无关。若Cache未命中,则仍需要访问主存,将该字所在的块一次性从主存调入Cache,若Cache已满,则需要根据某替换算法,将Cache中的某块替换掉。
  • 当CPU发出写请求时,若 Cache命中,有可能会遇到 Cache与主存中的内容不一致的问题。例如,由于CPU写 Cache,把 Cache某单元中的内容从X修改成了Y,而主存对应单元中的内容仍然是X,没有改变。所以若 Cache命中,需要按照一定的写策略处理,常见的处理方法有全写法和写回法。

数据交换单位:CPU与主存间以字为单位,Cache与主存间以Cache块为单位。

注:某些计算机也采用同时访问 Cache和主存的方式,若Cach命中,则主存访问终止。



Cache和主存的映射关系

Cache行中的信息是主存中某个块的副本,地址映射是指把主存地址空间映射到 Cache地址空间,即把存放在主存中的信息按照某种规则装入 Cache.
由于 Cache行数比主存块数少得多,因此主存中只有一部分块的信息可放在 Cache中,因此在 Cache中要为每块加一个标记,指明它是主存中哪一块的副本。该标记的内容相当于主存中块的编号。为了说明 Cache行中的信息是否有效,每个 Cache行需要一个有效位。

  • 直接映射

    主存中的每一块只能装入 Cache中的唯一位置。若这个位置已有内容,则产生块冲突,原来的块将无条件地被替换出去(无须使用替换算法)。

    直接映射实现简单,但不够灵活,即使Cache的其他许多地址空着也不能占用,这使得直接映射的块冲突概率最高,空间利用率最低。

  • 全相联映射

    主存中的每一块可以装入 Cache中的任何位置,每行的标记用于指出该行取自主存的哪一块,所以CPU访存时需要与所有 Cache行的标记进行比较。

    全相联映射方式的优点是比较灵活, Cache块的冲突概率低,空间利用率高,命中率也高;缺点是标记的比较速度较慢,实现成本较高,通常需采用昂贵的按内容寻址的相联存储器进行地址映射。

  • 组相联映射

    将 Cache空间分成大小相同的组,主存的一个数据块可以装入一组内的任何一个位置,即组间采取直接映射,而组内采取全相联映射。它是对直接映射和全相联映射的一种折中。



Cache块的替换算法

  • 随机算法(RAND)

  • 先进先出算法(FIFO)

  • 近期最少使用算法(LRU)

    LRU算法对每个 Cache行设置一个计数器,用计数值来记录主存块的使用情况,并根据计数值选择淘汰某个块。

  • 最不经常使用算法(LFU)



Cache写策略

因为 Cache中的内容是主存块副本,当对 Cache中的内容进行更新时,就需选用写操作策略使 Cache内容和主存内容保持一致。此时分两种情况。

  • 对于 Cache写命中( write hit),有两种处理方法。

    • 全写法(写直通法、wite- through):

      当CPU对 Cache写命中时,必须把数据同时写入Cache和主存;当某一块需要替换时,不必把这一块写回主存,用新调入的块直接覆盖即可。

      这种方法实现简单,能随时保持主存数据的正确性。缺点是增加了访存次数,降低了 Cache的效率。

      写缓冲:为减少全写法直接写入主存的时间损耗,在 Cache和主存之间加一个写缓冲( Write Buffer)。

      CPU同时写数据到 Cache和写缓冲中,写缓冲再控制将内容写入主存。写缓冲是一个FIFO队列,写缓冲可以解决速度不匹配的问题。但若出现频繁写时,会使写缓冲饱和溢出。

    • 写回法( write-back):

      当CPU对 Cache写命中时,只修改 Cache的内容,而不立即写入主存,只有当此块被换出时才写回主存。这种方法减少了访存次数,但存在不一致的隐患。采用这种策略时,每个 Cache行必须设置一个标志位(脏位),以反映此块是否被CPU修改过。

  • 对于 Cache写不命中,也有两种处理方法。

    • 写分配法(wite- allocate):

      加载主存中的块到 Cache中,然后更新这个Cache块。它试图利用程序的空间局部性,但缺点是每次不命中都需要从主存中读取一块。

    • 非写分配法(not- write- allocate)法:

      只写入主存,不进行调块。

非写分配法通常与全写法合用,写分配法通常和写回法合用。

现代计算机的 Cache通常设立多级 Cache(通常为3级),按离CPU的远近可各自命名为L1 Cache、L2 Cache、L3 Cache,离CPU越远,访问速度越慢,容量越大。
指令 Cache与数据 Cache分离一般在L1级,此时通常为写分配法与写回法合用。

虚拟存储器

提高存储系统的容量。

虚拟存储器将主存或辅存的地址空间统一编址,形成一个庞大的地址空间。虚拟存储器具有主存的速度和辅存的容量,提高了存储系统的性价比。

  • 虚地址、逻辑地址:用户编程所涉及的地址,虚地址对应的存储空间称为虚拟空间或逻辑空间。
  • 实地址、物理地址:对应的是主存地址空间,也称实地址空间。虚地址要比实地址大得多。

CPU使用虚地址时,由辅助硬件找出虚地址和实地址之间的对应关系,并判断这个虚地址对应的存储单元内容是否已装入主存。——若已在主存中,则通过地址变换,CPU可直接访问主存指示的实际单元;——若不在主存中,则把包含这个字的一页或一段调入主存后再由CPU访问。——若主存已满,则采用替换算法置换主存中的一页或一段。

在实际的物理存储层次上,所编程序和数据在操作系统管理下,先送入磁盘,然后操作系统将当前运行所需要的部分调入主存,供CPU使用,其余暂不运行的部分则留在磁盘中。


页式虚拟存储器

虚拟空间和主存空间被划分为同样大小的页,主存的页叫实页,虚存的页叫虚页。

虚拟地址 被分为两个子段:虚页号和页内地址;虚拟地址到物理地址的转换由页表完成。

页表

是一张存放在主存中的虚页号和实页号的对照表,一般长久地保存在内存中。

页表组成:

  • 有效位:也叫装入位,表示页面是否已调入主存;
  • 脏位:也叫修改位,表示页面是否被修改过;虚存机制中使用回写策略。
  • 引用位:也称使用位,用来配合替换策略进行设置。
  • 物理地址:该页对应的物理地址指向。

CPU执行指令时,需要先将虚拟地址转换为主存物理地址。每个进程都有一个页表基址寄存器,存放该进程的页表首地址,然后根据虚拟地址高位部分的虚拟页号找到对应的页表项,若装入位为1,则取出物理页号,和虚拟地址低位部分的页内地址拼接,形成实际物理地址;若装入位
为0,则说明缺页,需要操作系统进行缺页处理。

页式虚拟存储器的优点是,页面的长度固定,页表简单,调入方便。缺点是,程序的最后一页经常会有浪费,并且页不是逻辑上独立的实体,所以在处理、保护和共享都不如段式虚拟存储器方便。

由地址转换过程可知,访存时先访问一次主存去査页表,再访问主存才能取得数据。如果缺页,那么还要进行页面替换、页面修改等,因此采用虚拟存储机制后,访问主存的次数更多了。依据程序执行的局部性原理,在一段时间内总是经常访问某些页时,若把这些页对应的页表项存放在高速缓冲器组成的快表(TLB)中,则可以明显提高效率。相应地把放在主存中的页表称为慢表(Page)。在地址转换时,首先査找快表,若命中,则无须访问主存中的页表。

段式虚拟存储器

段式虚拟存储器中的段是按程序的逻辑结构划分的,各个段的长度因程序而异。

把虚拟地址分为两部分:段号和段内地址。虚拟地址到实地址之间的变换是由段表来实现的。

段表

是程序的逻辑段和在主存中存放位置的对照表。段表的每行记录与某个段对应的段号、装入位、段起点和段长等信息。由于段的长度可变,所以段表中要给出各段的起始地址与段的长度。

段式虚拟存储器的优点是,段的分界与程序的自然分界相对应,因而具有逻辑独立性,使得它易于编译、管理、修改和保护也便于多道程序的共享;

缺点是因为段长度可变,分配空间不便,容易在段间留下碎片,不好利用,造成浪费。


段页式虚拟存储器

把程序按逻辑结构分段,每段再划分为固定大小的页,主存空间也划分为大小相等的页,程序对主存的调入、调出仍以页为基本传送单位,这样的虚拟存储器称为段页式虚拟存储器。

在段页式虚拟存储器中,每个程序对应一个段表,每段对应一个页表,段的长度必须是页长的整数倍,段的起点必须是某一页的起点。

虚地址分为段号、段内页号、页内地址三部分。CPU根据虚地址访存时,首先根据段号得到段表地址;然后从段表中取出该段的页表起始地址,与虚地址段内页号合成,得到页表地址;最后从页表中取出实页号,与页内地址拼接形成主存实地址。

段页式虚拟存储器的优点是,兼具页式和段式虚拟存储器的优点,可以按段实现共享和保护抑。缺点是在地址变换过程中需要两次查表,系统开销较大。


虚拟存储器 与 Cache 的比较:

相同处:

  • 最终目标都是为了提高系统性能,两者都有容量、速度、价格的梯度。
  • 都把数据划分为小信息块,并作为基本的传递单位,虚存系统的信息块更大
  • 都有地址的映射、替换算法、更新策略等问题。
  • 依据程序的局部性原理应用“快速缓存的思想”,将活跃的数据放在相对高速的部件中

不同处:

  • Cache主要解决系统速度,而虚拟存储器是为了解决主存容量。

  • Cache全由硬件实现,是硬件存储器,对所有程序员透明。

    而虚拟存储器由OS和硬件共同实现,是逻辑上的存储器,对系统程序员不透明,但对应用程序员透明。

  • 对于不命中性能影响,因为CPU的速度约为 Cache的10倍,主存的速度为硬盘的100倍以上,因此虛拟存储器系统不命中时对系统性能影响更大。

  • CPU与 Cache和主存都建立了直接访问的通路,而辅存与CPU没有直接通路。也就是说在 Cache不命中时主存能和CPU直接通信,同时将数据调入 Cache;而虚拟存储器系统不命中时,只能先由硬盘调入主存,而不能直接和CPU通信。

四、指令系统

指令格式

如何用二进制码表示指令

指令(机器指令)是指示计算机执行某种操作的命令。一条指令就是机器语言的一个语句,是一组有意义的二进制代码。

指令系统:一台计算机的所有指令的集合,也称指令集。指令系统是计算机的主要属性,位于硬件和软件的中间。

格式: 操作码字段 + 地址码字段

  • 操作码:

    指出指令中该指令应该执行什么性质的操作以及具有何种功能。

    操作码是识别指令、了解指令功能 以及 区分操作数地址内容的组成和使用方法等的关键信息。例如,指出是算术加运算还是算术减运算,是程序转移还是返回操作。

  • 地址码:

    给出被操作的信息(指令或数据)的地址,包括参加运算的一个或多个操作数所在的地址、运算结果的保存地址、程序的转移地址、被调用的子程序的入口地址等。

指令长度:指一条指令中所包含的二进制代码的位数。

  • 定长操作码指令格式

    在指令字的最高位 分配固定的若干位(定长)表示操作码。

    定长操作码有利于简化计算机硬件设计,提高指令译码和识别速度。

  • 拓展操作码指令格式

    为了在指令字长有限的前提下仍保持比较丰富的指令种类,可采取可变长度操作码,即操作码字段的位数不固定,且分散地放在指令字的不同位置。

    最常见的变长操作码方法是 拓展操作码,它使操作码的长度随地址码的减少而增加。

    会增加指令译码和分析的难度,使控制器的设计复杂化。

根据指令中的 地址码的数目不同,可以将指令分为以下几种格式:

  • 零地址指令: OP

    只给出操作码OP,没有显式地址。这种指令只有两种可能:

    • 不需要操作数的指令,如空操作指令、停机指令、关中断指令等。
    • 零地址的运算类指令仅用在堆栈计算机中。通常参与运算的两个操作数隐含地从栈顶和次栈顶弹出,送到运算器进行运算,运算结果再隐含地压入堆栈。
  • 一地址指令: OP + A1

    • 只有目的操作数的单操作数指令,按A1地址读取操作数,进行OP操作后,结果存回原地址。

      指令含义:OP(A1)→A1
      如操作码含义是加1、减1、求反、求补等。

    • 隐含约定目的地址的双操作数指令,按指令地址A1可读取源操作数,指令可隐含约定另一个操作数由ACC(累加器)提供,运算结果也将存放在AC中。
      指令含义:(ACC)OP(A1)→ACC

    若指令字长为32位,操作码占8位,1个地址码字段占24位,则指令操作数的直接寻址范围为2^24^=16M。

  • 二地址指令: OP + A1 + A2

    指令含义:(A1)OP(A2)→A1

    对于常用的算术和逻辑运算指令,往往要求使用两个操作数,需分别给出目的操作数和源操作数的地址,其中目的操作数地址还用于保存本次的运算结果。

    若指令字长为32位,操作码占8位,两个地址码字段各占12位,则指令操作数的直接寻址范围为2^12^=4K

  • 三地址指令: OP + A1 + A2 + A3(结果)

    指令含义:(A1)OP(A2)→A3

    若指令字长为32位,操作码占8位,3个地址码字段各占8位,则指令操作数的直接寻址范围为28=256。

    若地址字段均为主存地址,则完成一条三地址需要4次访问存储器(取指令1次,取两个操作数2次,存放结果1次)

  • 四地址指令: OP + A1 + A2 + A3(结果) + A4(下址)

    指令含义:(A1)OP(A2)→A3,A4=下一条将要执行指令的地址。

    若指令字长为32位,操作码占8位,4个地址码字段各占6位,则指令操作数的直接寻址
    范围为2^6^=64


指令的功能分类:

  • 数据传送

    传送指令通常有 寄存器之间的传送(MOV)、从内存单元读取数据到CPU寄存器(LOAD)、从CPU寄存器写数据到内存单元 (STORE)等。

  • 算术和逻辑运算

    这类指令主要有加(ADD)、减(SUB)、比较(CMP)、乘(MUL)、除(DIV)、加1 (INC)、减1(DEC)、与(AND)、或(OR)、取反(NOT)、异或(XOR)等。

  • 移位操作

    移位指令主要有算法移位、逻辑移位、循环移位等。

  • 转移操作

    转移指令主要有无条件转移(JMP)、条件转移(BRANCH)、调用(CALL)、返回(RET)、陷阱(TRAP)等。无条件转移指令在任何情况下都执行转移操作,而条件转移指令仅在特定条件满足时才执行转移操作,转移条件一般是某个标志位的值,或两个或两个以上的标志位组合。

    调用指令和转移指令的区别:执行调用指令时必须保存下一条指令的地址(返回地址),当子程序执行结束时,根据返回地址返回到主程序继续执行;而转移指令则不返回执行。

  • 输入输出操作

    这类指令用于完成CPU与外部设备交换数据或传送控制命令及状态信息。

指令寻址方式

给出下一条指令的地址,给出要操作的对象的地址

寻址方式就是寻找 指令或操作数 有效地址的方式,寻址方式分为 指令寻址 和 数据寻址 两大类。

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

  • 指令寻址

    • 顺序寻址:

      通过程序计数器(PC) 加1(1个指令字长),自动形成下一条指令的地址。

    • 跳跃寻址:

      通过转移指令实现。跳跃是指下一条指令的地址码不是由程序计数器给出,而是由本指令给出下一条指令地址的计算方式。

  • 数据寻址

    在指令中表示 一个操作数的地址。由于数据寻址的方式较多,为加以区分,通常在指令字中设一个字段,用来表示属于哪种寻址方式,则指令格式变为:操作码 + 寻址特征 + 形式地址;


常见的数据寻址方式:

  • 隐含寻址

    不明显给出操作数的地址。如:单地址指令就 不指出第二操作数的地址,而规定累加器(ACC)作为第二操作数地址。

    优点:利于缩短指令字长;缺点:需增加存储操作数或隐含地址的硬件。

  • 立即数寻址

    地址字段 指出的不是操作数的地址,而是操作数本身,又称立即数。

    优点:指令在执行阶段不访问主存,指令执行时间最短;缺点:地址字段的位数限制了立即数的范围。

  • 直接寻址

    地址字段 就是操作数的真实地址。

    优点:简单,只访问依次主存;缺点:地址字段限制了寻址范围,且操作数的地址不易修改。

  • 间接寻址

    相对直接寻址,指令的地址字段 给出的形式地址是操作数的有效地址所在的存储单元的地址,即 操作数地址的地址。

    优点:扩大了寻址范围,便于编制程序(方便子程序返回);缺点:指令在执行阶段要多次访存。——由于访问速度过慢,所以问到扩大寻址范围时,通常指的是 寄存器间接寻址。

  • 寄存器寻址

    在指令中直接给出操作数所在的寄存器编号。即EA=Ri,操作数存放在Ri所指的寄存器中。

    优点:不用访存,执行速度快;缺点:寄存器数量少,数量有限。

  • 寄存器间接寻址

    寄存器间接寻址是指在寄存器 Ri 中给出的不是一个操作数,而是操作数所在主存单元的地址,即EA=(Ri)。

    比一般间接寻址快,但因为操作数在主存中,仍需访问一次主存。

  • 相对寻址

    把程序计数器(PC)的内容加上指令中的形式地址A而形成的操作数的有效地址,即EA = (PA) + A,其中A是相对与当前指令的位移量。

    优点:操作数的地址不是固定的,而是随PC值的变化而变化,且与指令地址总是相差一个固定值,便于程序浮动。

  • 基址寻址

    基址寻址是指将CPU中基址寄存器(BR) 的内容加上指令格式中的形式地址A而形成操作数的有效地址,即EA=(BR)+A。其中基址寄存器既可采用专用寄存器,又可采用通用寄存器。

    基址寄存器是面向操作系统的,其内容由操作系统或管理程序确定,主要解决程序逻辑空间 与 物理空间的无关性。

    优点:可扩大寻址范围(基址寄存器的位数大于形式地址A的位数),用户不必考虑自己的程序存于主存的哪个空间区域,所以也有利于多道程序设计,并可用于编制浮动程序,但偏移量(A)的位数较短。

  • 变址寻址

    变址寻址是指有效地址EA 等于指令字中的形式地址A与变址寄存器IX的内容之和,即 EA=(IX)+A,其中 IX为变址寄存器(专用),也可用通用寄存器作为变址寄存器。

    变址寄存器是面向用户的,在程序执行过程中,变址寄存器的内容可由用户改变(作为偏移量),形式地址A不变(作为基地址)。

    优点:可扩大寻址范围(变址寄存器的位数大于形式地址A的位数);在数组处理过程中,可设定A为数组的首地址,不断改变变址寄存器IX的内容,便可很容易形成数组中任一数据的地址,特别适合编制循环程序。偏移量(变址寄存器IX) 的位数足以表示整个存储空间。

  • 堆栈寻址

    堆栈是存储器(或专用寄存器组)中一块特定的、按后进先出(LIFO)原则管理的存储区,该存储区中读/写单元的地址是用一个特定的寄存器给出的,该寄存器称为堆機指针(SP)。

    堆栈可分为硬堆栈与软堆栈两种。

    硬堆栈:指寄存器堆栈,成本高,不适合做大容量的堆栈;

    软堆栈:从主存中划出一段区域 用来做堆栈,合算,也是最常用的。

CISC和RISC

两种设计方向

CISC——复杂指令系统计算机——增强原有指令的功能,设置更为复杂的新指令实现软件功能的硬化;如采用X86架构的计算机。

RISC——精简指令系统计算机——减少指令种类和简化指令功能,提供指令的指令速度;如ARM,MIPS架构的计算机。


CISC的主要特点如下:

  1. 指令系统复杂庞大,指令数目一般为200条以上。
  2. 指令的长度不固定,指令格式多,寻址方式多。
  3. 可以访存的指令不受限制。
  4. 各种指令使用频度相差很大。
  5. 各种指令执行时间相差很大,大多数指令需多个时钟周期才能完成。
  6. 控制器大多数采用微程序控制。有些指令非常复杂,以至于无法采用硬连线控制。
  7. 难以用优化编译生成高效的目标代码程序。

RISC的中心思想是要求指令系统简化,尽量使用寄存器-寄存器操作指令,指令格式力求一致。RISC的主要特点如下:

  1. 选取使用频率最高的一些简单指令,复杂指令的功能由简单指令的组合来实现。
  2. 指令长度固定,指令格式种类少,寻址方式种类少。
  3. 只有 Load/Store(取数存数)指令访存,其余指令的操作都在寄存器之间进行。
  4. CPU中通用寄存器的数量相当多。
  5. RISC一定采用指令流水线技术,大部分指令在一个时钟周期内完成。
  6. 以硬布线控制为主,不用或少用微程序控制
  7. 特别重视编译优化工作,以减少程序执行时间

值得注意的是,从指令系统兼容性看,CISC大多能实现软件兼容,即高档机包含了低档机的全部指令,并可加以扩充。但RISC简化了指令系统,指令条数少,格式也不同于老机器,因此大多数RISC机不能与老机器兼容。

虽然RISC具有更强的实用性,看起来应该是未来处理器的发展方向。但事实上,早期很多软件都是根据CISC设计的,单纯的RISC将无法兼容。此外,现代CISC结构的CPU已经融合了很多RISC的成分,其性能差距已经越来越小。CISC可以提供更多的功能,这是程序设计所需要的。

五、中央处理器

CPU的功能和结构

中央处理器(CPU)由运算器和控制器组成。

  • 控制器:负责协调并控制计算机各部件执行程序的指令序列,包括取指令、分析指令和执行指令;
  • 运算器:对数据进行加工。

CPU功能:

  • 指令控制。完成取指令、分析指令和执行指令的操作,即程序的顺序控制
  • 操作控制。一条指令的功能往往由若干操作信号的组合来实现。CPU管理并产生由内存取出的每条指令的操作信号,把各种操作信号送往相应的部件,从而控制这些部件按指令的要求进行动作。
  • 时间控制。对各种操作加以时间上的控制。时间控制要为每条指令按时间顺序提供应有的控制信号。
  • 数据加工。对数据进行算术和逻辑运算。
  • 中断处理。对计算机运行过程中出现的异常情况和特殊请求进行处理。

运算器组成:

  1. **算术逻辑单元(ALU)**。主要功能是进行算术/逻辑运算;

  2. 暂存寄存器。用于暂存从主存读来的数据,该数据不能存放在通用寄存器中,否则会破坏其原有内容。暂存寄存器对应用程序员是透明的。

  3. **累加寄存器(ACC)**。它是一个通用寄存器,用于暂时存放ALU运算的结果信息,可以作为加法运算的一个输入端。

  4. 通用寄存器组。如AX、BX、CX、DX、SP等,用于存放操作数(包括源操作数、目的操作数及中间结果)和各种地址信息等。SP是堆栈指针,用于指示栈顶的地址。

  5. **程序状态字寄存器(PAW)**。保留由算术逻辑运算指令或测试指令的结果而建立的各种状态信息,如溢出标志(OF)、符号标志(SF)、零标志(ZF)、进位标志(CF)等。PSW中的这些位参与并决定微操作的形成。

  6. 移位器。对操作数或运算结果进行移位运算。

  7. **计数器(CT)**。控制乘除运算的操作步数。

控制器组成:

  1. **程序计数器(PC)**。用于指出下一条指令在主存中的存放地址。CPU根据PC的内容去主存中取指令。因程序中指令通常是顺序执行的,所以PC有自增功能。
  2. **指令寄存器(IR)**。用于保存当前正在执行的那条指令。
  3. 指令译码器。仅对操作码字段进行译码,向控制器提供特定的操作信号。
  4. **存储器地址寄存器(MAR)**。用于存放要访问的主存单元的地址。
  5. **存储器数据寄存器(MDR)**。用于存放向主存写入的信息或从主存读出的信息。
  6. 时序系统。用于产生各种时序信号,它们都由统一时钟 ( CLOCK ) 分频得到。
  7. 微操作信号发生器。根据R的内容(指令)、PSW的内容(状态信息)及时序信号,产生控制整个计算机系统所需的各种控制信号,其结构有组合逻辑型和存储逻辑型两种。

image-20220125162850050

指令执行过程

指令周期、数据流、指令执行方案

指令周期:CPU从主存中取出并执行一条指令的时间。(不同指令的指令周期可能不同)

指令周期 常用若干机器周期来表示,一个机器周期又包含若干时钟周期。

完整的指令周期组成:取指周期 + 间址周期 + 执行周期 + 中断周期

这4个工作周期都有CPU访存操作,只是访存的目的不同。

取指周期是为了取指令,间址周期是为了取有效地址,执行周期是为了取操作数,中断周期是为了保存程序断点。

为了区别不同的工作周期,在CPU内设置了4个标志触发器:FE, IND, EX, INT,分别对应取指,间址,执行,中断周期,并以“1”状态表示有效。


数据流

数据流是根据指令要求依次访问的数据序列。

取指周期的数据流:

image-20220111202414358

间址周期的数据流:

image-20220111202549519

执行周期的任务是具体的,没有统一的数据流向。

中断周期的数据流:

image-20220111202701385


指令执行方案

一个指令周期通常要包括几个时间段(执行步骤),每个步骤完成指令的一部分功能,几个依次执行的步骤完成这条指令的全部功能。

出于性能和硬件成本等考虑,可以选用3种不同的方案来安排指令的执行步骤。

  • 单指令周期
    对所有指令都选用相同的执行时间来完成,称为单指令周期方案。

    此时每条指令都在固定的时钟周期内完成,指令之间串行执行,即下一条指令只能在前一条指令执行结束后才能启动。因此,指令周期取决于执行时间最长的指令的执行时间。对于那些本来可以在更短时间内
    完成的指令,要使用这个较长的周期来完成,会降低整个系统的运行速度。

  • 多指令周期
    对不同类型的指令选用不同的执行步骤来完成,称为多指令周期方案。

    指令之间串行执行,即下一条指令只能在前一条指令执行结束后才能启动。但可选用不同个数的时钟周期来L完成不同指令的执行过程,指令需要几个周期就为其分配几个周期,而不再要求所有指令占用相同的执行时间。

  • 流水线方案
    指令之间可以并行执行的方案,称为流水线方案,其追求的目标是力争在每个时钟脉冲周期完成一条指令的执行过程(只在理想情况下才能达到该效果)。

    这种方案通过在每个时钟周期启动一条指令,尽量让多条指令同时运行,但各自处在不同的执行步骤中。

数据通路

设置部件间的连接路径,描述指令执行过程中信号和数据在这些路径上的传输

数据通路:指在功能部件之间传送的路径。这些部件称为数据通路部件,如ALU,通用寄存器,状态寄存器,异常和中断处理逻辑等。其中专门进行数据运算的部件称为 执行部件/ 功能部件。

数据通路描述了信息从什么地方开始,中间经过哪个寄存器或多路开关,最后传送到哪个寄存器,这些都需要加以控制。

数据通路的基本结构:

  • CPU内部单总线方式

  • CPU内部多总线方式

    将所有寄存器的输入端和输出端都连接到多条公共通路上。相比之下,单总线中一个时钟内只允许传一个数据,指令执行效率很低,因此采用多总线方式,同时在多个总线上传送不同的数据,提高效率。

  • 专用数据通路方式

    根据指令执行过程中的数据和地址的流动方向安排连接线路,避免使用共享的总线,性能较高,但硬件量大。

注意:

内部总线是指同一部件之间的总线,如CPU内部连接各寄存器及运算部件之间的总线;

系统总线是指同一台计算机系统的各部件之间互相连接的总线,如CPU、内存、通道和各类IO接口之间相互连接的总线。

控制器

控制器怎么指挥整个系统的工作?

控制器是计算机系统的指挥中心,主要功能有:

  1. 从主存中取出一条指令,并指出下一条指令在主存中的位置。
  2. 对指令进行译码或测试,产生相应的操作控制信号,以便启动规定的动作。
  3. 指挥并控制CPU、主存、输入和输出设备之间的数据流动方向。

根据控制器产生微操作控制信号的方式的不同,控制器可分为硬布线控制器和微程序控制器,两类控制器中的PC和IR是相同的,但确定和表示指令执行步骤的办法以及给出控制各部件运行所需要的控制信号的方案是不同的。


硬布线控制器

硬布线控制器的基本原理是根据指令的要求、当前的时序及外部和内部的状态,按时间的顺序发送一系列微操作控制信号。

它由复杂的组合逻辑门电路和一些触发器构成,因此又称组合逻辑控制器。(主要涉及电路设计)


微程序控制器

将每条机器指令编写成一个微程序,这些微程序存到一个控制存储器中,可以通过寻址找到每个微程序中的微指令。目前,大多数计算机都采用微程序设计技术。

每个微程序包含若干微指令,每条微指令对应一个或几个微操作命令。

基本术语:

  • 微命令、微操作:

    一条机器指令可以分解成一个微操作序列;微操作是计算机最基本的、不可再分的操作。

    将控制部件向执行部件发出的各种控制命令称为微命令,它是构成控制序列的最小单位。例如:打开或关闭某个控制门的电位信号。

    微命令和微操作是一一对应的。微命令是微操作的控制信号,微操作是微命令的执行过程。

  • 微指令、微周期:

    微指令是若干微命令的集合。存放微指令的控制存储器的单元地址称为微地址。

    一条微指令至少包含两部分:

    • 操作控制字段(微操作码字段),用于生产某一步操作所需的各种操作控制信号。
    • 顺序控制字段(微地址码字段),用于控制产生下一条要执行的微指令地址。

    微周期是指 从控制存储器中读取一条微指令并执行相应的微操作所需的时间。

  • 主存储器、控制存储器:

    主存储器用于存放程序和数据,在CPU外部,用RAM实现;

    控制存储器(CM)用于存放微程序,在CPU内部,用 只读存储器ROM 实现。

  • 程序与微程序:

    程序是指令的有序集合,用于完成特定的功能;

    微程序是微指令的有序集合,用于描述机器指令,一条指令的功能由一段微程序来思想。

    微程序实际上是机器指令的实时解释器,一般是事先编制好并存放在控制存储器中,对外一般透明

组成:

  • **控制存储器(CM)**:核心部件,用于存放各指令对应的微程序;
  • 微指令寄存器:存放从CM中取出的微指令,它的位数同微指令字长相等。
  • 微地址形成部件:用于产生初始微地址和后继微地址,保证微指令的连续执行;
  • 微地址寄存器:接收微地址形成部件送来的微地址

image-20220220104112886

工作过程:

实际上就是在微程序控制器的控制下计算机执行机器指令的过程,这个过程可以描述如下:

① 执行取微指令公共操作。具体的执行是:在机器开始运行时,自动将取指微程序的入口地址送入CMAR,并从CM中读出相应的微指令送入CMDR。取指微程序的入口地址般为CM的0号单元,当取指微程序执行完后,从主存中取出的机器指令就已存入指令寄存器中。

② 由机器指令的操作码字段通过微地址形成部件产生该机器指令所对应的微程序的入口地址,并送入CMAR.

③ 从CM中逐条取出对应的微指令并执行。

④ 执行完对应于一条机器指令的一个微程序后,又回到取指微程序的入口地址,继续第①步,以完成取下一条机器指令的公共操作


注意区分一些寄存器的不同:

  • 地址寄存器(MAR):用于存放主存的读/写地址;
  • 微地址寄存器(CMAR):用于存放控制存储器的读/写微指令的地址;
  • 指令寄存器(IR):用于存放从主存中读出的指令;
  • 微指令寄存器(CMDR):用于存放从控制存储器中读出的微指令。

微指令的格式

水平型微指令:一次能定义并执行多个并行操作

image-20220220104430559

垂直型微指令:类似机器指令操作码的方式,由微操作码字段规定微指令的功能。

image-20220220104442016


微指令的编码方式

  • 直接编码方式

    n个微命令需要微指令的操作字段有n位,虽然简单,速度快,但对控制存储器容量要求极大。

  • 字段直接编码方式

    将微指令的微命令字段分成若干字段; 把互斥性微命令组合在同一字段中,把相容性微命令组合在不同字段中; 每个字段独立编码,每种编码代表一个微命令且各字段编码含义单独定义,与其他字段无关,这就是字段直接编码方式。

    优点:可以缩短微指令字长。

    缺点:需经过译码再发出微命令,因此比直接编码方式慢。


微指令的地址形成方式

  1. 由微指令的 下地址字段 指出(称为断定方式);
  2. 根据机器指令的 操作码 形成:当机器指令取至指令寄存器后,微指令的地址由操作码经微地址形成部件形成。

image-20220220105619061

指令流水线

一条指令的执行过程:取指,分析,执行

取指:根据 PC内容访问主存储器,取出一条指令送到 IR 中。
分析:对指令操作码进行译码,按照给定的寻址方式和地址字段中的内容形成操作数的有效地址EA,并从有效地址EA中取出操作数。
执行:根据操作码字段,完成指令规定的功能,即把运算结果写到通用寄存器或主存中

指令流水线:充分利用各功能部件。

image-20220220113352077

image-20220220113548916


性能指标:吞吐率TP,加速比S,效率E

影响因素:结构相关(资源冲突),数据相关(数据冲突),控制相关(控制冲突)

分类:

多发技术:

六、总线

概述

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

共享:是指总线上可以挂接多个部件,各个部件之间互相交换的信息都可以通过这组线路共享。
分时:是指同一时刻只允许有一个部件向总线发送信息,如果系统中有多个部件,则它们只能分时地向总线发送信息。

为什么使用总线?

早期计算机外部设备少时大多采用分散连接方式,不易实现随时增减外部设备。
为了更好地解决/Oo设备和主机之间连接的灵活性问题,计算机的结构从分散连接发展为总线连接。

总线的特性:

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

总线的分类:

按数据传输格式:串行总线,并行总线;

image-20220220155959250

按总线功能(连接的部件):

  • 片内总线:是芯片内部的总线。它是CPU芯片内部寄存器与寄存器之间、寄存器与AU之间的公共连接线。

  • 系统总线:是各功能部件(CPU,主存,I/O接口)之间 相互连接的总线。可分为3类:数据总线,地址总线,控制总线;

    image-20220220152454394

  • 通信总线:是计算机系统之间 或 计算机与其他系统之间信息传送的总线。也称外部总线。

按时序控制方式:同步总线,异步总线;


总线的结构:

  • 单总线结构:

    CPU、主存、IO设备(通过IO接口) 都连接在一组总线上,允许IO设备之间、I/O设备和CPU之间或IO设备与主存之间直接交换信。
    优点:结构简单,成本低,易于接入新的设备。
    缺点:带宽低、负载重,多个部件只能争用唯一的总线,且不支持并发传送操作

    image-20220220152807606

  • 双总线结构:

    有两条总线,一条是主存总线,用于CPU、主存和通道之间进行数据传送;另一条是 I/O总线,用于多个外部设备与通道之间进行数据传送。
    优点:将较低速的 I/O设备从单总线上分离出来,实现存储器总线和 I/O总线分离。
    缺点:需要增加通道等硬件设备。

    image-20220220153153326

  • 三总线结构:

    在计算机系统各部件之间采用3条各自独立的总线来构成信息通路,这3条总线分别为主存总线、I/O总线和直接内存访问DMA总线。
    优点:提高了 I/O设备的性能,使其更快地响应命令,提高系统吞吐量。
    缺点:系统工作效率较低。

    image-20220220153412326


总线的性能指标:

  • 总线的 传输周期(总线周期):一次总线操作所需的时间(包括 申请,寻址,传输,结束),通常由若干个总线时钟周期构成。

    image-20220220154622584

  • 总线的 时钟周期:即机器的时钟周期;

  • 总线的 工作频率:为总线周期的倒数;

  • 总线的 时钟频率:为时钟周期的倒数;

  • 总线宽度:

    又称为总线位宽,它是总线上同时能够传输的数据位数,通常是指数据总线的根数,如32根称为32位(bit)总线。

  • 总线带宽:

    可理解为总线的数据传输率,即单位时间内总线上可传输数据的位数,通常用每秒钟传送信息的字节数来衡量,单位可用字节/秒(B/s)表示。

    image-20220220155133573

    例题:

    image-20220220155730564

  • 总线复用:一种信号线在不同时间 可以传输不同的信息。

  • 信号线数:地址总线,数据总线,控制总线这3种总线数的总和称为信号线数。

仲裁

解决多个设备争用总线的问题

同一时刻只能有一个设备控制总线传输操作,另外可以有一个或多个设备从总线接收数据。

将总线上所连接的各类设备按其对总线有无控制功能分为:
主设备:获得总线控制权的设备。
从设备:被主设备访问的设备,只能响应从主设备发来的各种总线命令。

  • 为什么要仲裁?

    总线作为一种共享设备,不可避免地会出现同一时刻有多个主设备竞争总线控制权的问题。

  • 总线仲裁的定义:

    多个主设备同时竞争主线控制权时,以某种方式选择一个主设各优先获得总线控制权称为总线仲裁。

  • 总线仲裁分类

    • 集中仲裁方式:

      链式査询方式、计数器定时查询方式、独立请求方式

    • 分布仲裁方式:

请求总线的工作流程:

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

image-20220220161957124

链式查询:image-20220220162329585

计数器定时查询:image-20220220162516927

独立请求:image-20220220162603652

操作和定时

占用总线的一对设备如何进行数据传输

总线传输的四个阶段:

  1. 申请分配:

    由需要使用总线的主模块(或主设备)提出申请,经总线仲裁机构決定将下一传输周期的总线使用权授予某一申请者。也可将此阶段细分为 传输请求 和 总线仲裁 两个阶段。

  2. 寻址:获得使用权的主模块通过总线发出本次要访问的从模块的地址及有关命令,启动参与本次传输的从模块。

  3. 传输:主模块和从模块进行数据交换,可单向或双向进行数据传送。

  4. 结束阶段:主模块的有关信息均从系统总线上撤除,让出总线使用权。

总线定时:实质是一种协议或规则,用于在总线上 交换数据的双方 在时间上的配合。

  • 同步通信(同步定时方式):由 统一时钟 控制数据传送;

    优点:传送速度快,具有较高的传输速率;总线控制逻辑简单。
    缺点:主从设备属于强制性同步;不能及时进行数据通信的有效性检验,可靠性较差。

    同步通信适用于总线长度较短及总线所接部件的存取时间比较接近的系统。

  • 异通信(异步定时方式):采用应答方式,没有公共时钟标准;

    优点:总线周期长度可变,能保证两个工作速度相差很大的部件或设备之间可靠地进行信息交换,自动适应时间的配合。

    缺点:比同步控制方式稍复杂一些,速度比同步定时方式慢。

    image-20220220164600629

  • 半同步通信:同步、异步结合;

    在统一时钟的基础上,增加一个“等待”响应信号。

  • 分离式通信:充分利用总线的空闲阶段。

    上述三种通信,在主模块发地址、命令,从模块发数据时会使用总线,当在从模块准备数据时,没有使用总线,但主模块仍会占用总线。

    所以分离式通信 将总线传输周期分为两个子周期:

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

    特点:

    各模块均有权申请占用总线
    采用同步方式通信,不等对方回答
    各模块准备数据时,不占用总线
    总线利用率提高

标准

易于实现系统的模块化设计

七、输入输出系统

I/O接口

I/O方式

程序查询方式,程序中断方式,DMA方式

  • 程序査询方式:

    由CPU通过程序不断查询I/O设备是否已做好准备,从而控制I/O设备与主机交换信息。

  • 程序中断方式:

    只在 I/O设备准备就绪并向CPU发出中断请求时才予以响应。

  • DMA方式:

    主存和 I/O设备之间有一条直接数据通路,当主存和 I/O设备交换信息时无须调用中断服务程序。

  • 通道方式:

    在系统中设有通道控制部件,每个通道都挂接若干外设,主机在执行 I/O命令时,只需启动有关通道,通道将执行通道程序,从而完成 I/O操作。

程序查询方式和程序中断方式 用于 数据传输效率较低的外部设备,DMA方式和通道方式用于数据传输效率较高的设备。