第三章一直是《计算机组成原理》考试的重灾区,也是拉开分数差距的关键章节。白中英这本教材的第三章《存储系统》更是集概念、计算、设计于一体,很多同学卡在这一章的原因,不是看不懂书,而是看到课后题不知道从哪下手。这篇内容不给你一句一句誊写标准答案,而是把这个章节常考的题型、背后的原理、解题的通用套路全部拆开,让你拿到任何一道课后题都能找到对应的解法路径。
全文围绕我这些年反复刷这章题目总结出来的经验展开,配合典型例题的思维过程,重点解决“为什么这么算”“从哪里切入”的问题。适合正在啃白中英第三章、期末复习不知道怎么抓重点、或者考研想系统过一遍存储系统考点的同学参考。
1. 第三章整体框架与考点分布
1.1 存储系统这一章的知识地图
白中英第三章的编排思路很清晰,从半导体存储器出发,一路推进到主存组织、Cache、虚拟存储和外存。课后题也基本遵循这个脉络,但考试不会平均发力,核心集中在三块:半导体存储器的扩展计算、Cache的映射与性能计算、虚拟存储器的地址变换。
把整章知识点串一遍,其实就是一个路子:存储器的本质是按照地址存取数据。围绕“地址怎么给、数据怎么走、速度怎么提、容量怎么扩”,展开的所有小节都是这四个问题的不同变体。
半导体随机存储器部分考察的核心是RAM芯片的工作原理、地址译码方式、字扩展与位扩展的比例推算。这个部分偏重数字电路基础,考的是对片选线、地址线、数据线数量的精确计算。
主存与CPU连接部分的核心是芯片怎么拼接成主存系统,地址总线、数据总线、控制信号如何分配,尤其是片选逻辑的推导,这是多数学生第一次接触“硬件连线”思维的地方。
Cache部分的重心是三种映射方式(直接映射、全相联映射、组相联映射)的地址结构划分,以及命中率、平均访问时间的计算。这块是客观题和计算题的高频考区,理解映射实质是“Cache的行号怎么从主存地址中截取”。
虚拟存储器部分以页式管理为核心考点,页表、快表(TLB)、地址变换过程是必考内容。段式和段页式虽然也会出现,但频率明显低于页式。外存部分多为概念性选择题,磁盘容量、数据传输率的计算偶尔出现。
1.2 从历年真题和课后题反推的考点权重
- 存储器扩展计算:约25%的出题概率,大题小题都可能出现,属于必须拿满的送分题。
- Cache相关计算:约30%的出题概率,平均访问时间、E值、映射方式三者组合出题,是最容易出综合题的区域。
- 虚拟存储器地址变换:约20%的出题概率,重点考察页号与页内偏移的拆分、页表查表流程。
- SRAM/DRAM工作原理:约15%的出题概率,以简答题为主,尤其是DRAM刷新的原因和方式。
- 概念辨析与磁盘计算:约10%,零散出现在选择题、填空题里。
从复习投入比来看,先拿下存储器扩展和Cache计算,就能保住这章大半的分数。而这两部分的全部解题技巧,总结下来其实就只有几套固定的运算框架,下面一一展开。
2. 存储器扩展计算:从芯片到主存的完整推导
2.1 SRAM与DRAM:原理差异决定题目方向
课后题第一类基础题一定是围绕RAM芯片展开的,SRAM和DRAM的对比几乎是必考。SRAM用触发器存储信息,速度快,不需要刷新但集成度低;DRAM靠电容上的电荷存储,电容会漏电,必须周期性刷新。
关于DRAM刷新,最容易被问到的一个点是“刷新与重写的区别”。刷新是定期按行将存储信息读出再写入,以恢复电容电荷,行地址由刷新地址计数器提供;重写是CPU在写操作时根据输入数据对存储单元进行写入。刷新对CPU透明,不改变存储内容,重写是正常的信息交换。答题时能把这个区别讲清楚,简答题的完整分基本就能拿到。
DRAM的刷新方式有三种:集中刷新、分散刷新、异步刷新。集中刷新有一个“死区”问题,期间CPU无法访问主存;分散刷新把刷新操作分散到每个存取周期里,无死区但加长了存取周期;异步刷新是两者折中,既分散又集中。课后题如果要你画三种方式的时序图,记住一个判断口诀:看一个刷新周期里访存请求被阻塞的情况。
2.2 地址线、数据线与芯片容量:第一道计算门槛
几乎每一道存储器扩展题,第一步都是明确一个公式:芯片容量 = 2的地址线次方 × 数据线条数。
例如给定一个8K×8位的芯片,8K意味着需要13条地址线(2的13次方等于8192),8位则对应8条数据线。如果芯片是16K×1位,就需要14条地址线和1条数据线。这道换算关系熟练到不要思考,因为后面整题的计算都建立在这上面。
一个很实用的换算表我直接整理出来,做题时对照即可:
| 芯片容量 | 地址线数 | 数据线数 | 说明 |
|---|---|---|---|
| 1K×8 | 10 | 8 | 2的10次方 = 1024 |
| 2K×8 | 11 | 8 | 2的11次方 = 2048 |
| 4K×8 | 12 | 8 | 2的12次方 = 4096 |
| 8K×8 | 13 | 8 | 2的13次方 = 8192 |
| 16K×8 | 14 | 8 | 2的14次方 = 16384 |
| 64K×8 | 16 | 8 | 2的16次方 = 65536 |
注意,如果芯片数据位不足,比如16K×1位要做成16K×8位的存储体,需要8片芯片位扩展并行工作,地址线不变,数据线从1条变成8条。
2.3 字扩展与位扩展:三步算出扩展比例
课后题最常见的题型是:使用给定规格的芯片,构成指定容量的主存,问需要多少芯片、如何连接。
这类题的通用解题步骤我总结为三步:
第一步,算总容量与单价芯片容量的比值。比如用8K×8的芯片构建64K×8的主存,先算总容量是64K,芯片容量是8K,比值是8,这个8就是芯片数量。
第二步,判断需要字扩展还是位扩展。如果目标数据位等于芯片数据位,只需字扩展,即片选线区分不同的芯片组,数据线直接并联;如果目标数据位大于芯片数据位,要先位扩展再将各组串联。
第三步,画连线图时厘清三组信号:地址线低位的连到芯片地址端,高位地址通过译码器产生片选信号,数据线根据位扩展规则决定直连或分组。
举一个推导实例:用1K×4位的SRAM构成4K×8位的存储器。芯片容量1K,目标容量4K,需要4倍的字扩展;数据位4位,目标8位,需要2倍的位扩展。总芯片数等于4乘以2等于8片。具体排布时,每两片一组做位扩展形成1K×8的单元,四组再做字扩展形成4K×8。每组需要10条片内地址线,剩余2条高位地址线经过2-4译码器分别接四组的片选端。
这类题最容易出错的地方是搞混哪些地址线进芯片、哪些地址线进译码器。判断标准只有一条:片内地址线的数量取决于芯片容量,不是主存容量。芯片能寻址多少单元,就需要多少条低位地址线,其余的都算高位地址线分配给片选。
2.4 地址范围推断:从连线图反推起始地址和终止地址
有些课后题会给出一张连接图,要求写出每个芯片组的地址范围。这种题有一定套路:先确定每组芯片用到的低位地址线位数n,那么每组的地址空间大小就是2的n次方。再看该组的片选信号来自哪条高位地址线,根据高位的组合确定基地址。
踩坑提醒:如果译码器的输出低电平有效,多路复用时要格外注意片选信号与译码输出的对应关系。实际做题时我习惯先把各高位地址线写成二进制组合,再一次性补上低位地址的全0到全1,这样地址范围就不会漏算或者错位。
比如一个4K×8的存储器用2片2K×8芯片扩展,2K需要11条片内地址线,A0到A10进芯片,A11作为高位地址线。当A11为0时选中第一片,地址范围是0000 0000 0000到0111 1111 1111(十六进制000H到7FFH);当A11为1时选中第二片,地址范围是800H到FFFH。写答案时十六进制和二进制都要标注清楚,评分时通常两种都给分,但用错进制导致数值不对就直接没了。
3. 主存与CPU连接:抓住三组信号就不会乱
3.1 数据总线、地址总线、控制总线的职能分配
主存和CPU连接这块,课后题的重点是系统总线中三类信号线的接法。地址总线是单向的,由CPU输出到主存,用来定位存储单元;数据总线是双向的,传输实际读写的数据;控制总线里最重要的是读信号、写信号和片选信号,这三者的时序配合决定一次完整的访存操作。
答题时经常要求写出某根信号线的名称和来源,核心口诀是“地址从CPU来,数据两边走,控制看方向”。如果是读操作,CPU发地址、发读命令,主存将数据放到数据总线上;如果是写操作,CPU发地址和数据,再发写命令,主存在写命令有效期间将数据锁存入存储单元。
3.2 片选逻辑设计:画对译码器就赢了一半
片选逻辑是主存连接题里的决胜点。多芯片组成主存时,不可能让所有芯片同时工作,必须通过片选信号选中目标芯片。常见的实现方式是高位地址线经过译码器,输出分别连接到各芯片的片选端。
做题时的推导逻辑是这样的:先确定每片芯片的容量,算出低位地址线位数;然后看总容量需要的地址线位数;两者的差值就是片选地址线位数;最后根据片选线位数选择译码器规格。2条高位线用2-4译码器,3条用3-8译码器,依此类推。
还有一个高频考点是多片芯片高位地址部分重叠时的地址冲突问题。典型的错误场景是两片芯片的片选信号由不同高位地址线单独引出,导致某段地址区间被两个芯片同时响应。如果课后题要求你判断该系统是否有地址重叠,你要做的就是写出每片芯片的有效地址区间,看是否有交集。
3.3 读写时序图的答题套路
涉及时序的题目通常给出读周期和写周期波形,要求指出建立时间、保持时间、访问时间等关键参数。这类题的关键是理解各信号有效沿的先后关系:地址先稳定,然后片选有效,再然后读或写信号有效,数据在合适的时刻出现在总线上。
答题时有一个容易混淆的点:读操作里,读信号的有效沿位于地址建立之后,数据会在读信号有效后经过一段访问时间才出现在数据总线上;写操作里,数据通常在写信号有效前就已经放在总线上,并在写信号失效前保持稳定。把数据有效窗口写在正确的区间里,这题基本不会丢分。
4. Cache计算题:三个公式吃透所有变形
4.1 命中率与平均访问时间:这是绕不开的基础
Cache章节的计算题,核心有两个公式。第一个是平均访问时间公式:
Ta = H × Tc + (1 - H) × Tm
其中H是命中率,Tc是Cache访问时间,Tm是主存访问时间。这个公式的理解关键是“命中就走Cache,未命中先访问主存,再把数据调入Cache”——如果题目说同时访问Cache与主存,公式会变化,后面详述。
第二个是Cache-主存系统的加速比:
加速比 = Tm / Ta,或相对加速比 = 原始访存时间 / 平均访存时间
题目如果给你命中率、两级访存时间,直接代入即可。课后题常见的一个变形是先计算未命中率,再求平均访问时间,最后问“采用Cache后速度提升了几倍”。此类题拿到分数不难,难点在审题。
必须吐槽一个反复出现的坑:很多题目给的是Cache访问时间Tc和主存访问时间Tm,但大家求Ta时容易把Tm当作“未命中时的额外开销”,其实未命中时要先耗Tc再去主存取,这里有两种等价的算法。直接按公式索引算,就不会犯这个错。
4.2 直接映射、全相联、组相联的地址结构划分
Cache的三种映射方式是考点核心,考试常让你划分主存地址的标记位、索引位、块内偏移位。先说概念区分,三种方式的差别在于“主存块可以放入Cache的哪些行”:
| 映射方式 | 灵活性 | 索引/组号位数 | 标记位比较 | 替换策略 |
|---|---|---|---|---|
| 直接映射 | 最不灵活 | Cache行数决定索引位 | 只比标记 | 无需替换 |
| 全相联映射 | 最灵活 | 无索引位 | 全部标记比较 | 需替换算法 |
| 组相联映射 | 折中 | Cache组数决定组号位 | 组内标记比较 | 需替换算法 |
实际做题时,地址划分的方法是一致的,最终是要算出三个字段的位宽。块内偏移字段由块大小决定;索引字段由Cache的行数或组数决定;剩下的高位就是标记字段。
举例来说,主存容量64K,Cache容量4K,块大小128字节。首先块内偏移位等于log2(128)等于7位。Cache行数等于4K除以128等于32行,索引位等于log2(32)等于5位。主存地址总位数等于log2(64K)等于16位,所以标记位等于16减7减5等于4位。
如果是2路组相联,Cache组数等于行数除以2,索引位变成log2(16)等于4位,标记位相应变成5位。这些字段划分一旦搞清,后面的命中判断就顺理成章。
4.3 求标记、命中过程与Cache容量计算
判断一次访问是否命中,本质是把主存地址按映射规则拆解,用索引位找到Cache对应行,再比较标记位是否相同,如果相同且有效位为1则命中,否则未命中。
很多同学做这类选择题容易在标记位比较上出错,原因是忘了看有效位。Cache刚上电时所有行都是无效的,即使标记位恰巧相同,也不能算命中。课后题若给出“初始状态Cache为空”的描述,从头到尾任何一次访问的标记相同都不能算命中,必须等第一次调入后再判断。
Cache总容量计算题也很常见,总容量通常包括存储容量、标记存储容量和有效位等辅助位。不要只算数据部分。正确公式是Cache总容量 = 行数 × (块大小 + 标记位 + 有效位1),有些题目还会加脏位,若写入策略是写回法则需要加脏位。实战中我见过不少考生把标记位和有效位漏掉,一扣就是整道题的分。
4.4 命中率计算的顺序敏感型题目
若干题目会给出一串按地址访问的序列,要求统计命中率。这种题非常考验耐心,因为它按二进制的块号逐次判断,而且确定块号需要先按块大小做除法或位截断。
最稳妥的做法是画一个Cache行状态表,一行行模拟每一步的调入、命中、淘汰。画表时把每一步的行号、标记、是否命中列清楚,这样即使中途算错也能快速查。替换算法如果是LRU,需要记录每个Cache行的最近使用情况,模拟时注意更新优先级。
实操中我发现一个可以显著减少出错的小技巧:先把访问序列里的每个地址换算成(块号,块内偏移),再用块号来判断。直接把地址折成二进制再做字段切分,容易在长地址的计算里看漏位。
5. 虚拟存储器计算:页式管理是重点
5.1 页式地址变换的完整流程
虚拟存储器的题目最常考页式管理。页式地址变换的关键在于把逻辑地址拆成两部分:虚页号 + 页内偏移。虚页号用于查页表,得到物理页号,再与页内偏移拼接,得到物理地址。
课后题常给出页大小2KB、逻辑地址若干、页表内容若干,要求计算物理地址。解题步骤固定:先将逻辑地址转为二进制或十进制,算出虚页号和页内偏移;然后查页表得到对应的物理页号;最后物理地址等于物理页号乘页大小加页内偏移。
如果页大小2KB,页内偏移需要11位。给定一个逻辑地址如3500,除以2048得到虚页号1,余数1452就是页内偏移。查页表得到物理页号后,物理地址等于物理页号乘以2048再加1452。算的时候建议用十进制,先除再乘,步骤清楚不容易乱。
5.2 TLB的命中与缺页处理
引入TLB之后,题目通常会要求说明一次访问存储器的完整过程,以及TLB命中与缺失对访问次数的影响。
TLB命中时,一次逻辑地址到物理地址的变换不需要访问内存中的页表。TLB未命中时,需要额外访问一次内存去读页表,但如果页表项已在内存且页存在,不会产生缺页中断,只是多了一次访存。如果页不在内存,就会引发缺页中断,从磁盘调入页,这个过程的时间开销远大于前两者。
答题要分情况表述清楚:TLB命中、TLB未命中但页命中、缺页三个层次。我把这个层次整理成判断顺序:先查TLB,未命中则查页表,页表显示页不在内存则缺页。考试问你“一次访问需要几次访存”时,多数题目默认页表在内存中,TLB命中为1次,不命中为2次,缺页另算。
5.3 段式与段页式的考察方式
段式和段页式的课后题通常以简答题为主,要求说明地址结构、变换过程和特点。段式地址分为段号和段内偏移,查段表获得段基地址,加偏移得到物理地址;段页式先把逻辑地址分为段号、段内页号、页内偏移,查段表获得页表起始地址,再查页表获得物理页号。
易错点是段页式的地址拼接。有些同学在计算时忘记段表项给出的是页表基地址而非物理基地址,导致结果完全算错。答题时写“查段表得到页表地址,再查页表得到物理页号”这个双层转换过程,逻辑就完整了。
6. 典型课后题型归类与解题套路
6.1 存储器扩展题:三步法解决百分之九十
把全章题目过一遍,存储器扩展题无论怎么变,底层就是三步:先算芯片数,再定地址线和数据线,最后连片选。写答案时把每一步的计算过程都列出来,尤其是“因为芯片容量为多少,所以片内地址线为多少位,高位地址线经过什么译码器产生片选信号”这样的因果链。
工程上有个原则叫问题追踪,写题也一样,每个数字都要有来源。空泛地写出一个芯片数,老师只能当作你蒙对的。
6.2 Cache映射题:先画位段再动手
Cache相关计算题的通用解法是先画出地址位段分配图,再根据映射方式灵活改变索引位的位置。直接映射的索引位紧接着块内偏移位;组相联的组号位也在低位,但组内行数越多,索引位越少,标记位越多;全相联没有索引位,只有标记和块内偏移。
做题顺序固定为:第一步算块内偏移位数;第二步算行数或组数求索引位数;第三步用总地址位数减去前两者得标记位数;第四步代入题目给的访问序列验证命中率。
6.3 地址计算题:进制转换是基本功
地址计算题的最大变数不是原理,而是进制。十六进制地址的加减乘除和二进制位截断频繁混用,很多人在进制转换时出错。我在做题时的习惯是全部先转成二进制来做字段切分,再根据需要转成十六进制写答案。
当给你一个十六进制地址如3E4FH,先说清楚块大小后立刻想到右移若干位得到块号。右移位数等于块内偏移位数。用二进制算一次,再回十六进制核对,基本稳。
7. 常见错误与避坑指南
7.1 课后题最容易踩的五个坑
这章的知识点密集且环环相扣,做题踩坑太常见了。我根据批改作业和学生提问的经验,把高频错误整理成一张表:
| 错误类型 | 错误表现 | 正确做法 | 原因分析 |
|---|---|---|---|
| 混淆地址线与数据线 | 用芯片容量直接当地址线数 | 容量先取对数再定地址线 | 地址线数量与存储单元数相关 |
| 漏算辅助位 | Cache容量只算数据部分 | 计入标记位、有效位、脏位 | 总容量包含控制位 |
| 未命中率用错 | 把1-H代入公式时方向反了 | 明确H是命中率 | 概念辨析不清 |
| 忽略初始状态 | Cache初始为空仍判命中 | 有效位为0时不能命中 | 不清楚上电初始状态 |
| 地址拼接错位 | 页内偏移与页号拼接时多移一位 | 物理页号乘页大小再加偏移 | 位移方向和位数混乱 |
其中漏算辅助位这一项,我见过整整一批人同一个错误:算Cache总容量时只算行数乘以块大小,题目已经明确给了标记位数,愣是没人注意到。这背后其实是对Cache硬件结构理解不深,只记住了数据存储,没有把“Cache行就是一条完整记录”的概念建立起来。
7.2 我对这个章节复习顺序的建议
白中英第三章的内容如果按顺序平推,很容易前两节花光所有时间,第四节以后草草掠过。我建议复习顺序调整为:先吃透Cache计算题,因为这部分最能通过练习拿到确定性分数;然后攻克存储器扩展题,跟Cache计算的共同点是都需要地址位段的切分能力;最后再看SRAM/DRAM原理与虚拟存储器,这两块偏概念和流程记忆。
复习时从课后题反推知识点比从头读书更高效。先把课后题按我前面分的题型归类,再回到课本对应小节专攻公式推导和原理,效果比按页码顺读好得多。每做完一道题,把涉及的核心公式和计算链路写在题的旁边,考前翻一遍错题本就知道整章的框架长什么样。
我个人在后半段复习里还做了一件事,就是给每道错题标出“卡点类型”,到底是公式不熟、概念不清还是计算失误。你会发现,多数人反复错的往往集中在一两个类型上,带着这个诊断去读书,比无差别刷十道新题有用得多。希望这套拆解能帮你少走这些弯路,把第三章变成真正能稳定拿分的一章。