外观
计算机组成原理核心知识
约 3329 字大约 11 分钟
2025-08-16
一、计算机基础概述
1. 计算机系统的层次结构
冯·诺依曼体系结构是现代计算机的基础,其核心思想:
- 程序存储:程序和数据都存储在内存中
- 顺序执行:指令按顺序执行
- 五大部件:运算器、控制器、存储器、输入设备、输出设备
现代计算机层次结构:
应用软件 → 系统软件 → 操作系统 → 指令集架构(ISA) → 微架构 → 硬件逻辑关键概念:
- 指令集架构(ISA):硬件和软件之间的接口,定义了指令、寄存器、数据类型等
- 微架构:ISA的具体实现方式,不同的微架构可以实现相同的ISA
2. 计算机性能指标
核心性能指标:
- 时钟频率:CPU每秒执行的时钟周期数,单位GHz
- CPI (Cycles Per Instruction):执行一条指令所需的平均时钟周期数
- MIPS (Million Instructions Per Second):每秒执行的百万条指令数
- FLOPS (Floating Point Operations Per Second):每秒浮点运算次数
性能公式:
执行时间 = 指令数 × CPI × 时钟周期
= (指令数 × CPI) / 时钟频率Amdahl定律:系统性能提升受制于可优化部分的比例
加速比 = 1 / [(1 - 可优化比例) + (可优化比例 / 优化加速比)]提示:在实际工作中,关注CPU、内存、I/O的瓶颈比单纯看时钟频率更重要。
二、数据表示与运算
1. 数制及其转换
常用数制:
- 二进制:计算机内部表示数据的基础,0和1
- 十六进制:便于表示二进制,4位二进制对应1位十六进制
- 十进制:人类习惯的表示方式
转换技巧:
- 二进制转十六进制:每4位一组转换
- 十六进制转二进制:每位扩展为4位
- 十进制转二进制:除2取余法
2. 定点数与浮点数
定点数表示:
- 无符号整数:直接表示非负整数
- 有符号整数:常用补码表示(最高位为符号位)
- 原码:符号位+绝对值
- 反码:符号位不变,其余取反
- 补码:反码+1(最常用,解决0的表示和减法问题)
浮点数表示(IEEE 754标准):
- 单精度(float):32位,1位符号+8位阶码+23位尾数
- 双精度(double):64位,1位符号+11位阶码+52位尾数
(-1)^S × (1.M) × 2^(E-bias)- S:符号位
- M:尾数(mantissa)
- E:阶码(exponent)
- bias:偏移量(单精度为127,双精度为1023)
提示:浮点数运算存在精度问题,避免直接比较浮点数相等。
3. 算术逻辑单元(ALU)
ALU功能:
- 算术运算:加、减、乘、除
- 逻辑运算:与、或、非、异或
- 移位操作:逻辑移位、算术移位
关键电路:
- 加法器:半加器、全加器、超前进位加法器
- 乘法器:阵列乘法器、Booth算法
- 比较器:用于大小比较和条件判断
三、存储系统
1. 存储系统的层次结构
存储层次金字塔:
寄存器 → L1 Cache → L2 Cache → L3 Cache → 主存(RAM) → 辅存(硬盘/SSD)- 速度:从上到下递减
- 容量:从上到下递增
- 成本/字节:从上到下递减
局部性原理:
- 时间局部性:最近访问的数据很可能再次被访问
- 空间局部性:访问某地址后,其附近地址很可能被访问
2. 半导体随机存储器(RAM)
RAM类型:
SRAM (Static RAM):
- 速度快、成本高
- 用于CPU缓存
- 6个晶体管存储1位
- 不需要刷新
DRAM (Dynamic RAM):
- 速度较慢、成本低
- 用于主存
- 1个晶体管+1个电容存储1位
- 需要定期刷新
内存组织:
- 字长:CPU一次能处理的数据位数(32位、64位)
- 内存编址:按字节编址(每个地址对应1字节)
- 内存条:现代计算机使用DIMM模块
3. 高速缓冲存储器(Cache)
Cache基本概念:
- 缓存行:Cache与主存之间数据传输的基本单位(通常64字节)
- 命中:所需数据在Cache中
- 缺失:所需数据不在Cache中
映射方式:
- 直接映射:每个主存块只能映射到Cache的一个特定位置
- 组相联映射:主存块可映射到Cache的特定组中的任意位置(常用2/4/8路组相联)
- 全相联映射:主存块可映射到Cache的任意位置
替换策略:
- LRU (Least Recently Used):替换最近最少使用的块
- FIFO (First In First Out):替换最早进入的块
- 随机替换:随机选择一个块替换
写策略:
- 写直达(Write-through):同时写入Cache和主存
- 写回(Write-back):只写入Cache,块被替换时才写回主存
4. 虚拟存储器
虚拟内存基本概念:
- 虚拟地址:程序使用的地址空间
- 物理地址:实际内存中的地址
- 页表:虚拟地址到物理地址的映射表
- 页:虚拟内存的基本单位(通常4KB)
TLB (Translation Lookaside Buffer):
- 页表项的高速缓存
- 减少地址转换的开销
- 通常集成在CPU中
页面替换算法:
- FIFO:替换最早装入的页面
- OPT:替换未来最长时间不会被使用的页面(理论最优,无法实现)
- LRU:替换最近最少使用的页面(常用近似算法)
四、指令系统
1. 指令格式
指令基本组成:
- 操作码(Opcode):指定要执行的操作
- 操作数(Operand):操作的对象(寄存器、内存地址、立即数等)
常见指令格式:
- 三地址指令:OP A, B, C (结果 = A op B)
- 二地址指令:OP A, B (A = A op B)
- 单地址指令:OP A (累加器 = 累加器 op A)
- 零地址指令:OP (通常用于栈式计算机)
RISC vs CISC:
RISC (精简指令集):
- 指令数量少、格式简单
- 大多数指令在一个时钟周期内完成
- 更多的通用寄存器
- 代表:ARM、MIPS、RISC-V
CISC (复杂指令集):
- 指令数量多、功能复杂
- 指令执行时间不固定
- 微程序控制
- 代表:x86
2. 寻址方式
常用寻址方式:
立即寻址:操作数直接包含在指令中
MOV R1, #10(将立即数10加载到R1)
寄存器寻址:操作数在寄存器中
ADD R1, R2, R3(R1 = R2 + R3)
直接寻址:指令中给出内存地址
LOAD R1, 0x1000(从地址0x1000加载数据到R1)
寄存器间接寻址:寄存器中存放的是操作数的地址
LOAD R1, [R2](从R2指向的地址加载数据到R1)
基址寻址:基址寄存器+偏移量
LOAD R1, [R2, #4](从R2+4指向的地址加载数据)
变址寻址:基址+变址寄存器
LOAD R1, [R2, R3](从R2+R3指向的地址加载数据)
3. 常见指令集简介
x86指令集:
- CISC架构
- 广泛用于桌面和服务器
- 有16/32/64位版本
- 复杂的指令格式和寻址方式
ARM指令集:
- RISC架构
- 广泛用于移动设备和嵌入式系统
- Thumb指令集:16位压缩指令
- ARMv8:支持64位
RISC-V:
- 开源指令集
- 模块化设计
- 简单、精简
- 学术和工业界越来越受欢迎
五、中央处理器(CPU)
1. CPU功能和基本结构
CPU主要组件:
- 控制单元(CU):负责指令的获取、解码和执行控制
- 算术逻辑单元(ALU):执行算术和逻辑运算
- 寄存器组:高速存储单元,用于暂存数据和地址
- 总线接口单元(BIU):管理CPU与外部的数据传输
寄存器分类:
- 通用寄存器:用于数据存储和计算
- 专用寄存器:
- PC (Program Counter):程序计数器,指向下一条指令
- IR (Instruction Register):指令寄存器,存放当前指令
- MAR (Memory Address Register):内存地址寄存器
- MDR (Memory Data Register):内存数据寄存器
- PSW (Program Status Word):程序状态字,包含标志位
2. 指令执行过程
指令周期:
- 取指(Fetch):从内存中取出指令
- 译码(Decode):解析指令的操作码和操作数
- 执行(Execute):执行指令指定的操作
- 访存(Memory):如需要,访问内存
- 写回(Write-back):将结果写回寄存器或内存
数据通路:
- 指令执行过程中数据流动的路径
- 包括寄存器、ALU、内存等组件之间的连接
3. 指令流水线
流水线基本概念:
- 将指令执行过程分为多个阶段
- 不同指令的不同阶段可以并行执行
- 提高CPU的吞吐率
典型五级流水线:
- IF (Instruction Fetch):取指令
- ID (Instruction Decode):指令译码和寄存器读取
- EX (Execute):执行/地址计算
- MEM (Memory Access):内存访问
- WB (Write Back):写回寄存器
流水线问题:
- 结构冒险:硬件资源冲突
- 数据冒险:
- RAW (Read After Write):先写后读
- 解决方法:转发(forwarding)、插入气泡
- 控制冒险:
- 分支指令导致流水线中断
- 解决方法:分支预测、延迟槽
超标量技术:
- 每个时钟周期发射多条指令
- 多个执行单元并行工作
- 现代CPU的常见特性
六、总线系统
1. 总线概述
总线定义:
- 连接计算机各部件的公共通信线路
- 一组共享的信号线
总线分类:
- 数据总线:传输数据
- 地址总线:传输地址
- 控制总线:传输控制信号
总线特性:
- 带宽:单位时间内传输的数据量
- 时钟频率:总线的工作频率
- 位宽:数据总线的宽度
2. 常见总线标准
内部总线:
- FSB (Front Side Bus):早期CPU与北桥之间的总线(已逐渐淘汰)
- QPI (QuickPath Interconnect):Intel多核处理器间的高速互连
- Infinity Fabric:AMD处理器内部互连
系统总线:
- PCIe (Peripheral Component Interconnect Express):
- 现代计算机主要扩展总线
- 串行、点对点连接
- 1x, 4x, 8x, 16x 通道配置
- 用于显卡、SSD等高速设备
存储总线:
- SATA (Serial ATA):连接硬盘、光驱
- NVMe:基于PCIe的高速存储协议
七、输入输出系统
1. I/O系统基本概念
I/O接口功能:
- 数据缓冲:解决速度不匹配问题
- 信号转换:电平、串并转换等
- 设备选择:选择特定设备进行通信
- 中断控制:处理设备中断请求
I/O端口编址方式:
- 独立编址:I/O端口有独立的地址空间(x86采用)
- 使用IN/OUT指令访问
- 统一编址:I/O端口映射到内存地址空间(ARM、RISC-V采用)
- 使用普通内存访问指令
2. 常见I/O方式
程序控制I/O:
- 无条件传送:适用于简单、固定速度的设备
- 查询方式:CPU不断查询设备状态
- 简单但效率低,CPU利用率低
中断驱动I/O:
- 设备准备好后向CPU发送中断请求
- CPU响应中断后执行I/O操作
- 比查询方式效率高
直接存储器访问(DMA):
- 由DMA控制器直接控制内存和I/O设备间的数据传输
- CPU只需初始化传输,不参与数据传输过程
- 适用于大量数据传输(如磁盘I/O、网络数据)
I/O处理器方式:
- 专用I/O处理器处理I/O操作
- 减轻CPU负担
- 用于高性能系统
八、实用技巧与建议
1. 理解计算机系统的关键点
- 存储层次:理解Cache、内存、磁盘的层次结构对性能的影响
- 局部性原理:编写代码时考虑时间局部性和空间局部性
- 数据表示:了解整数、浮点数的表示方式和限制
- 指令执行:理解指令流水线和可能的冒险情况
2. 性能优化实用技巧
缓存友好代码:
- 顺序访问内存(利用空间局部性)
- 重复使用数据(利用时间局部性)
- 考虑缓存行大小(通常64字节)
分支预测优化:
- 减少条件分支
- 将常见情况放在前面
- 避免复杂分支逻辑
并行化:
- 利用多核处理器
- 考虑数据依赖性
- 适当粒度的并行任务
3. 常见问题排查
| 问题现象 | 可能原因 | 解决思路 |
|---|---|---|
| 程序运行缓慢 | 内存访问不友好 | 检查内存访问模式,优化数据结构 |
| 缓存命中率低 | 分析缓存行为,调整数据布局 | |
| 分支预测失败率高 | 简化条件逻辑,重构代码 | |
| CPU使用率高 | 计算密集型 | 考虑算法优化或并行化 |
| 频繁系统调用 | 减少系统调用次数,批量处理 | |
| I/O性能瓶颈 | 磁盘I/O频繁 | 增加内存缓存,优化I/O模式 |
| 网络延迟高 | 减少网络请求,使用更高效协议 |
九、常用工具速查表
| 工具 | 用途 | 常用命令 |
|---|---|---|
perf | 性能分析 | perf stat ./programperf record -g ./program |
valgrind | 内存和性能分析 | valgrind --tool=callgrind ./program |
strace | 系统调用跟踪 | strace -c ./program |
htop/top | CPU和内存监控 | htop |
vmstat | 虚拟内存统计 | vmstat 1 |
iostat | I/O统计 | iostat -x 1 |
