八股文
计组
小数
定点
定点就是最高位是符号位,形如x.xxxxxx(x = 0 or 1),当以补码的形式存储时范围是[-1, 1)
例:
| 十进制数 | 二进制真值 | 原码(8位纯小数) | 补码(8位纯小数) | 说明 |
|---|---|---|---|---|
| +0.6875 | +0.1011 | 0.1011000 → 01011000 |
0.1011000 → 01011000 |
正数原码 = 补码 |
| -0.6875 | -0.1011 | 1.1011000 → 11011000 |
1.0101000 → 10101000 |
补码 = 数值部分取反加1 |
当然,我们也可以添加整数位,用.来分割整数位和小数位,现在二进制由符号位+整数位+小数位构成
| 十进制数 | 二进制真值 | 原码(8位定点) | 补码(8位定点) | 说明 |
|---|---|---|---|---|
| +3.625 | +11.101 | 0011.1010 | 0011.1010 | 正数原码 = 补码 |
| -3.625 | -11.101 | 1011.1010 | 1100.0110 | 负数补码 = 原码数值部分取反+1 |
注:表格中“.”仅为视觉分隔,实际存储为连续8位:如
00111010、10111010、11000110
变形补码
这里补充双符号位补码,用来防止溢出
我们用00和11表示正数和负数,01和10分别表示着正溢出和负溢出,我们可以通过第一位永远是其符号位来记忆。
规格化
下文中的M,S,E为mantissa,significand,coefficient的缩写。
规格化就是二进制的科学计数法表示,第一个数不能为0。现在二进制由阶码(E)+尾数(M)构成。阶码的符号位为阶符,尾数的符号位为数符。
由于规格化的限制,所以我们可知尾数用原码表示的时候$\frac{1}{2}\leq M\lt 1$用补码表示的时候规定 $\frac{1}{2} \leq M < 1$ 或 $-1 \leq M < -\frac{1}{2}$,补码的时候尾数只能是1.0XXX或者0.1XXX
例:
| 十进制数 | 二进制表示(非规格化) | 规格化形式(M × 2^E) | 尾数 M(二进制) | 阶码 E |
|---|---|---|---|---|
| 5.0 | 101.0 | 0.101 × 2³ | 0.101 | 3 |
| -3.5 | -11.1 | -0.111 × 2² | 0.111 | 2 |
| 0.75 | 0.11 | 0.11 × 2⁰ | 0.11 | 0 |
| 0.375 | 0.011 | 0.11 × 2⁻¹ | 0.11 | -1 |
| 10.0 | 1010.0 | 0.1010 × 2⁴ | 0.1010 | 4 |
| -0.625 | -0.101 | -0.101 × 2⁰ | 0.101 | 0 |
| 0.1875 | 0.0011 | 0.11 × 2⁻² | 0.11 | -2 |
IEEE754
这是一个标准,我们只学习单浮点数的情况。二进制现在同样由E+M构成,但是这里的E会加上偏移(2^n-1)。对于单浮点,一共有32位,S为一位E为8位M为23位,这里当$E >= 1000 0000$代表阶码为正,小于的时候是负的,它的正负由于加了偏移所以和补码是不一样的,相当于基于2^9的偏移。M则是在规格化的基础上,略去第一个1,相当于增加表示的尾数提高了精度,此处的M就是单纯的无符号数,其正负由其S符号位表示。
加减法
这里考虑补码的加减法,加法很简单,减法需要转换一下。
$[x-y]_补 = [x]_补 - [y]_补 = [x]_补 + [-y]_补 $
对于$[-y]_补$我们的求法是对$[y]_补$求补,但是是在符号位也需要变的情况下求补码。对 $Y_补$按位取反,末位加 1(包括符号位)
| 十进制数 | 原码 (8位) | 补码 (8位) | $[-x]_{补}$ |
|---|---|---|---|
| 7 | 0000 0111 | 0000 0111 | 1111 1001 |
| -7 | 1000 0111 | 1111 1001 | 0000 0111 |
乘法
原码阵列乘法器
符号位用小学二年级老师教的判断
乘积采用小学三年级的乘法竖式计算,但是我们要按照绝对值后的乘法来计算。
补码阵列乘法器
按照原码算还是太拟人了。显然机器完全不是人。
如果给你两个补码让你算乘法,我们可以先换成原码,再将运算结果变成补码,符号位单独去算,这个也是要知道的,但是机器显然不能这么算,这太慢了。
所以直接补码阵列运算器出现了。
直接补码阵列乘法器
相当于带着补码的符号位一起进行运算,在人肉运算时,我们将符号位的1写为(1),用来表示-1,在常规的运算完成后相加时,这里的(1)相当于减去1,如果不够减的话,那么就需要借位,当借位到最高位的时候并且还是0,没有可借的,那么就把这个(1)写下去到最终结果。
除法
除法作为人类我们可以按照十进制数的写法来计算,但是呢,比较大小对于机器并非是看出来的,而是需要进行比较运算的,所以对于机器还不如直接被除数减去除数来判断正负,所以这就引出了下面两种方法。
注:这里所以的计算都采用定点小数和双位补码来进行。
当被除数为负数时,变成绝对值进行处理
恢复余数法
这个只是用来帮助理解下一个方法的。
每一次我们将余数左移
加减交替法
先减,正的接着减,负的加回来
规格化浮点数加减法
-
判断是否有0
-
比较阶码,小阶码看齐大阶码(精度更高)
-
尾数求和(采用双符号位补码运算)
-
结果规格化
判断符号位:
- 若为00.1,11.0则证明无溢出,已经符合规格化
- 若为00.0,11.1,也无溢出,只需要左移至0.1,1.0的规格化形式即可(左规)
- 若为01,10则出现了溢出,这时候我们进入第五步进行舍入处理
-
舍入处理:在对阶和溢出摄入的时候均按照这个原则处理
- IEE754
- 就近舍入:类似与四舍五入,尾数后面被舍去的数字,若比10000….大,则最低位+1,反之舍去,若恰好为1000…000…,那么如果现在最低位是0就舍去,是1就+1
- 去尾/正无穷/负无穷
- 尾数补码规格化:均采用0舍1入的方法,类似于754标准的就近舍入,但是X > 10000的时候才最低为+1,<=的情况统一舍去
- IEE754
-
阶码的溢出:阶码若正溢出视作正或负无穷,负溢出视作0
cache
基本概念:
- cache:cache的数据块大小叫做行(所以行是大小),但是cache不仅是行,cache包含标记位和cache的数据块
- 主存:以块(B)为单位,主存的地址由不同的映射方式定义
- cache的行和主存的块是等长的
对于缓存一个主存的块,cache需要多存一个tag,主存->纯数据,cache-> 数据 + 元数据
全相联映射
相当于随机存储,只要cache没满就往里面存,但是需要并行比较导致电路复杂,一多了设计难度就炸了。
主存地址 = 块号(s) + 块内字节号(w位)
直接映射方式
相当于分组,给主存按照每r行分为一组,然后每组的第i块只能存在cache的第i行中。
主存地址 = 组号 (s-r)+ 组内号数(r) + 块内字节号(w)
此时第i行的cache存的就是每组主存第i块的内容,可以省略cache中对于行数的存储
组相联映射方式
是全相联和直接映射的折中。Cache被分成若干个组,每个组内包含多个块。
映射规则:主存中的一个块可以映射到指定组内的任意一个空闲块。
命名:cache每组行数v时,我们通常称这种方式为v路组相联映射,v通常为2、4、8、16。
对于主存每$2^v$分成一组,对于每个组中的第i块,可以存到cache中第i组的任意一行。
d = log2(cache组数)
主存地址=主存组号(s-d)+ 组内块号(d)+块内字节号(w)
举例
我们以一个地址线为16的64KB主存为例。其地址形如1001 0000 0000 0001,字长为1B,假设块大小为16B。(由此我们可以理解一点:cache中存的不是一个主存地址的内容,而是主存中相邻的几个内容组成的一个块。进一步,我们可以知道,在此例子下,一个块有16个,对应着4位二进制,所以主存的后四位对于命中cache的判断就没有用了,只是用来确定块内偏移的。)
-
全相联映射:这种情况,主存的前12位就是用来定位cache的tag,每次cpu访问的时候和tag进行比较。
-
直接映射:这种情况与cache的行数有关,假如cache一共有32行,那么主存就是每32块视作一组。每一组的第i块,对应着cache的第i行。
64KB / 16B = 4K,可以求出主存有4K块。4K / 32 = 128,可以求出每一行cache被128行主存抢着用(我们可以视作把主存划分成128坨,但不能叫组,为了和下一种方式区分开),log2(128) = 7。log2(32) = 5,定位cache的行需要5位。剩下的12 - 5 = 7 ,所以主存的地址就是7(tag) + 5(index) + 4(offset)。 -
组相联映射:依旧和cache有关,我们假设cache有32行,设每组有4行,一共有32 / 4 = 8组。log2(8) = 3,需要3位来定位是哪一组cache。剩下的 12 - 3 = 9 位作为tag,用于和这一组的4行并行比较,判断是否命中缓存。所以主存的地址就是
9(tag) + 3(set index) + 4(offset)
[!WARNING]
直接映射中删除线部分求出log2(128) = 7来表示tag当且仅当主存填满地址空间时结果与减出来的结果一致,所以用地址线数减去 index和 offset 更加稳妥。tag就是剩下多少位都用作tag,就算超了也是未命中,没有任何风险。
虚拟内存
仅学习页式存储管理
地址位数:存储容量 = 2地址位数,物理地址位数由主存容量定,虚地址位数由虚存容量定;单位换算:1KB=210B、1MB=220B、1GB=230B
页内偏移位数:由页面大小决定,即 log2(页面大小)
总页数 = 存储容量 ÷ 页面大小;页表长度 = 虚存总页数
逻辑地址位数 = 页号位数(log2(逻辑总页数)) + 页内偏移位数
主存物理空间 = 物理总页数 × 页面大小
虚地址转物理地址:拆分虚地址得虚页号(商)和偏移(余)→ 查页表找物理页号 → 物理地址 = 物理页号 × 页长 + 偏移;无映射则缺页中断
-
主存容量为 4MB,虚存容量为 1GB,则虚地址和物理地址各为多少位?如页面大小为 4KB,则 页表长度是多少? 30 22 1GB/4KB = 256K
-
某页式存储管理,页大小为 2KB。逻辑地址空间包含 16 页,物理地址空间共有 8 页。逻辑地址 应有多少位?主存物理空间有多大?
页面大小 2 KB=2^11 B,因此页内偏移量为 11 位。 逻辑地址空间含 16 页,16=2^4,因此页号为 4 位 逻辑地址位数 = 页号位数 + 页内偏移量位数 = 4+11=15 位。 物理空间 = 物理页数 × 页面大小 = 16KB
-
在一个分页虚存系统中,用户虚地址空间为 32 页,页长 1KB,主存物理空间为 16KB。已知用户程序有 10 页长,若虚页 0、 1、 2、 3 已经被分别调入主存 8、 7、 4、 10 页中,请问虚地址 0AC5 和 1AC5(十六进制)对应的物理地址是多少 页长 1 KB=2^10 B,因此页内偏移量为 10 位 虚地址空间 32 页,32=25,虚页号占 5 位二进制。 物理空间 16 KB=16 页,物理页号范围 0∼15 映射关系:虚页 0→物理页 8、虚页 1→物理页 7、虚页 2→物理页 4、虚页 3→物理页 10。 虚地址格式:虚页号(高位 5) + 页内偏移(低位 10)
0AC5H=00010,1011000101B,页面号为2,已被调入到主存页4,所以,物理地址中的页面号为4,页内地址与虚地址的页内地址相同,所以是:0100,1011000101=12C5H
1AC5H=00110,1011000101B,页面号为6,未被调入到主存页中,所以无物理地址,会发生缺页中断。
指令系统
指令格式
指令格式形如:
| 操作码字段 OP | 地址码字段A |
|---|
根据一条指令有几个操作数,分为零、一、二、三操作数地址。(如汇编中的 NOP、INC、ADD、和arm架构下的add x0, x1, x2)
零地址指令
| 操作码 OP |
|---|
一地址指令
| 操作码 OP | 地址码 A |
|---|
二地址指令
| 操作码 OP | 地址码 A₁ | 地址码 A₂ |
|---|
A1为兼作存放操作结果的地址
三地址指令
| 操作码 OP | 地址码 A₁ | 地址码 A₂ | 地址码 A₃ |
|---|
A1为被操作地址、A2为操作数地址、A3为存放操作结果的地址。
对于二地址指令可以进一步划分:令S代表存储器,R代表寄存器
- SS型
- RR型
- RS型
按照指令子长度划分,分为单字长、半字长、双字长指令
例题:
机器字长为 16 位,其中 OP 为操作码字段,Ms 和 Md 分别为寻址方式,Rs 和 Rd 为通用寄存器,Ms 和 Rs 组成了源操作数,Md 和 Rd 组成了目的操作数。指令格式:15 OP 10 Ms Rs Md Rd
(1)指令格式是何种指令格式?单字长二地址指令
(2)请解释说明:该指令可以指定多少种操作?6位OP,2⁶=64
(3)若源操作数和目的操作数各有 8 种寻址方式,则该系统可以具有多少个通用寄存器?2³ = 8,所以寻址方式占了3位,(16 - 6) / 2 - 3 = 2,剩下两位是用来存地址的,即为4个
寻址
| 方式 | 算法 | 主要优点 |
|---|---|---|
| 隐含寻址 | 操作数在专用寄存器 | 无存储器访问 |
| 立即寻址 | 操作数=A | 无存储器访问 |
| 直接寻址 | EA=A | 简单 |
| 间接寻址 | EA=(A) | 大的地址范围 |
| 寄存器寻址 | EA=R | 无存储器访问 |
| 寄存器间接寻址 | EA=(R) | 大的地址范围 |
| 偏移寻址 | EA=A+(R) | 灵活 |
| 段寻址 | EA=A+(R) | 灵活 |
| 堆栈寻址 | EA=栈顶 | 无需给出存储器地址 |
偏移寻址包含:相对寻址、基址寻址、变址寻址 也是最容易考的
指令
指令流程
**指令寄存器(**IR):保存当前正在执行的一条指令 Instruction Register **程序计数器(**PC):用于存放下一条指令所在的单元地址 Program Counter 数据地址寄存器(AR):保存当前CPU所访问的数据存储器(简称数存)单元的地址 Address Register 数据缓冲寄存器(DR):用来暂时存放ALU的运算结果或者内存的内容 Data Register 通用寄存器:当算术逻辑元(ALU)执行算术或逻辑运算时,为ALU提供一个工作区 通用的取指流程
然后是经典操作 读取:地址存到AR,输出存到DR,$R/\overline{W} = R$ 写入:地址存到AR,输入存到DR,$R/\overline{W} = W$
微指令格式
微指令的格式大体分成两类:水平型微指令和垂直型微指令
水平型微指令。 一次能定义并执行多个并行操作微命令的微指令, 叫做水平型微指令。 其一般格式如下
| 控制字段 | 判别测试字段 | 下地址字段 |
|---|
e.g.:
已知某机采用微程序控制方式,控存容量为 512× 48 位。微程序可在整个控存中实现转移,控制 微程序转移的条件共 4 个,微指令采用水平型格式,后继微指令地址采用断定方式。请问: (1)微指令的三个字段分别应为多少位?
控存地址位数 = 下地址字段 log2 512=9 位; 有 n 个转移条件,需要 n 位来分别表示 “是否按该条件转移”; 本题有 4 个转移条件,因此判别测试字段 = 4 位。 微操作控制字段位数 = 微指令字长 - 判别测试字段位数 - 下地址字段位数 = 32 - 4 - 9 = 35位
AI的一坨
好的,这是对您提供的四份计算机组成原理/体系结构简答题的完整解答。
第一份试卷(七、简答题 10分)
-
RISC 含义: RISC 是 精简指令集计算机 (Reduced Instruction Set Computer) 的缩写。其核心思想是通过简化指令系统,使每条指令执行周期短、硬件实现简单,从而提高处理器的执行效率和性能。
-
“存储总线”连接部件: 在双总线结构中,“存储总线”主要用于连接 CPU 和主存储器 (内存)。有时也用于连接高速缓存 (Cache),但其主要作用是实现 CPU 与主存之间的数据交换。
-
浮点数加减运算对阶原则: 对阶操作应采用 “小阶向大阶看齐”的原则。即,将阶码较小的那个数的小数点右移,使其阶码与较大的那个数相等。这样做可以保证数值精度损失最小(因为右移时丢失的是低位有效数字)。
-
“控制存储器”存放内容: “控制存储器”(Control Memory, CM)用来存放 微程序。微程序是由一系列微指令组成的,每条微指令对应一个或多个控制信号,用于控制数据通路中的各个部件完成一条机器指令的操作。
-
采用“虚拟存储器”的目的: 采用“虚拟存储器”的主要目的是 扩大程序可使用的地址空间,使其不受物理内存容量的限制。它通过将部分不常用的数据暂时存放到外存(如硬盘),在需要时再调入内存,从而让程序感觉拥有一个比实际物理内存大得多的连续地址空间,同时提高内存利用率和多道程序并发能力。
第二份试卷(七、简答题 12分)
-
内部总线连接部件: 内部总线(也称片内总线或芯片内总线)主要用来连接 CPU 芯片内部的各个功能部件,例如:寄存器堆、算术逻辑单元 (ALU)、控制器、指令译码器、地址生成器等。
-
计数器定时查询方式优先级设置: 若要使得每个设备使用总线的优先级相等,应该将 计数器的初始值每次都从0开始计数,并且每次查询结束后,计数器清零或重置为0。这样,所有设备都有均等的机会被轮询到,实现了公平的“轮询”机制。
-
先行进位加法器优点: 先行进位加法器(Carry Lookahead Adder, CLA)的优点是 大大缩短了进位传递的时间,提高了加法运算的速度。它通过并行计算每一位的进位产生(Generate)和进位传播(Propagate)信号,避免了串行进位加法器中进位逐位传递造成的延迟。
-
双译码方式优点: 在存储器芯片中,地址译码采用双译码方式(行译码 + 列译码)的优点是 显著减少了译码器的输出线数量,降低了芯片引脚数和内部布线复杂度,节省了芯片面积,提高了集成度。例如,对于 64K×1 位的芯片,单译码需 65536 条字线,而双译码只需 256 条行线 + 256 条列线 = 512 条线。
-
CPU区分指令和数据: CPU 区分指令和数据主要依靠 不同的时间周期和指令执行阶段:
- 取指周期:CPU 从存储器取出的内容被视为 指令。
- 执行周期:根据指令的操作码,CPU 可能会再次访问存储器,此时取出的内容被视为 数据。 此外,指令和数据在存储器中的位置、格式以及由控制单元根据指令流自动判断。
-
流水线资源相关冲突解决: 当流水线中出现资源相关(如两个指令同时争用同一个功能部件,如 ALU 或乘法器)时,通常采用以下方法解决:
- 插入气泡 (Bubble/Stall):暂停后续指令的执行,等待当前指令释放资源。
- 增加功能部件:复制有冲突的功能部件(如增加多个 ALU)。
- 资源重命名:在支持乱序执行的处理器中,通过寄存器重命名技术,将不同指令的操作数映射到不同的物理寄存器,减少资源竞争。
第三份试卷(六、简答题 12分)
-
求 [-y]补 的方法: 已知 [y]补,求 [-y]补 的方法是:对 [y]补 连同符号位一起按位取反,然后末位加1。 (公式:[-y]补 = ~[y]补 + 1)
-
解决 CPU 与主存速度差异的方法: 一种常用方法是 在 CPU 和主存之间设置高速缓冲存储器 (Cache)。Cache 存储最近频繁访问的数据和指令,利用程序访问的局部性原理,使 CPU 大部分时间能从高速的 Cache 中获取数据,从而缓解速度差异。
-
程序计数器 (PC) 内容修改情况: PC 的内容在以下情况下会被修改:
- 执行顺序指令后,PC 自动加1(或加指令长度)。
- 执行 转移指令(如 JMP、CALL、BRANCH)时,PC 被载入目标地址。
- 执行 中断或异常 时,PC 被保存,并载入中断服务程序的入口地址。
- 执行 子程序调用指令 (CALL) 时,PC 被压栈,然后载入子程序入口地址。
- 执行 返回指令 (RET) 时,PC 从栈中弹出。
-
流水线“数据相关”冲突解决: 解决数据相关(Data Hazard)冲突的主要方法有:
- 前递 (Forwarding/Bypassing):将前一条指令的运算结果直接从 ALU 输出端或寄存器文件写回端“转发”给后一条指令的输入端,避免等待写回。
- 插入气泡 (Stall):暂停流水线,插入空闲周期,直到数据准备好。
- 编译器调度:在编译时调整指令顺序,尽量避免数据相关。
- 乱序执行:允许后序指令在数据准备好时提前执行。
-
快速和慢速模块共用总线的定时方式: 应采用 同步定时方式。同步定时以统一的时钟信号作为基准,所有设备都按固定节拍工作。虽然慢速设备会降低整体效率,但为了确保系统稳定性和兼容性,必须选择最慢设备能跟上的时钟频率。异步定时虽然灵活,但在此场景下管理复杂,不如同步定时可靠。
-
总线仲裁目的: 总线仲裁是为了 解决多个主设备(如 CPU、DMA 控制器、I/O 处理器)同时请求使用总线时的冲突问题,决定哪个设备在当前时刻获得总线使用权,从而保证总线通信有序、高效地进行。
第四份试卷(无标题,共6题)
-
二进制全加器公式: 设 A、B 为两个输入位,C_in 为进位输入,则:
- 和输出 S = A ⊕ B ⊕ C_in
- 进位输出 C_out = (A ∧ B) ∨ ( (A ⊕ B) ∧ C_in )
-
DRAM 需要“刷新”的原因: DRAM 的存储单元是基于电容存储电荷的,而电容会随着时间推移自然漏电,导致存储的信息(0或1)丢失。因此,必须定期对 DRAM 进行“刷新”操作——即读取每一行的数据并重新写入,以恢复电容上的电荷,保持数据不丢失。
-
链式查询方式设备优先级确定: 在“链式查询”方式中,设备的优先级由它们在总线上的 物理连接位置决定。离总线仲裁器(或总线控制器)最近的设备具有最高优先级,越远的设备优先级越低。仲裁信号沿链依次传递,只有当高优先级设备未请求总线时,低优先级设备才有机会获得授权。
-
按仲裁电路位置分类的仲裁方式: 按照总线仲裁电路的位置不同,仲裁方式分为两类:
- 集中式仲裁:所有仲裁逻辑集中在单一的总线仲裁器(Bus Arbiter)中。
- 分布式仲裁:仲裁逻辑分散在各个主设备上,各设备通过某种协议(如自举、竞争)自行协商决定谁获得总线使用权。
-
RISC 最主要特点: RISC 最主要的特点是 指令集简单、规整,指令条数少,指令长度固定,寻址方式少,大部分指令在一个机器周期内完成。这使得硬件设计简化,易于采用流水线、超标量等高性能技术,从而获得更高的执行效率。
-
程序“时间局部性”含义: 程序的“时间局部性”(Temporal Locality)是指:如果一个信息项(如数据或指令)被访问过,那么在不久的将来它很可能再次被访问。这是缓存(Cache)和预取技术能够有效工作的理论基础之一。
以上答案力求简洁准确,符合“简答即可”的要求。希望对您的学习或备考有所帮助!
六、简答题(12分)
1.传统的CPU包括哪两部分? 运算器和控制器
2.用双符号位补码(变形补码)表示数据。当两个符号位为10时,此时该数的数值大小范围是多少? 负溢出 -2n+1~-2n-1 若非符号位有n个 10中, 1表示1×-2n+1 0表示0×-2n 剩下数据部分的范围为0~2n-1
3.采用行、列双译码结构进行地址译码,有什么优点?
减少线的数目
4.微程序控制器由哪三部分组成?
控制存储器 微指令寄存器 地址转移逻辑
5.总线带宽与总线位宽二者有什么关系?
带宽=位宽*工作频率
6.采用“链式查询方式”进行总线总裁时,设备的优先级如何确定?
越靠近中央仲裁器的优先级越高
简答
以下是将您提供的内容整理为 问答(QA)形式 的完整版,按章节组织,问题与答案一一对应,语言简洁准确,便于复习或教学使用:
第一章 计算机系统概论
Q1:冯·诺依曼结构计算机的主要特点是什么?
A:采用“存储程序”方式;指令与数据以二进制形式统一存储于同一存储器中;按顺序执行(取指→译码→执行);以 CPU 为核心,通过总线连接存储器和 I/O 设备。
Q2:冯·诺依曼结构的核心思想是什么?
A:将程序当作数据一样存入存储器,由硬件自动按顺序取出并执行,实现“程序控制”。
Q3:为什么说指令和数据在冯·诺依曼计算机中地位相同?
A:因为二者均以二进制形式存储在同一地址空间,通过同一总线传输,可被同等读写——程序本身也可作为数据被修改或生成(如自修改代码、编译器等)。
Q4:计算机系统为什么要采用分层结构?
A:为了降低系统复杂度,通过抽象隔离各层功能,使接口清晰、便于设计、移植、复用和维护。
Q5:简述计算机系统的层次结构及各层的作用。
A:典型层次从上到下为:
- 应用程序层:解决用户问题;
- 高级语言/库:提供编程抽象;
- 操作系统:管理资源、提供系统调用接口;
- 指令系统/汇编层:软硬件接口,定义机器指令;
- 微程序层:生成控制信号序列(部分 CPU 使用);
- 数字逻辑/电路层:物理硬件实现。
Q6:什么是软件和硬件的逻辑等价性?举例说明。
A:指同一功能既可用软件实现,也可用硬件实现。例如:浮点运算可用 FPU(硬件)或数学库(软件);AES 加密可用专用指令(如 AES-NI)或软件算法实现。
Q7:软件实现与硬件实现各有什么特点?
A:
- 软件:灵活、开发快、成本低,但速度慢、效率较低;
- 硬件:速度快、并行性强、能效高,但成本高、修改困难、灵活性差。
第二章 数的表示与运算
一、数的表示
Q1:原码、反码、补码、移码各自的表示方法是什么?
A:
- 原码:最高位为符号位(0正1负),其余为绝对值;
- 反码:正数同原码;负数符号位不变,数值位按位取反;
- 补码:正数同原码;负数 = 反码 + 1;
- 移码:真值 + 偏置常数(如 2^(n−1)),主要用于浮点阶码。
Q2:原码、反码、补码中 0 的表示有何不同?
A:原码和反码有 +0(00…0)和 −0(10…0 或 11…1)两种表示;补码中 0 唯一(全 0)。
Q3:n 位补码所能表示的数值范围是多少?为什么没有 −2ⁿ?
A:范围为 [−2^(n−1), 2^(n−1)−1]。−2ⁿ 需要 n+1 位才能表示(如 8 位无法表示 −256),故不在 n 位补码范围内。
Q4:什么是移码?移码的主要用途是什么?
A:移码 = 真值 + 偏置(通常为 2^(k−1))。主要用于浮点数的阶码表示,便于比较大小和硬件实现。
二、浮点数表示
Q5:浮点数由哪几部分组成?数符和阶符分别表示什么?
A:由数符 S(表示数值正负)、阶码 E(指数部分)、尾数 M(有效数字)组成。IEEE 754 中无显式“阶符”,阶码采用偏置表示,隐含符号信息。
Q6:为什么浮点数需要规格化表示?
A:避免同一数值有多种表示(如 0.1×2³ 与 0.01×2⁴),提高精度和有效位利用率。
Q7:什么是规格化浮点数?规格化的目的是什么?
A:规格化浮点数的尾数满足 1 ≤ |M| < 2(二进制下即形如 1.xxxxx…)。目的:唯一表示、最大化有效数字位数、提升计算精度。
Q8:IEEE 754 单精度浮点数的格式是怎样的?
A:共 32 位:1 位符号 S + 8 位阶码 E(偏置 127)+ 23 位尾数小数 f。值为 (−1)^S × 1.f × 2^(E−127)(正规数);E=0 或 255 用于表示非正规数、零、无穷大或 NaN。
Q9:IEEE 754 中为什么要隐藏尾数的最高位 1?
A:因规格化尾数必为 1.xxxx…,故可隐含最高位 1,节省 1 位存储空间,相当于获得 24 位精度。
Q10:IEEE 754 中阶码为什么要加偏置(127)?
A:将有符号阶码转为无符号整数,便于硬件直接比较大小、排序和进行加减运算。
三、算术运算与运算器
Q11:补码加法的运算规则是什么?
A:按模 2ⁿ 相加,丢弃最高位进位;溢出可通过符号位进位异或判断。
Q12:补码减法如何转换为加法实现?
A:A − B = A + (−B) = A + [B 的补码] = A + (~B + 1)。
Q13:什么是算术溢出?如何检测溢出(单符号位 / 双符号位)?
A:结果超出机器数表示范围即为溢出。
- 单符号位:若两同号数相加得异号结果,或符号位进位 ⊕ 最高数值位进位 = 1,则溢出;
- 双符号位(变形补码):若结果最高两位不一致(如 01 或 10),则溢出。
Q14:全加器的逻辑表达式是什么?其进位延迟如何产生?
A:Sum = A ⊕ B ⊕ Cin;Cout = AB + (A⊕B)Cin。进位需逐级传递,前一级 Cout 作为后一级 Cin,导致传播延迟。
Q15:行波进位加法器的工作原理及其缺点是什么?
A:多个全加器串联,低位进位依次传递至高位。缺点:进位链延迟随位数线性增长(O(n)),速度慢。
Q16:先行进位的基本思想是什么?为什么能提高速度?
A:预先计算每位的“进位生成”Gi = Ai·Bi 和“进位传递”Pi = Ai⊕Bi,通过并行逻辑直接计算各级进位,减少进位传播深度,显著加速。
Q17:原码阵列乘法器的基本工作原理是什么?
A:根据乘数每一位生成部分积(0 或被乘数),通过阵列加法器逐层累加,符号位单独处理。
Q18:什么是间接补码阵列乘法器?
A:先将补码操作数转换为绝对值(原码),进行原码乘法,再根据符号和补码规则修正最终结果。
Q19:直接补码阵列乘法器与间接补码阵列乘法器的区别?
A:
- 直接:在阵列内部处理符号和补码补偿(如末尾加一行),速度快但结构复杂;
- 间接:先取绝对值做原码乘,再外部修正,结构简单但需额外步骤。
Q20:原码除法的“恢复余数法”和“加减交替法”有何区别?
A:
- 恢复余数法:试减后若余数为负,需加回除数“恢复”,再记商 0;
- 加减交替法(非恢复):余数为负时不恢复,下步改做加法,末尾一次性修正,效率更高。
Q21:阵列除法器的基本思想是什么?
A:将除法的逐次加/减与移位操作固化为硬连线阵列结构,实现并行或流水化除法。
Q22:ALU 的功能由什么决定?如何根据功能表使用 ALU?
A:由控制信号(功能码)决定。根据功能表设置选择信号(如 S3~S0),即可输出对应运算结果(如加、减、与、或等)。
Q23:浮点加减运算的主要步骤有哪些?
A:① 对阶(小阶向大阶对齐,尾数右移);② 尾数加减;③ 规格化;④ 舍入处理;⑤ 溢出/下溢检查。
Q24:浮点乘除运算中,阶码和尾数分别如何处理?
A:
- 阶码:乘法时相加(再减偏置),除法时相减(再加偏置);
- 尾数:相乘或相除;
- 结果需规格化、舍入,并设置符号位 S = SA ⊕ SB。
第三章 存储系统
Q1:存储器按层次如何分类?各层次的特点是什么?
A:寄存器 → Cache → 主存(DRAM)→ 外存(SSD/HDD)→ 离线存储。越上层速度越快、容量越小、成本越高;越下层反之。
Q2:简述存储系统的层次结构及其设计依据。
A:基于局部性原理(时间/空间局部性),通过多级缓存、块传送、替换策略(如 LRU)和写策略(Write-through/Back),在成本与性能间取得平衡。
Q3:主存储器的主要技术指标有哪些?
A:容量、字长、访问时间/周期、带宽、命中率、功耗、成本/位。
Q4:SRAM 和 DRAM 在结构和性能上有何区别?
A:
- SRAM:用触发器存储,无需刷新,速度快,但密度低、成本高;
- DRAM:用电容存储,需定期刷新,速度较慢,但密度高、成本低。
Q5:为什么 DRAM 需要刷新?刷新有哪几种方式?
A:电容会漏电导致数据丢失。刷新方式包括:集中刷新、分散刷新(行刷新)、CAS-before-RAS(CBR)刷新、自刷新。
Q6:存储器容量扩展的常见方法有哪些?
A:位扩展(增加数据宽度)、字扩展(增加地址空间)、多模块交叉/银行化(提高并行性)。
Q7:什么是位扩展和字扩展?
A:
- 位扩展:多个芯片并联,扩展数据位宽(如 8 片 1M×1 扩展为 1M×8);
- 字扩展:通过地址高位选片,扩展存储单元数量(如 2 片 1M×8 扩展为 2M×8)。
Q8:新型 DRAM 芯片(如 SDRAM)的主要特点是什么?
A:同步时钟控制、支持突发(Burst)传输、多 Bank 并行、命令驱动、高带宽。
Q9:ROM 有哪几种类型?各自的特点是什么?
A:
- Mask ROM:出厂固化,不可改;
- PROM:一次可编程;
- EPROM:紫外光擦除;
- EEPROM/Flash:电擦除、可重写,Flash 支持块擦除。
Q10:什么是双端口存储器?有什么优点?
A:具有两个独立访问端口,可同时读/写,提升带宽和并行性,常用于高速缓存或图形处理。
Q11:什么是相联存储器?其主要用途是什么?
A:按内容而非地址寻址(Content-Addressable Memory, CAM)。用于 TLB、Cache 标记查找等需快速匹配的场景。
Q12:多模块交叉存储器的基本原理是什么?
A:将地址低位用于选择存储模块,连续地址分布在不同模块,实现交叉访问,隐藏存储周期,提高吞吐。
Q13:Cache 的基本工作原理是什么?
A:利用局部性,将主存中近期可能访问的数据块复制到高速 Cache 中;命中则快速访问,未命中则从主存调入。
Q14:Cache 与主存之间有哪些地址映射方式?
A:直接映射、全相联映射、组相联映射。
Q15:直接映射、全相联映射、组相联映射各有什么特点?
A:
- 直接:实现简单、速度快,但冲突率高;
- 全相联:命中率高,但硬件复杂、成本高;
- 组相联:折中方案,兼顾性能与复杂度。
Q16:什么是虚拟存储器?其核心思想是什么?
A:以磁盘为后备,将程序按页/段动态调入主存,提供远大于物理内存的虚拟地址空间。核心:按需调页 + 局部性原理。
Q17:存储保护的主要实现方法有哪些?
A:基址-界限寄存器、页表中的 R/W/X 权限位、特权级/保护环、段表权限、内存保护键(MPK)等。
第四章 指令系统
Q1:一条指令通常由哪几部分组成?
A:操作码(Opcode)、寻址方式标识、源/目的操作数字段(寄存器、立即数、地址偏移等)、条件码、长度信息等。
Q2:常见的指令格式有哪些?
A:0/1/2/3 地址指令;R/I/J 型(如 MIPS);定长(RISC)与变长(CISC)格式。
Q3:什么是操作码定长?有什么优缺点?
A:操作码固定位数。优点:解码简单快速;缺点:编码空间受限,难以支持大量指令或灵活操作数。
Q4:什么是扩展操作码?其设计思想是什么?
A:高频指令用短操作码,低频指令用前缀+长操作码。思想:层次化编码,提升编码效率和指令密度。
Q5:常见的寻址方式有哪些?
A:立即、寄存器、直接、间接、寄存器间接、基址、变址(索引)、位移、PC 相对、堆栈等。
Q6:如何计算有效地址 EA?
A:依寻址方式而定,例如:
- 基址+变址:EA = Base + Index×Scale + Disp;
- PC 相对:EA = PC + offset;
- 寄存器间接:EA = (R)。
Q7:立即寻址和直接寻址的区别是什么?
A:立即寻址的操作数直接包含在指令中;直接寻址的操作数地址在指令中,需访存一次获取数据。
Q8:变址寻址和基址寻址各自的应用场景是什么?
A:
- 变址(Index):用于数组/循环遍历(Index 递增);
- 基址(Base):用于程序重定位、多任务隔离、栈帧访问(Base 固定,Disp 变化)。
Q9:CISC 指令系统的主要特点是什么?
A:指令多且复杂、寻址方式丰富、变长指令、微程序控制、寄存器少、代码密度高。
Q10:RISC 指令系统的主要特点是什么?
A:指令简单定长、Load/Store 架构、寄存器多、寻址方式少、硬连线控制、流水线友好。
Q11:RISC 与 CISC 在设计思想上的根本区别?
A:CISC 依靠复杂指令减少程序条数,靠硬件实现功能;RISC 简化指令,靠编译器优化和流水线提升吞吐。
Q12:设计指令结构时需要考虑哪些因素?
A:性能(流水线兼容性)、编码空间与密度、正交性、兼容性、实现复杂度、能耗/面积、调试与安全性。
第五章 中央处理器(CPU)
Q1:CPU 的基本组成包括哪些部件?
A:ALU、寄存器组、控制器(硬连线/微程序)、PC、IR、状态寄存器、内部总线,部分含 Cache。
Q2:程序计数器(PC)的作用是什么?
A:保存下一条待取指令的地址,执行后自动更新(顺序+4 或跳转目标)。
Q3:指令周期和 CPU 周期的区别是什么?
A:指令周期 = 完成一条指令所需全过程;CPU 周期(时钟周期)是基本时间单位,一个指令周期包含多个 CPU 周期。
Q4:一条指令的执行过程通常分为哪几个阶段?
A:取指 → 译码 → 取操作数/地址计算 → 执行 → 访存(如 Load/Store)→ 写回。
Q5:如何用方框图语言描述指令执行过程?
A:用寄存器传输语言(RTL)表示,如:MAR←PC;IR←Mem[MAR];PC←PC+4;Reg[rd]←ALUout。
Q6:控制器有哪些控制方式?各有什么特点?
A:
- 硬连线:速度快,但修改困难;
- 微程序:灵活易改,但稍慢;
- 混合式:结合两者优势。
Q7:什么是微程序控制?
A:将每条机器指令的执行分解为一系列微指令,存储在控制存储器中,顺序执行以生成控制信号。
Q8:微命令、微指令和微程序之间的关系是什么?
A:微命令 = 单个控制信号;微指令 = 一个时钟周期内所有微命令的集合;微程序 = 实现一条机器指令的微指令序列。
Q9:微地址是如何形成的?
A:由微地址字段、顺序器、条件分支(根据标志位)、操作码映射入口等共同决定下一微地址。
Q10:什么是并行性?CPU 中体现在哪些方面?
A:并行性指同时处理多个任务。CPU 中包括:
- 指令级(流水线、超标量);
- 数据级(SIMD/向量);
- 线程级(多核、SMT);
- 存储并行(多 Bank Cache)。
Q11:流水线中的三种相关冲突分别是什么?
A:数据相关、结构相关、控制相关(分支相关)。
Q12:数据相关、结构相关、控制相关的解决方法有哪些?
A:
- 数据相关:转发(旁路)、停顿、寄存器重命名、调度;
- 结构相关:增加资源(如多 ALU)、调度;
- 控制相关:分支预测、延迟槽、投机执行+回滚。
Q13:RISC 技术在 CPU 设计中的体现是什么?
A:定长指令利于流水线;Load/Store 架构简化访存;丰富寄存器减少访存;硬连线控制提速;支持快速分支与数据转发。
Q14:指令与微指令的区别是什么?
A:指令是 ISA 层对软件可见的操作;微指令是硬件内部控制单元使用的底层信号序列,软件不可见。
第六章 总线系统
Q1:总线按功能可分为哪几类?
A:地址总线、数据总线、控制总线;按范围:片内总线、系统总线、I/O 总线、存储总线等。
Q2:总线的主要性能指标有哪些?
A:带宽(GB/s)、位宽、时钟频率、传输率、延迟、仲裁延时、利用率、负载能力、电气特性。
Q3:总线的数据传送方式有哪些?
A:程序查询 I/O、中断 I/O、DMA、总线主控(Bus Mastering)。
Q4:常见的总线仲裁方式有哪些?
A:链式查询(菊花链)、集中并行仲裁、分布式仲裁(如令牌、CAN)、轮询。
Q5:链式查询仲裁方式的工作原理是什么?
A:总线请求信号沿设备链传递,优先级由物理位置决定,最先响应者获得总线。
Q6:集中式仲裁和分布式仲裁有何区别?
A:集中式由单一仲裁器裁决;分布式由各节点自主协商(如比较优先级或传递令牌),无单点故障。
Q7:分布式仲裁电路的基本思想是什么?
A:各节点将自己的优先级编码放到总线上,通过“线与”或“线或”比较,最高优先级者胜出;或通过令牌在节点间传递。
Q8:总线的同步定时和异步定时有何区别?
A:
- 同步:依赖全局时钟,时序固定,简单但受时钟 skew 限制;
- 异步:采用握手协议(Req/Ack),适应不同延迟,更灵活但控制复杂。
Q9:总线的数据传送模式有哪些?
A:单次传送、突发(Burst)传送、分离事务(Split Transaction)、循环窃取(DMA)。
Q10:多总线结构的优点是什么?
A:提高并行度、减少冲突、模块化设计、易于扩展、隔离不同类型流量(如 CPU-内存 vs I/O),提升整体吞吐与可靠性。
✅ 此 QA 整理可用于复习提纲、教学讲义或面试准备。如需 PDF 或 Markdown 格式,可进一步告知。
计网
模型概念
OSI模型:
- 物理层:在物理介质(如电缆、光纤)上传输和接收原始比特流。
- 数据链路层:将从物理层获得的二进制流拆分为分离的帧。
- 网络层:将分组从源机一路送到目的机。
- 传输层
- 会话层
- 表示层
- 应用层
信道复用
- 时分复用 :将时间分成一个个极短的间隔,并 为每个用户分配专属的时间间隔, 用户在属于自己的时间间隔使用整条共享信道。
- 频分复用: 将共享的物理带宽分成若干间隔的频率范围,每个频 宽可以全时、同时使用,各个频宽上传输的信号互不干扰。
- 波分复用 :本质上是频分复用,波分复用是一种共享光纤信道的技术,不同用户的数据搭载到不 同波长的光波信号上,复用在一起共享信道
- 码分复用:不会太难了
数据链路层(DLL)协议
HDLC协议
帧的头部和尾部,以01111110的序列作为分界标志。
HDLC协议使用比特填充(bit stuffing)来避免在数据中出现与标志字段相同的比特模式。HDLC的标志字段是01111110,因此当数据中出现连续5个1时,需要在第5个1后面插入一个0。(这样数据中永远无法出现连续的6个1,避免出现帧标志分界符)
PPP
PPP同样以01111110作为分帧的边界符。
PPP协议在进行异步传输时,使用字节填充的法而在同步传输时,PPP协议使用与HDLC协议类似的位填充法
PPP使用异步传输时,我们使用0x7D(01111101)作为转义符,想要在里面输入特殊字节,就在前面加个转义符。类似c语言字符串中的"\\"行为
PPPoE
PPPoE技术(PPP over Ethernet),“在以太网上的PPP协议”
调制
波特率(baud)和比特率(bit)的关系 :
波特率:每秒钟信号变化的次数,也称调制速率
比特率:每秒钟传送的二进制位数
校验
奇偶校验
通过校验码字里面的1的个数是奇数或者偶数来判断是否出错。
CRC
给出一个生成多项式G(x)为r阶,原数据M(x)
在M(x)后面添加r个0,用得到的这个使用模2除法(即不借位)除以G(x)求出余数,用余数替换原先的r个0
模2除法它既不向上位借位,也不比较除数和被除数的相同位数值的大小,只要以相同位数进行相除即可。余数首位是1,商就是1,余数首位是0,商就是0。
海明码
用2^n位(n = 0, 1, 2 …)作为校验位,然后中间是原先的数据位
对于第i个校验位(i = n + 1),从该位开始计算连续i的异或,跳过i个,再计算连续i个的异或,一直循环到末尾。
通常使用偶校验(即校验位使得其负责的所有位的总异或和为0)。
校验位数 r 需要满足不等式: 2^r >= k + r + 1