27 408考研
计算机组成原理
part1: 计算机发展历程
硬件:指计算机系统中由电子元器件和机械装置构成的实体。根据冯·诺依曼结构,经典硬件包含五大部分:运算器、控制器、存储器、输入设备、输出设备。
软件:指为解决特定问题而编制的程序及其相关文档。分为:
- 系统软件:用于管理计算机资源(如操作系统、数据库管理系统、编译器)。
- 应用软件:解决用户具体需求的程序(如微信、Civilization VI)。
核心公式:
计算机系统 = 硬件 + 软件
软硬件逻辑等效性:任何由软件完成的动作,逻辑上也可以通过硬件实现;反之亦然(例如:乘法可以用专门的乘法器硬件实现,也可以用软件多次加法模拟)。
选择题常见陷阱
陷阱一:系统软件和应用软件的区分。
- 纠正:编译器、汇编器、解释器属于系统软件,不是应用。
陷阱二:硬件和软件的界限是绝对的吗?
- 考点:逻辑等效性。硬件实现通常速度快、成本高;软件实现速度慢、灵活性高。
陷阱三:翻译程序的区别。
- 考点:编译程序(生成目标代码) vs 解释程序(逐句翻译不生成目标代码)。
part2: 冯·诺依曼机体系结构
冯·诺依曼机最核心的思想是 “存储程序”。其体系结构包含以下五个要点:
- 五大部件:运算器、控制器、存储器、输入设备、输出设备。
- 指令与数据同等地位:指令和数据都以二进制形式存放在存储器中, CPU 根据指令周期的不同阶段来区分它们(取指阶段取的是指令,执行阶段取的是数据)。
- 按地址寻址:指令在存储器中按顺序存放,由程序计数器(PC)指明执行顺序。
- 指令结构:由 操作码(OP) 和 地址码(AD) 组成。
- 以运算器为中心:这是早期冯·诺依曼机的典型特征(现代计算机已改为以存储器为中心)。
我们可以把早期的冯·诺依曼机比作一个 “极其死板的加工厂”:
- 存储器(仓库):里面堆满了盒子。有的盒子里装的是“零件”(数据),有的盒子里装的是“说明书”(指令)。最离谱的是,这些盒子外观一模一样!
- 控制器(调度员):他只认“地址”。他去 1 号盒子拿说明书,看一眼,发现写着“去 5 号盒子拿零件”。
- 运算器(加工车间):由于它是中心,所有进出的货(数据)都必须先经过这个车间。
- 输入/输出(大门):原材料进来,成品出去。
💡 直觉解释: 为什么叫“存储程序”?因为在冯氏机之前,改个功能得重新接电线(硬连线);有了它,只需要换一下“仓库”里的指令序列(软件),机器就能变功能。
选择题陷阱(高频!)
区分指令和数据:计算机靠什么区分存储器里的二进制是指令还是数据?
- 错误答案:靠标志位、靠不同的存储空间。
- 正确答案:靠指令周期的不同阶段(取指阶段取的是指令,执行阶段取的是数据)。
中心地位的演变:
- 早期:以运算器为中心(数据传输都要经过运算器,效率低)。
- 现代:以存储器为中心(为了解放 CPU,发展出了 DMA 等技术)。
2. 大题常见问法
- 在分析指令执行流时,会让你写出数据流经哪些部件。记住:在早期模型中,数据从输入设备进来,必须先去运算器,不能直接去存储器。
3. 容易丢分的地方
- 忽略了二进制表示。考纲要求明确:冯·诺依曼机的所有信息均采用二进制表示。
主存储器
主存储器主要由 存储体(Storage Body)、地址寄存器(MAR)、数据寄存器(MDR) 以及 时序控制逻辑 组成。
- 存储体:由许多存储单元(Storage Unit)组成,每个单元包含若干个存储元(存放 0 或 1 的电容/触发器)。
- 存储单元:存放一串二进制代码,这串代码称为存储字(Storage Word)。
- 存储字长:一个存储单元中二进制代码的位数。
- MAR(Memory Address Register):主存地址寄存器。其位数对应存储单元的个数(若 MAR 为 n 位,则有
2^n个单元)。 - MDR(Memory Data Register):主存数据寄存器。其位数等于存储字长。
主存储器就像一栋巨大的 “酒店大楼”:
- 存储体 = 整个大楼:里面有很多房间(存储单元)。
- 存储单元 = 具体的房间:每个房间里住着几个客人(二进制位)。
- 存储字长 = 每个房间能住几个人:如果字长是 16 位,那每个房间就标配 16 个床位。
- MAR(地址寄存器) = 楼层索引表:如果你要找某个房间,你需要知道它的门牌号。如果门牌号是 10 位的二进制数,那这栋楼最多有
2^10 = 1024个房间。 - MDR(数据寄存器) = 搬运工手里的推车:要把房间里的客人(数据)接出来或者送进去,推车的尺寸(MDR 位数)必须和房间里的床位(存储字长)对齐。
选择题核心计算(送分必拿)
公式 1:存储单元个数 =
2^(MAR位数)。- 例题:某机器 MAR 为 32 位,则其最大寻址空间为
2^32 = 4GB(假设按字节寻址)。
- 例题:某机器 MAR 为 32 位,则其最大寻址空间为
公式 2:总容量 = 存储单元个数 × 存储字长。
- 注意:区分“位(bit)”和“字节(Byte)”。1 Byte = 8 bit。
2. 易错点提醒
MAR/MDR 的位置:在 408 不同的教材体系里,有的说 MAR/MDR 在 CPU 内部,有的说在主存内部。现代 CPU 已经把 MAR 和 MDR 集成在内部了,但在逻辑结构图里,它们依然被视为 CPU 与主存交互的桥梁。
按字节寻址 vs 按字寻址:
- 大部分时候默认 按字节(Byte) 寻址。
- 如果题目说“按字寻址”,你必须把总位数除以字长。
运算器
核心组成部件:
- ALU(算术逻辑单元):运算器的“心脏”,负责具体的计算逻辑。
- ACC(累加寄存器):最重要的寄存器。用于暂时存放操作数或运算结果。
- MQ(乘商寄存器):在乘、除法运算时,用于存放乘数、商或余数。
- X(操作数寄存器):存放除被乘数、被除数之外的操作数。
- PSW(状态条件寄存器/程序状态字):存放运算结果的特征(如是否溢出、是否有进位、结果是否为负)。
想象运算器是一个 “全自动厨卫加工机”:
- ALU(灶台/炒锅):真正生火做菜的地方,不管是炒(加法)还是煮(减法),都在这儿发生。
- ACC(主餐盘):它是最忙的。刚炒好的菜(结果)先放在这儿,准备下锅的肉(被乘数)也先放在这儿。
- MQ(备用盘):当要做大菜(乘除法)时,主餐盘装不下了,就把剩下的材料临时堆在 MQ 里。
- X(调料碟):放第二个配料的地方。
- PSW(质检报告):菜做好了,它是咸了(溢出)还是淡了(结果为 0),由 PSW 记录。
控制器
核心组成部件:
- PC(程序计数器,Program Counter):存放下一条将要执行指令的地址。具有自增功能((PC)+1→PC)。
- IR(指令寄存器,Instruction Register):存放当前正在执行的指令。
- CU(控制单元,Control Unit):分析 IR 中的指令,发出微操作控制信号序列,指挥全机动作。
- MAR 和 MDR:虽然逻辑上属于主存,但在现代 CPU 中,MAR 和 MDR 是由控制器直接控制的。
控制器就像是加工厂里的 “总调度室”:
- PC(待办清单索引):调度员手里的小本子,上面只写着:“下一个任务在仓库的第几个货架”。每领走一个任务,他就把号码加 1,指向下一个。
- IR(正在处理的图纸):从仓库取回来的指令(图纸)就摊在桌子上看。这就是 IR。
- CU(调度总监):总监盯着 IR 里的图纸看(译码),然后拿起大喇叭喊:“运算器,你去做加法!”“主存,把你那个数传过来!”
考试怎么考?
选择题陷阱:PC 的变化时机(极高频!)
- 陷阱:PC 是在指令执行完才加 1 吗?
- 纠正:不是! CPU 一旦取出指令,PC 就会立即自增,指向下一条地址。这样在执行当前指令的同时,就已经为下一条做好了准备。
2. 指令执行过程(数据流大题必考)
你要能闭眼写出“取指周期”的动作:
- (PC)→MAR(把地址给仓库索引)
- M(MAR)→MDR(从仓库取出指令到推车)
- (MDR)→IR(把指令放到调度室桌上)
- (PC)+1→PC(小本子翻页)
- CU 译码,发出信号。
3. 容易丢分的地方
区分“地址”和“内容”:PC 存的是地址,IR 存的是指令本身。
程序员可见性:
- 可见:PC(你可以通过跳转指令改它)。
- 不可见:IR、MAR、MDR(这些是硬件自动流转的,程序员写代码控制不了)。
计算机的多级层次结构
想象一个 “跨国公司” 的运作流程:
- M4 高级语言(老板):只发口令:“我们要增加利润!”(一行代码
profit++)。 - M3 汇编语言(经理):把老板的口令翻译成具体步骤:“去查账目,去收余款,把钱加起来”。
- M2 操作系统(秘书):处理杂事,比如申请办公场地(内存)、调用打印机(I/O)。
- M1 机器语言(员工):只认死理,动作只有 0 和 1(搬东西、放东西)。
- M0 微程序(员工的肌肉纤维):控制手部肌肉如何收缩来完成搬东西的动作。
直觉解释: 每一层都为上一层提供了 “遮蔽层”(封装)。高级语言程序员不需要知道 CPU 里的寄存器叫什么,因为编译器和操作系统帮你处理好了。
【考试怎么考】
1. 选择题陷阱:程序员的视角
- 考点:机器语言、汇编语言程序员能看到什么?
- 真相:他们能看到 PC(程序计数器)、通用寄存器、状态位。
- 陷阱:高级语言程序员(C/Java)看不见寄存器。微程序程序员能看到微指令,但机器语言程序员看不见微指令。
2. 翻译程序的区别
- 汇编程序:M3 → M1(助记符转二进制)。
- 编译程序:M4 → M3 或 M1(整本翻译)。
- 解释程序:M4 → 立即执行(同声传译)。
3. 容易丢分的地方
- 虚拟机(Virtual Machine):M2、M3、M4 实际上都是虚拟机,因为它们并不是真实存在的硬件,是通过软件包装出来的“逻辑机器”。
计算机的性能指标
【二、核心概念(专业版)】
计算性能指标主要分为时间指标和速度指标。
1. 基本时间单位
- 机器字长:计算机一次整数运算能处理的二进制位数。
- 主频 (f):CPU 内部主时钟的频率。单位:Hz(如 3.0GHz)。
- 时钟周期 (T):主频的倒数,
T = 1/f。它是 CPU 最小的时间单位。
2. 核心性能公式(背诵核心!)
CPI (Cycles Per Instruction):执行一条指令所需的时钟周期数。
- 注意:一条指令可能由多个微动作组成,所以 CPI 往往大于 1。
CPU 执行时间:执行一段程序所需的时间。
CPU 时间 = CPU 时钟周期数 ÷ 主频 = (指令条数 × CPI) ÷ 主频
MIPS (Million Instructions Per Second):每秒执行多少百万条指令。
MIPS = 指令条数 ÷ (执行时间 × 10^6) = 主频 ÷ (CPI × 10^6)
MFLOPS (Million Floating-point Operations Per Second):每秒执行多少百万次浮点运算。
- 注意:现在的超算通常用 TFLOPS (1012) 或 PFLOPS (1015)。
【三、通俗理解版】
我们可以把“完成一项工作”比作“搬砖”:
- 主频:你挥动铲子的速度(每秒挥几次)。
- 时钟周期:挥一次铲子用的时间。
- CPI:搬一块砖需要挥几次铲子。
- MIPS:你平均每秒钟能搬多少块砖。
💡 直觉解释: 为什么主频高的电脑不一定快?因为如果它的 CPI 特别高(搬一块砖要挥 100 遍铲子),那即便它挥得快,搬砖效率(MIPS)依然很低。真正的性能看的是“主频 / CPI”的综合结果。
【四、考试怎么考】
1. 选择题常见陷阱(避坑指南)
单位陷阱:408 极其喜欢在单位上做文章。
- 在描述频率/速度时:
K = 10^3,M = 10^6,G = 10^9。 - 在描述容量/存储时:
K = 2^10 (1024),M = 2^20,G = 2^30。 - 纠正:计算 MIPS 时,M 必须取
10^6,绝不能取1024×1024。
- 在描述频率/速度时:
吞吐量 vs 响应时间:
- 吞吐量:单位时间内完成的工作量(搬了多少砖)。
- 响应时间:从任务提交到完成的时间(搬完这块砖用了多久)。
2. 典型计算步骤
题目: 已知某机主频为 1GHz,某程序包含 100 条指令,平均 CPI 为 4,求执行时间。
- 写出总时钟周期数:
100 × 4 = 400个周期。 - 写出周期长度:
T = 1/1GHz = 10^-9 s。 - 得出时间:
400 × 10^-9 s = 400 ns。
3. 容易丢分的地方
- 基准测试程序(Benchmark):如 SPECmarks。记住它是用来综合评价性能的,单一的 MIPS 不能代表所有性能。
数制与编码
进位计数制
进位计数制与转换:
任意进制转十进制:按位权展开相加。Value=∑(Di×Ri)。
十进制转R进制:
- 整数部分:“除基取余,逆序排列”。
- 小数部分:“乘基取整,顺序排列”。
2、8、16进制互转:3位二进制对应1位八进制(23=8),4位二进制对应1位十六进制(24=16)。
BCD码(Binary-Coded Decimal):
- 用 4位二进制 来表示 1位十进制 数字。
- 8421码:最常用的BCD码,权值从高到低分别是 8、4、2、1。有效范围是
0000到1001(即 0~9)。
字符与字符串编码:
- ASCII码:7位有效位表示 128 个字符。存入一个字节时,最高位通常为 0(或用作奇偶校验位)。
- 汉字机内码:为了和 ASCII 码区分,国标码(GB2312)转机内码时,会将两个字节的最高位都置为 1(即机内码 = 国标码 + 8080H)。
字节序(大小端存储,高频核心!):
- 当一个多字节数据(如 32 位 int
0x12345678)存入按字节编址的主存时: - 大端模式(Big-Endian):最高有效字节(MSB,
0x12)存放在低地址。 - 小端模式(Little-Endian):最低有效字节(LSB,
0x78)存放在低地址。
- 当一个多字节数据(如 32 位 int
通俗理解
我们可以用生活中的例子来建立直觉:
进制转换的本质:就像打包苹果。十进制是“满 10 个苹果装一箱”,二进制是“满 2 个苹果装一箱”。底层物理器件(电路高低电平)最容易表达 2 种状态,所以机器用二进制。
BCD码的直觉(给十进制穿马甲):人类看二进制太反人类了,还是习惯十进制。BCD码就是给 0~9 这十个数字,强行套上一件“4位二进制”的马甲。比如
9穿上马甲就是1001。它本质上按十进制逢十进一,只是表面长得像二进制。大小端存储的直觉(排队进小房间): 假设数据
0x12345678是一个大胖子,12是头,78是脚。主存是一排只能挤进一个部位的单间(1个字节)。- 大端:符合人类从左到右的阅读习惯,“头”先挤进 0 号房(低地址),“脚”最后进 3 号房。这叫**“头重脚轻”**。
- 小端:“脚”先踏进 0 号房,依次往上。这叫**“脚踏实地”**。x86 架构的电脑大多是小端。
考试怎么考
. 选择题陷阱:十进制小数转换的“无底洞”
- 坑点:题目问“任何十进制小数都能精确转换为二进制小数吗?”
- 纠正:绝对不能! 例如十进制的
0.1,你不断乘 2 取整,会得到0.0001100110011...这是一个无限循环小数。因此,浮点数表示十进制小数必定伴随精度丢失。
2. 选择题陷阱:BCD码的加法“加 6 修正”
- 坑点:4位二进制有 16 种状态,但 BCD码只用了前 10 个(0~9)。剩下的
1010(10) 到1111(15) 是非法状态。 - 考法:如果两个 BCD 码相加,结果大于 9(落入了非法区),或者产生了向高位的进位,必须给结果**加上 6(即二进制的
0110)**进行修正,才能把多余的 6 个状态跳过去。
3. 大题杀手:大端小端的数据倒置
- 坑点:给你一段内存地址的数据(低地址到高地址为:
78 56 34 12),告诉你这是小端存储,问你原来的 32 位数据是多少。 - 纠正:很多同学一激动,连字节内部的位也给反转了。记住,大小端只改变“字节”的顺序,绝不改变字节内部的 bit 顺序! 原数据就是
0x12345678。
4. 常识记忆:ASCII 与汉字编码的界限
- 死记硬背:数字
'0'的 ASCII 是48(0x30);大写'A'是65(0x41);小写'a'是97(0x61)。 - 界限:ASCII 码最高位是 0;汉字机内码每个字节最高位必须是 1(防冲突)。只要看到最高位是 1 的字符,大概率是汉字。