计算机组成原理 1. Basic 1.1. 基本组成 五大部分
运算器 (CPU) (主机): 算术运算、逻辑运算
控制器 (CPU) (主机): 指挥各部件, 使程序运行
存储器 : 存放数据和程序
输入设备 (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. 进位计数制
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, 用二进制编码的十进制
映射关系:
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种 –>> 不同的映射方案
映射关系:
0
1
2
3
4
5
6
7
8
9
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
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
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 个个数为奇数
偶校验硬件实现:
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
确定海明码的位数:2^k^ >= n + k + 1
n = 4 一> k = 3
设信息位D4D3D2D1(1010),共4位,校验位P1P2P3, 共3位, 对应海明码为H7H6H5H4H3H2H1.
确定校验位的分布
校验位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
求校验位的值
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
纠错
校验方程:校验位及其对应分组值求异或 为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位可纠错, 2位可检错
实际使用中会在头部再加一个全校验位H8(P全),对整体进行偶校验
S3S2S1 = 000 且全体偶校验成功 -> 无错误
S3S2S1 != 000 且全体偶校验失败 -> 1位错误,纠正即可
S3S2S1 != 000 且全体偶校验成功 -> 2位错误,不可纠正,需重传
2.5. 循环冗余校验
Cyclic Redundancy Check, CRC
2.5.1. 原理
数据发送、接受方约定一个”除数“
K个信息位 + R个校验位 作为”被除数“, 添加校验位后需要保证除法的余数为0
收到数据后,进行除法检查余数是否为0
若余数为非0说明出错,则进行纠错或重传
2.5.2. 构造方法
模二除:十进制除法基础上,每次上的值由被除数高为是否为1决定,1就上1,0就上0再加一位(模二除后余数位数应该正好比除数少1位)
模二减:对应位取异或
由生成多项式确定”除数”。若生成多项式中x的最高次为R,则”除数“有R+1位
K个信息位 + R个0,作为”被除数“
被除数、除数 进行”模二除“,得R位余数
K个信息位 + R位余数 = CRC码
2.5.3. 检错纠错
可检测出所有奇数个错误
可检测出所有双比特的错误
可检测出所有小于等于校验位长度的连续错误
若选择合适的生成多项式,且2^R^ >= K + R + 1,则可纠正单比特位错误
2.5.4. 例 设生成多项式为G(x) = x^3^ + x^2^ + 1, 信息码为101001,求对应的CRC码。
确定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
移位
信息码左移R位,低位补0,对应二进制码 1101000
相除(模二除)
101001 000 模二除 1101 余数001,
得CRC码 101001 001
检错和纠错
发送: 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. 无符号数
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(要考虑进位)