跳转至

第2章 计算机组成原理

本页要点:沿程序执行链理解部件;分清地址、字长和带宽;表示数值前先定编码;Cache与流水线都要说明时间口径。手册PDF物理5—8页2.1—2.7,旧操作系统页的组成、寻址与计算讲解移至本页,错误校验见专页。

2.1—2.2 存储程序、CPU和性能

经典五部件为运算器、控制器、存储器、输入设备、输出设备。CPU(中央处理器)包括运算、控制与寄存器等,现代实现还集成若干级Cache;程序与数据以二进制编码存入存储器,PC(程序计数器)指示取指位置,控制器译码、安排ALU(算术逻辑单元)运算和数据传送,分支改变执行顺序。指令/数据Cache分开不意味着整体是严格哈佛结构,存储程序也不意味着只能顺序执行、不能并行。

IR是指令寄存器,MAR是存储器地址寄存器,MDR是数据缓冲寄存器,SP是栈指针,PSW是程序状态字;这些是教学功能划分,现代CPU未必有完全相同的独立器件。ISA(指令集体系结构)规定软件可见的指令、寄存器和寻址规则,微体系结构决定流水线/Cache实现,相同ISA也可性能不同。MAR位数、物理地址位数、通用寄存器位宽和机器字长不能无条件等同;浮点/向量寄存器尤其可能更宽。

ALU不仅产生运算结果,还可能更新状态标志供条件转移使用。用8位加法教学:255+1截取低8位得0,产生进位C=1、零标志Z=1;若按有符号补码理解同样位串,是−1+1=0,不发生有符号溢出V。127+1得位串10000000,按补码变为−128,V=1而最高位无进位C=0。故进位检查无符号范围,溢出检查有符号范围,不能互换;条件跳转要使用相应比较语义。PSW还可含中断允许、模式等控制状态,但哪些指令更新哪些标志依ISA,不把教学C/Z/V名称当所有处理器统一寄存器。[手册§2.2及本页补码模型自行推演;具体ISA标志规则待按架构手册核实]

容量单位另需明确:1 Byte=8 bit,SI十进制kB=1000 B、MB=10^6 B,IEC二进制KiB=1024 B、MiB=2^20 B;习惯写法KB有歧义,题目若以2的幂计算应注明其约定。例如4 KiB页含4096 B、页内偏移12 bit,4 kB则是4000 B,不能混用。网络速率Mbit/s通常十进制,换成Byte/s还需除8。[单位教学约定;原回忆2019第21题作范围线索,不据此复原其未给条件]

取指执行例:固定4 B指令位于1000,指令为LOAD R1,[2000],内存2000处为37。PC给出1000→MAR请求取指→MDR取得指令并送IR→顺序PC更新1004→译码得到地址2000→取数据37→写R1。在允许的边界响应中断。这里是语义步骤,不表示一定花7个时钟;Cache可让逻辑访存不落主存。指令周期是完成一条指令的全过程,可能有取指、间址、执行和中断阶段;PC增加1仅适用于适当的按字/定长编址模型。

主频f是每秒周期数,CPI是每指令平均周期数;CPU时间IC×CPI/f,MIPS(每秒百万条指令)=f/(CPI×10^6),跨ISA或不同负载不能仅按MIPS排名。例A执行10^8条、CPI2、2 GHz,时间0.1 s;B同指令数、CPI3、2.5 GHz,时间0.12 s,主频更高却更慢,A相对B加速1.2倍。若原10 s中8 s可加速4倍,新耗时2+8/4=4 s,总加速2.5;Amdahl式1/[(1−p)+p/s]要求p是原耗时占比,p=0.8的无限优化上限为5。

系统总线位宽与峰值带宽

总线位宽表示一次并行传送多少bit;总线带宽表示每秒传送量。位宽大不必然带宽大,还要看每秒传送次数。理想峰值带宽(Byte/s)=位宽(bit/次)×传送频率(次/s)÷8。例如64位总线每次8 Byte、每秒100×10^6次传送,峰值为800000000 Byte/s=800 MB/s(十进制)。这里100 MHz只有在每周期传送一次时才等于100×10^6次/s,多沿/多次传输须另乘每周期次数。

其他条件不变,位宽32→64 bit或传送次数100→200百万次/s均使峰值翻倍;“64位”不是每秒64 bit。控制开销、等待、仲裁、设备与存储响应会使实际吞吐低于理论峰值。此处为计算机内部系统总线,不是网络的总线型拓扑。

2.3 存储层次、局部性与Cache

典型层次寄存器→Cache→主存→SSD/机械盘,靠局部性把常用数据留近处。时间局部性如反复更新同一计数器,空间局部性如顺序遍历数组;接近CPU通常容量更小、延迟更低、单位成本更高,不是对所有器件的绝对排序。SRAM常作Cache,无需DRAM式刷新;DRAM常作主存,需周期刷新,二者通常易失;ROM/Flash是非易失技术,Flash可擦写,SSD不能套机械寻道/旋转模型。

直接映射每块只有固定行,全相联可放任意行,组相联先定位组再从多路选行。字节编址下地址通常拆为Tag标记、Index组号、Offset块内偏移,命中还检查有效位与Tag。例32 bit地址、Cache数据容量16 KiB、块64 B、4路:行数16384/64=256,组数256/4=64,偏移6 bit、索引6 bit、Tag20 bit。地址0x1234=4660:块号72,组8,偏移52,Tag1;数据容量不含标记等额外开销。

3C缺失为Compulsory强制(首次访问块)、Capacity容量(同容量全相联也放不下工作集)、Conflict冲突(映射限制导致互换)。例4行直接映射、块16 B,地址0、64、0、64都到行0,4次全失;首次两次强制,后两次冲突。同名FIFO/LRU也可用于页置换,但Cache缺失不等于虚拟内存缺页。

FIFO/LRU逐步例保留:同组3路,访问A、B、C、A、D、A。FIFO命中不重排,装前三块后队列A/B/C,命中A仍A/B/C,D淘汰A,再A淘汰B,5次缺失。LRU每次命中移到最近端,第四步后B/C/A,D淘汰B得到C/A/D,最后A命中,共4次缺失。并不证明所有序列LRU都优于FIFO;写回且淘汰脏块还需回写。

写直达在写时更新下级,常有写缓冲;写回先改Cache并置脏位,替换时回写。写分配/不写分配决定写未命中是否装入块,是另一个维度,不与前者定义绑定。若命中时间1 ns、失效率5%、未命中额外代价80 ns,AMAT(平均访存时间)=1+0.05×80=5 ns;若80 ns指未命中总时间,则0.95×1+0.05×80=4.95 ns。手册6页公式未明确总时间/额外时间,必须先定口径。

存储扩展与刷新

1K×8表示1024个8 bit单元。位扩展共地址并联不同数据位,2片得1K×16;字扩展共数据线、用高地址译码片选,4片得4K×8;用8片可组成4K×16。DRAM按保持时间刷新行,集中刷新形成集中不可访存区间,分散刷新把开销散到存储周期,异步刷新在期限内分散行刷新;“无死区”不是完全没有性能代价。

多体低位交叉让连续地址分到不同体,例如4体中地址0、1、2、3分到体0、1、2、3,重叠启动提高吞吐;步长恰使地址落同体时仍会冲突,不保证单次访存延迟变小。

2.4 RAID与磁盘

RAID(独立磁盘冗余阵列)组合多盘换取性能或冗余,但误删/勒索会传播,不能代替独立备份。以下假定n块同容量S、无热备、忽略元数据和格式化开销:

级别 机制 最少盘/可用容量 故障条件
RAID0 条带化 2;nS 无冗余,一成员故障可破坏整个卷可用性,不是每个物理块立刻消失
RAID1 常见两盘镜像 2;S 两成员模型可坏1块,更多镜像副本按配置
RAID5 分布单校验 3;(n−1)S 任一1块失效可恢复,重建期还有读错误风险
RAID6 双校验 4;(n−2)S 任意2块成员故障仍有冗余支持
RAID10 先成对镜像再条带 4且偶数;nS/2 每镜像组最多坏1块;同一组两块坏即失败

回忆版2020题25的3块1 T盘RAID5为(3−1)×1=2 T,单位沿题设,格式化后可用量另算。4盘RAID10坏两块是否存活取决于是否同一镜像组,不能笼统写“只能坏1块”或“必能坏2块”。

机械盘读目标块通常先寻道到磁道、等扇区转到磁头、再传输,访问时间≈寻道+旋转延迟+传输(可另有控制排队)。7200 rpm一圈60/7200 s,平均半圈约4.167 ms。CHS(柱面、磁头、扇区)容量式为柱面×磁头×每道扇区×扇区字节,但现代盘常用LBA且可能变长磁道布局,不能把CHS教学值当真实几何。

2.5 数制、补码和浮点

位权按基数幂增长,二进制每3位对应八进制、每4位对应十六进制。45.625=32+8+4+1+1/2+1/8=101101.101₂=2D.A₁₆,分组从小数点向两边补零。8位无符号范围0—255,所以201可表示而257不行。回忆版2024题24:7456₈=3886,3567₈=1911,相减1975=3667₈,成立在八进制。

同一位串需先定编码。59的纯二进制00111011,8421 BCD逐个十进制数字编码为0101 1001,ASCII字符串“59”则为十六进制35 39;Unicode字符数与UTF-8字节数也不是同一指标。定点数约定小数点位置,不一定单独存小数点。

n位原码/反码有正负零,范围±(2^(n−1)−1);补码只有一个零,范围−2^(n−1)—2^(n−1)−1。8位−5:原码10000101,反码11111010,补码11111011。8位补码5−3=00000101+11111101=1 00000010,丢第9位得2;有进位不代表有符号溢出。127+1=10000000,同号相加变号才是补码有符号溢出;−1+1有进位却不溢出。

补码扩位复制符号位,−5扩16 bit为1111111111111011;固定8位、缩放2^-4时00011000是24/16=1.5,范围−8至7.9375。逻辑右移补0,补码算术右移补符号位,−5算术右移1位为−3,不等同所有语言向零截断的除2。教材移码可约定偏置2^(n−1)并与补码符号位取反对应,IEEE阶码偏置127/1023则不能套这一位反转口诀。

IEEE754 binary32为符号1+阶码8+小数字段23,偏置127;binary64为1+11+52,偏置1023。规格化有限数值为(−1)^s×(1.f)₂×2^(E−bias),隐含1使有效精度24/53 bit;阶码全0或全1时按零、非规格化、无穷、NaN另处理。−13.25=−1.10101₂×2³,s=1,E=130=10000010₂,f=101010后补零,编码0xC1540000。

浮点加减先对阶、小阶尾数右移,再加减、规格化、舍入和范围检查。1.5+0.75=1.1₂×2⁰+0.11₂×2⁰=10.01₂×2⁰=1.001₂×2¹=2.25;binary32编码0x40100000。1+2^-24在[1,2)相邻binary32数的正中,最近偶数舍入到1;不是小数本来为0,其他舍入模式可不同。

2.6 指令格式与寻址

操作码说明干什么,操作数字段给立即数、寄存器或地址信息;零地址栈指令仍有隐含操作数。定长简化边界识别,变长提高某些编码密度,不意味着前者所有情况下更快。32位三寄存器格式若操作码8 bit、32寄存器编号各5 bit,剩余32−8−15=9 bit,不能不看格式就当新增操作码。

寻址 如何形成值或有效地址EA 例:A=100,R=1000,M[100]=500,M[500]=7,M[1000]=9
立即/寄存器 取字段A/寄存器内容 分别100/1000,不另读操作数内存
直接/间接 EA=A/EA=M[A] 分别读得500/7
寄存器间接 EA=R 读得9
基址/变址 寄存器+位移 R+100=1100,需再读M[1100];用途不同、形式可相似
相对 ISA规定的PC基准+有符号位移 地址1000处4 B指令、基准为1004、字节位移−12,目标992
堆栈 SP隐含指向栈顶 后进先出,操作前后SP变化依约定

2.7 流水、并行与指令风格

流水线让多条指令不同阶段重叠,经典IF取指、ID译码、EX执行、MEM访存、WB写回。提高吞吐不保证降低单指令延迟。无停顿、每段等时Δt、k段执行n条:总时(k+n−1)Δt,吞吐n/总时,稳态上限1/Δt,加速nk/(k+n−1),效率n/(k+n−1)。5段10条每段1 ns,串行50 ns,流水14 ns,加速25/7≈3.571,效率5/7≈71.43%;原OS页“1/t条/周期”单位错误,实际是每单位时间,若t为1周期则为1条/周期。

结构冒险是抢同资源,如取指与访存共一个端口,可分资源或停顿;数据冒险如ADD写R1、下一SUB读R1,RAW(写后读)需旁路/停顿,加载结果可能到较晚阶段仍需等待;控制冒险是分支未定,预测错误需清除错误路径。寄存器重命名主要消除名字相关,不自动解决真实RAW依赖;停顿数按具体流水实现。

Flynn分类按指令/数据流:SISD单指令单数据,SIMD单指令多数据如向量运算,MISD多指令单数据是少见分类,MIMD多指令多数据如多核独立线程。RISC(精简指令集)常强调load/store及规整编码,CISC(复杂指令集)常有复杂多样指令;现代RISC也有压缩变长指令,CISC可译微操作并流水,不能用“RISC必定全定长、每条一个周期”判断所有ISA。

补充:总线、I/O、DMA与中断

地址总线选目标,数据总线送内容,控制线协调读写;32位字节地址可区分2^32 B=4 GiB地址空间,不等于安装4 GiB主存。64位数据通路每秒100×10^6次传送,峰值64/8×100×10^6=800 MB/s;每时钟两次传送需另乘2,有效吞吐扣除仲裁/等待等开销。

程序查询由CPU反复看状态并搬数据;中断驱动发起后做别的工作,事件发生再处理;DMA(直接存储器访问)由控制器/设备在内存与设备间搬运,CPU仍需配置地址、长度与方向、处理完成错误。DMA完成可用中断通知,所以DMA与中断不是互斥。设备可用地址需要映射,不能把任意用户虚拟地址直接交设备;IOMMU(输入输出内存管理单元)可提供设备地址转换与保护,MMU则用于CPU地址转换。

中断向量提供某类事件的处理入口信息,向量表按类型组织这些入口;可类比一条联系人记录与整本通讯录。处理器保存必要状态、按入口处理、恢复返回;外部中断通常来自设备/定时器,异常来自当前指令如缺页,系统调用是受控请求内核服务。进入内核不意味着一定切换进程。

I/O端口与寄存器传送:先看数据流向

这里的I/O端口是处理器访问设备接口寄存器的地址标识,不是TCP/UDP端口号,也不是一定对应机箱上的物理插口。接口常提供数据、状态、控制(命令)寄存器:数据寄存器交换内容,状态寄存器反映就绪、忙或错误,控制寄存器接收操作要求;具体设备可能复用地址或采用不同布局。

按OSTEP第36章§36.2—36.3、36.6的简化设备,输出过程为:CPU读取STATUS并判断不忙→把待输出数据写入DATA→把启动命令写入COMMAND→查询完成状态。以自定义教学值说明寄存器传送:R←STATUS(取状态)、确认就绪后DATA←R1(把R1的数据送设备)、COMMAND←启动值;输入则在数据就绪后执行R1←DATA。箭头左侧是接收者,不能把“读端口”解释为把CPU数据写给设备。这些是过程记号,不是可在终端执行的命令,启动值和状态位含义须查具体设备手册。

设备寄存器可采用独立I/O地址空间及专用I/O指令(如x86的IN/OUT),也可采用存储器映射I/O,以特定内存地址上的读写访问设备;“看起来像访存”不表示该地址是普通RAM。上述教材支持两类接口机制及简化过程。重新读取回忆2022年第23题,其题意为“I/O指令实现的数据传送通常发生在何者之间”,四项分别是设备—端口、通用寄存器—设备、端口—端口、通用寄存器—端口;按这里的专用I/O指令模型应为最后一项D。接口端口是CPU侧指令访问的直接对象,设备内部传输是下一层过程;具体指令编码、操作数宽度和权限仍须按ISA核对,不把该题概括为DMA也必经通用寄存器。

来源与未决边界

主资料手册物理5—8页;回忆版2020题21、25(3—4页),2022题21、23、81(5、12页),2023题1(15页),2024题24—25(17页),2019题21(30页)。2026-11-04独立复核重新判定证据,不继承此前已核标签。本轮取得并摘读Nand2Tetris Ch.5 §5.1正文,支持存储程序、CPU/内存/I/O、PC及Hack分离指令/数据存储;Ch.4支持具体Hack指令/寄存器示例,不能外推为全部寻址模式或通用MAR/MDR微操作证明。OSTEP Ch.38教材正文支持失效停止模型下RAID0/1/5基本机制,Ch.37支持机械盘寻道/旋转/传输;RAID6/10课堂容量和故障组合也仍待直接来源核验。Oracle《数值计算指南》 §2.1.1、§2.2.2—2.2.3正文支持32/64位浮点字段、偏置、24/53位精度、特殊值和四种舍入方向,不等于IEEE标准全文。原Patterson/Hennessy仅列书名章节而未有本轮正文证据,撤回其已核标签;CPI/MIPS/Amdahl、Cache/AMAT、DRAM扩展刷新、多体交叉、流水线/Flynn/RISC-CISC等均待核。原反补移码、全部数值例和现代硬件细节未在本轮逐项复核,不再宣称全部公式与算例已复算。逐项支持范围见核查表。