0%

计算机组成原理从入门到放弃

计算机组成原理

1. Basic

1.1. 基本组成

五大部分

  • 运算器 (CPU) (主机): 算术运算、逻辑运算
  • 控制器 (CPU) (主机): 指挥各部件, 使程序运行
  • 存储器 : 存放数据和程序
    • 主存 (主机)
    • 辅存 (I/O设备)
  • 输入设备 (I/O设备)
  • 输出设备 (I/O设备)

1.2. 各硬件部分

寄存, 就是暂存数据的意思, 类似快递点

主存储器

存储体存数据, MAR对应数据位置(主存地址), MDR暂存对应的实际数据

类似快递点: 存储体=> 货架, MAR => 店员, MDR => 取货/放货 的柜台

取数据过程: CPU把地址给到MAR, 把读指令给到主存储器, 主存储器把存储体MAR地址的数据放到MDR等待使用

存数据过程: CPU把地址给到MAR, 把数据放到MDR, 把写指令给到主存储器, 主存储器根据指令把MDR中数据存储到存储体的MAR地址

  • 存储体: 数据在存储体中按地址存储, 每个地址对应一个存储单元
    • 存储单元: 每个存储单元存放一串二进制代码
      • 存储元: 即存储二进制的电子元件, 每个存储元可存1bit
    • 存储字: 存储单元中二进制的组合
    • 存储字长: 存储单元中二进制代码的位数
  • MAR: 存储地址寄存器, 用于指明要读/写哪个存储单元, 其位数反映存储单元数量 Memory Address Register
  • MDR: 存储数据寄存器, 用于暂存要读/写的数据, 其位数=存储字长 Memory Data Register

运算器: 用于实现算术运算(+ - * /)、逻辑运算(与/非)

前三个存数据, ALU执行(运算)

  • ACC: 累加计数器, 存放操作数、运算的结果 Accumulator
  • MQ: 乘商寄存器, 进行乘、除法时用 Multiple-Quotient Register
  • X: 通用寄存器, 存放操作数
  • ALU: 算数逻辑单元, 用电路实现各种算数运算、逻辑运算 Arthmetic and Logic Unit

控制器

PC + IR 取指令, CU执行

  • PC: 程序计数器, 存放下一条指令的地址 Program Counter
  • IR: 指令寄存器, 存放当前执行的指令 Instruction Register
  • CU: 控制单元, 分析指令, 给出控制信息 Control Unit

工作过程

  • 初始: 指令、数据存入主存, PC指向第一条指令
  • 从主存中取指令放入IR、PC自动加1, CU分析指令, CU指挥其他部件执行指令

1.3. 计算机系统层次结构

微程序机器M0 传统机器M1 虚拟机器M2 虚拟机器M3 虚拟机器M4
微指令系统 用机器语言的机器 操作系统机器 汇编语言机器 高级语言机器
硬件 硬件 软件 软件 软件
由硬件直接执行微指令 执行二进制机器指令 向上提供”广义指令”(系统调用) 用汇编程序翻译成机器语言程序 用编译程序翻译成汇编语言程序
微指令1 / 2 / 3 000010000000101 LOAD 5 y=a*b + c

三种级别的语言

  • 机器语言: 二进制代码
  • 汇编语言: 助记符
    • 将汇编语言翻译成机器语言
  • 高级语言: C, Python
    • 编译程序(编译器): 将高级语言一次全部翻译为汇编语言, 或直接翻译为机器语言
    • 解释程序(解释器): 将高级语言翻译为机器语言, 翻译一句执行一句

1.4. 存储器的性能指标

  • CPU主频: CPU内数字脉冲信号振荡的频率 (Hz)
  • CPU时钟周期 = 1 / CPU主频 (秒)
  • CPI(Clock cycle Per Instruction): 执行一条指令所需的时钟周期数

不同的指令, CPI不同, 甚至相同的指令, CPI也可能变化

  • 执行一条指令的耗时 = CPI * CPU时钟周期
  • IPS(Instructions Per Second): 每秒执行多少条指令 = 主频 / 平均CPI (KMGT Kilo=10 ** 3 Million=10 ** 6)
  • FLOPS(Floating-point Operations Per Second): 每秒执行多少次浮点运算 (KMGT Giga=10 ** 9 Tera=10 ** 12)

1.5. 系统整体的性能指标

描述存储容量, 文件大小时: K = 2^10, M=2^20, G=2^30, T=2^40

描述频率, 速率时: K=10^3, M=10^6, G=10^9, T=10^12

  • 数据通路带宽: 数据总线一次所能并行传送信息的位数(各硬件部件通过数据总线传输数据)
  • 吞吐量: 指系统在单位时间内处理请求的数量
  • 响应时间: 指从用户向计算机发送一个请求, 到系统对该请求做出响应并获得它所需要的结果的时间
  • 基准程序: 用来测量计算机的一种实用程序(跑分软件)

2. 数据的表示和运算

2.1. 进位计数制

  • 位权: 由符号的位置反映权重

  • 基数: 每个数码位所用到的不同符号的个数, r进制的基数为r

  • 计算机使用二进制

    • 可使用两个稳定状态的物理器件表示
    • 0,1正好对应逻辑值 真、假。方便实现逻辑运算
    • 可很方便地使用逻辑门电路实现算术运算
  • 二进制 >> 八进制: 3位一组,每组转换成对应的八进制符号

  • 二进制 >> 十六进制: 3位一组

  • 十进制 >> r进制

    • 整数部分:除基取余法,先取得的“余”是整数的低位
    • 小数部分:乘基取整法,先取得的“整”是小数的高位
2^12^ 2^11^ 2^10^ 2^9^ 2^8^ 2^7^ 2^6^ 2^5^ 2^4^ 2^3^ 2^2^ 2^1^ 2^0^ 2^-1^ 2^-2^ 2^-3^
4096 2048 1024 512 256 128 64 32 16 8 4 2 1 0.5 0.25 0.125

参考上图可知有部分小数是无法用二进制精确表示的

  • 真值: 实际的带正负号的数值(人类习惯的样子)
  • 机器数:把正负号数字化的数(存到机器里的样子)

2.2. BCD码

二进制转十进制时按乘转换麻烦, 所以用BCD转换

BCD: Binary-Coded Decimal, 用二进制编码的十进制

  • 8421码

映射关系:

0 1 2 3 4 5 6 7 8 9
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001

例:

十进制: 5 + 8 13

十进制: 0101 + 1000 1101

8421码中 1010 ~ 1111 没有定义 需要 + 0110 做数据修正(强制向高位进1) 上例得 0001 0011 即 13

4个十进制位 –>> 16种不同的状态

BCD码只使用其中的10种 –>> 不同的映射方案

  • 余3码: 8421码 + (0011)2

映射关系:

0 1 2 3 4 5 6 7 8 9
0011 0100 0101 0110 0111 1000 1001 1010 1011 1100
  • 2421码: 改变权值的定义

XXXX -> 2421 并规定 04 开头是0 5? 开头是1

映射关系:

0 1 2 3 4 5 6 7 8 9
0000 0001 0010 0011 0100 1011 1100 1101 1110 1111

2.3. 字符与字符串

2.3.1. ASCII码

常用的数字、字母、符号(英文)共128个字符 –> 7个二进制编码 –> ASCII码

存入计算机通常在高位补个0, 凑足1B(字节) 即 8bit

可印刷字符: 32~126, 其余为控制、通信字符

规律:

​ 数字: 48(0011 0000) ~ 57(0011 1001) 后面一个比特位刚好是数字对应的8421码

​ 大写字母: 65(0100 0001) ~ 90(0101 1010) 前三个010 后面为1~26

​ 小写字母: 97(0110 0001) ~ 122(0111 1010) 前三个011 后面为1~26

1
2
ord('a') - ord('A') == 32
>> True

image-20220724170433901

2.3.2. 汉字的表示和编码

1980年 GB 2312-80: 汉字+各种符号共7445个

区位码: 94个区, 每区94个位置(即94行, 94列)

国标码: 为防止信息交换时与”控制/通信字符”冲突, 在区位码基础上加32(16进制: 20H)

国标码已可保证数据传输, 但无法和ASCII做区分

汉字内码: 保证高位为1, 与ASCII码做区分, 在国标码基础上加128 (1000, 0000) (16进制: 80H)

汉字内码可以保证数据在计算机内部的处理, 计算机发现高位为1时可判断出是汉字

例:

汉字(十进制) 区位码(十六进制) 国标码(十六进制) 汉字内码(十六进制)
啊(16 01) 10H 01H 30H 21H B0H A1H

输入:输入编码

拼音 a1 => 国标码 => 汉字内码

输出:汉字字形码

就是对应到一个字块的像素

2.3.3. 字符串

  • 从低地址到高地址逐个字符存储, 很多语言中, ‘\0’作为字符串结尾标识
  • 对于多字节的数据(如汉字), 可采取大/小端存储模式
  • 大/小端模式: 将数据的最高有效字节存放在低/高地址单元中

2.4. 奇偶校验

2.4.1. 原理

  • 码字: 由若干位代码组成的一个字

  • 将两个码字逐位进行对比, 具有不同的位的个数称为两个码字间的距离

  • 码距(d): 一种编码方案可能有若干个合法码字, 各合法码字间的最小距离我称为码距

  • 当d = 1时, 无检错能力

  • 当d = 2时, 有检错能力

  • 当d = 3 时, 可能有检错、纠错能力

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

奇/偶 校验位 信息位
1/0 n

偶校验硬件实现:

  • 计算校验位的值: 各信息进行异或运算, 得到的结果即为偶校验位

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

2.4.2. 海明码

由于奇偶校验的策略仅加了一个比特位, 只能携带2种状态, 能发现数位错误, 但无法确定是哪一位出错

海明码是在原数据中的一些固定位置,插入一个0(或1),以进行奇(或偶)校验位,虽然使原数据变长,但可使其拥有纠错能力。
能侦测并更正一个比特的错误;若有两个比特出错,则只能侦测,不能更正;若有三个或更多的比特出错,则不能侦测,更不能更正。

海明码设计思路: 将信息位分组进行偶校验 => 多个校验位 => 多个校验位标注出错位置

n个信息位 k个校验位 共 n+k 位 2^k种状态

公式: 2^k^ >= n + k + 1

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

求解步骤

信息位: 1010

  1. 确定海明码的位数:2^k^ >= n + k + 1

n = 4 一> k = 3

设信息位D4D3D2D1(1010),共4位,校验位P1P2P3, 共3位, 对应海明码为H7H6H5H4H3H2H1.

  1. 确定校验位的分布

校验位Pi 放在海明码位号为2^i-1^的位置上,其余信息位顺序放

H7 H6 H5 H4 H3 H2 H1
D4 D3 D2 P3 D1 P2 P1
1 0 1 0 0 1 0
  1. 求校验位的值

H3 : 3 转二进制 0 1 1

H5 : 5 —>>> 1 0 1

H6 : 6 —>>> 1 1 0

H7 : 7 —>>> 1 1 1

根据P下标对应二进制位的权重进行分组

​ P1 对应二进制权重1的位置为1的信息位 H3 H5 H7 再根据对应信息位的值求异或得 0

​ P2 对应二进制权重2的位置为1的信息位 H3 H6 H7 再根据对应信息位的值求异或得 1

​ P3 对应二进制权重4的位置为1的信息位 H5 H6 H7 再根据对应信息位的值求异或得 0

  1. 纠错

校验方程:校验位及其对应分组值求异或 为0即无错误

接收到:1010010 无错误

接收到:1010000 H2位错误

​ S1 => P1 H3 H5 H7 => H1 H3 H5 H7 => 0011 => 0

​ S2 => P2 H3 H6 H7 => H2 H3 H6 H7 => 0001 => 1

​ S3 => P3 H3 H5 H7 => H4 H3 H5 H7 => 0011 => 0

错误位即: 010 => H2

  1. 补充

海明码的检错、纠错能力:1位可纠错, 2位可检错

实际使用中会在头部再加一个全校验位H8(P),对整体进行偶校验

S3S2S1 = 000 且全体偶校验成功 -> 无错误

S3S2S1 != 000 且全体偶校验失败 -> 1位错误,纠正即可

S3S2S1 != 000 且全体偶校验成功 -> 2位错误,不可纠正,需重传

2.5. 循环冗余校验

Cyclic Redundancy Check, CRC

2.5.1. 原理

  1. 数据发送、接受方约定一个”除数“

  2. K个信息位 + R个校验位 作为”被除数“, 添加校验位后需要保证除法的余数为0

  3. 收到数据后,进行除法检查余数是否为0

  4. 若余数为非0说明出错,则进行纠错或重传

2.5.2. 构造方法

模二除:十进制除法基础上,每次上的值由被除数高为是否为1决定,1就上1,0就上0再加一位(模二除后余数位数应该正好比除数少1位)

模二减:对应位取异或

  1. 由生成多项式确定”除数”。若生成多项式中x的最高次为R,则”除数“有R+1位
  2. K个信息位 + R个0,作为”被除数“
  3. 被除数、除数 进行”模二除“,得R位余数
  4. K个信息位 + R位余数 = CRC码

2.5.3. 检错纠错

  1. 可检测出所有奇数个错误
  2. 可检测出所有双比特的错误
  3. 可检测出所有小于等于校验位长度的连续错误
  4. 若选择合适的生成多项式,且2^R^ >= K + R + 1,则可纠正单比特位错误

2.5.4. 例

设生成多项式为G(x) = x^3^ + x^2^ + 1, 信息码为101001,求对应的CRC码。

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

K=信息码的长度:6

R=生成多项式最高次幂:3

N(校验码位数) = K + R = 9

生成多项式G(x) = 1 * x^3^ + 1 * x^2^ + 0 * x^1^ + 1 * x^0^, 对应二进制码1101

  1. 移位

信息码左移R位,低位补0,对应二进制码 1101000

  1. 相除(模二除)

101001 000 模二除 1101 余数001,

得CRC码 101001 001

  1. 检错和纠错

发送: 101001001

接收: 101001001 用1101进行模二除 余数为000,代表没出错

接收: 101001011 用1101进行模二除 余数为010,代表出错

信息位+校验位 共9位,但校验位3位8保状态,无法表示全部所以才没纠错能力

K个信息位,R个校验位,若生成多项式选择得当,且2^R^ >= K + R _+ 1, 则CRC码可纠正1位错

CRC码实际常应用在计算机网络中,几千个bit的信息位 + 几个校验位, 仅用来检错,不用来纠错

2.6. 定点数

定点数: 小数点的位置固定 995.222 –常规计数

浮点数:小数点的位置不固定 9.95222 * 10^2^ –科学计数

二进制和十进制的一样也是分为定点和浮点

2.6.1. 无符号数

  • 概念:整个机器字长的全部二进制位均为数值位,没有符号位,相当于数的绝对值。

  • 表示范围:n位二进制数:0 ~ 2^n^ - 1

  • 通常只有无符号的整数,而没有无符号小数

2.6.2. 有符号数定点表示

数值部分也称尾数

用定点方式表示19.75时,需要把整数和小数部分分别单独保存

可用原码、反码、补码三种方式来表示定点整数和定点小数。还可以用移码表示定点整数

若真值为x,则用 [x]、 [x]、 [x]、 [x]、分别表示真值所对应的原码、反码、补码、移码

  • 定点整数
x0 x1 x2 xn
符号位 小数点位置(隐含)
  • 定点小数
x0 x1 x2 xn
符号位 小数点位置(隐含)

原码:用尾数表示真值的绝对值,符号位 0/1 对应 正/负

  • 整数表示范围(机器字长n+1):-(2^n^-1) <= x <= 2^n^-1
    • 真值0有+0和-0两种形式
    • 8位表示整数+19:0 0010011
  • 小数表示范围(机器字长n+1): -(1-2^-n^) <= x <= 1-2^-n^
    • 真值0有+0和-0两种形式
    • 8位表示小数-0.75: 1 110000

反码:若符号位为0,则反码与原码相同;若符号位为1,则数值位全部取反

  • 整数/小数 表示范围和原码相同

补码:正数的补码与原码相同;负数的补码=反码末位+1(要考虑进位)