mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4mobile wallpaper 5mobile wallpaper 6
31069 字
85 分钟
存储系统

第四章:存储系统#

本章整理计算机中的存储系统。存储系统在计算机组成原理中占据重要地位,是考研及期末考试的重难点。

要想透彻理解存储系统,需要围绕一条主线和三个核心问题展开:


4.1 存储器概述#

4.1.1 存储器分类与存储系统层次结构#

存储器要解决三个核心矛盾:速度要快、容量要大、成本要低。然而,单一的半导体存储介质无法同时满足这三个要求。

寄存器速度最快但容量极小、成本极高。
外存容量极大、成本极低,但速度极慢。

为了解决这一矛盾,计算机系统采用多级存储层次结构,将不同速度与容量的存储介质有机地结合起来:

flowchart BT L4[外存: 磁盘、SSD、Flash] --> L3[主存: DRAM] L3 --> L2[高速缓存: SRAM] L2 --> L1[寄存器: CPU内部]

在这级结构中,越靠近 CPU,其速度越快、容量越小、每位成本越高越远离 CPU,其容量越大、速度越慢、每位成本越低。通过硬件与操作系统的协同管理,这种结构使得整个存储系统表现出接近寄存器的存取速度,以及接近外存的存储容量。


4.1.2 存储器技术指标#

在存储系统中,主要使用以下四个基本性能指标来衡量其优劣:

  • 存储容量:能保存的二进制信息总量。
  • 存取时间:从接收到读写控制信号和地址开始,到数据被送至数据线上或者存入存储单元所经历的时间。
  • 存取周期:连续两次独立访问存储器之间所需的最小时间间隔。存取周期通常大于存取时间。
  • 存储带宽:单位时间内存储器可传输的最大数据量,单位通常为字节每秒。

4.1.3 核心容量计算公式#

对于存储芯片或存储器,其容量的计算公式通常为:

存储容量=存储单元数×每个存储单元位数\text{存储容量} = \text{存储单元数} \times \text{每个存储单元位数}

例如,规格为 256K×8256\text{K} \times 8 的芯片,表示该芯片拥有 256K256\text{K} 个存储单元,每个单元占 8 位,其总二进制容量为:

256K×8 bit=256KB256\text{K} \times 8 \text{ bit} = 256\text{KB}

对于给定的存储芯片,其容量也可以直接通过引脚上的地址线和数据线条数计算得出:

芯片容量=2地址线根数×数据线位数\text{芯片容量} = 2^{\text{地址线根数}} \times \text{数据线位数}

例如,若某存储芯片具备 20 根地址线、8 根数据线,则其最大可寻址空间为 220=1M2^{20} = 1\text{M} 个存储单元,数据宽度为 8 位,对应的总容量为:

220×8 bit=1MB2^{20} \times 8\text{ bit} = 1\text{MB}


4.1.5 主存中数据的存放#

在主存中,通常采用按字节编址的方式,即每个内存物理地址都对应一个字节。然而,计算机在处理 16 位、32 位或 64 位等多字节数据时,必须决定这些字节在连续内存地址中的排列次序。

大端与小端存储模式#

多字节数据存入内存时存在两种不同的字节布局方式:

方式低物理地址存放的字节高物理地址存放的字节规律特点
大端方式最高有效字节最低有效字节符合人类的书写与阅读直觉
小端方式最低有效字节最高有效字节方便机器直接读取低位数据

例如,一个 32 位的十六进制数据 0x12345678(其中最高有效字节为 12H,最低有效字节为 78H),如果从物理地址 1000H 开始存放,在两种方式下的分布如下:

大端方式:
1000H: 12H
1001H: 34H
1002H: 56H
1003H: 78H
小端方式:
1000H: 78H
1001H: 56H
1002H: 34H
1003H: 12H
大端与小端判定技巧

判断是大端还是小端,最核心的技巧是观察最低物理地址处存放的是高有效字节还是低有效字节

  1. 最低物理地址放高字节(12H\rightarrow 大端
  2. 最低物理地址放低字节(78H\rightarrow 小端

4.2 半导体存储器#

半导体存储器是构建主机内存储系统的基础介质,主要分为随机存取存储器和只读存储器两大类。

SRAM#

SRAM 依靠双稳态触发器电路来保存信息。只要电源正常供电,触发器两端的状态就能锁存,信息不会丢失。

  • 物理特点:存取速度快、不需要刷新、集成度低、功耗大、生产成本高。
  • 典型应用:常用于构建 CPU 内部或紧邻 CPU 的高速缓存。

DRAM#

DRAM 依靠栅极电容上的电荷积聚来保存信息。由于电容本身存在漏电现象,电容上的电荷在短时间内会流失,因此必须在信息丢失前定期对电容进行电荷补偿,这一过程称为刷新。同时,由于 DRAM 在读取数据时会将电容电荷泄放,这属于破坏性读出,因此读取后必须执行重写(恢复写入)操作。

  • 物理特点:集成度高、每位成本极低、存取速度慢于 SRAM、需要额外的刷新控制电路。
  • 典型应用:通常用于构建大容量的主存储器。

SRAM 与 DRAM 的对比表#

下表总结了 SRAM 与 DRAM 的核心技术差异,是考试中的常考基础点:

对比项目SRAMDRAM
存储介质双稳态触发器栅极电容电荷
速度较慢
集成度
每位成本
是否需要刷新不需要需要(定期刷新与读后重写)
主要应用场景高速缓存主存储器
记忆口诀

SRAM 快且贵,专做高速缓存;DRAM 慢且密,专做系统主存。

ROM#

ROM 是一类非易失性随机存储器。在系统掉电或断电后,ROM 内部所存储的数据信息不会丢失。

  • 应用场景:常用于保存系统引导程序、固件、以及主板的系统输入输出系统。

闪速存储器(Flash)#

闪速存储器是一类可进行电擦除并重新编程的非易失性半导体存储器。

  • 物理特点:读取速度较快,但写入前必须先进行擦除操作,导致其写入与擦除速度较慢。同时,闪速存储器存在擦写寿命限制。
  • 应用场景:常用于固态硬盘、U 盘以及嵌入式设备中作为存储介质。

4.3 主存的组织及与 CPU 的连接#

主存储器与 CPU 之间的数据交互是通过系统总线中的三类信号线实现的:

  • 地址线(单向):由 CPU 指向存储器,用于指定 CPU当前读写操作的目标存储单元物理地址。
  • 数据线(双向):在 CPU 与存储器之间双向传输读出或写入的数据二进制流。
  • 控制线(输入/输出):控制信号包括读控制、写控制以及片选控制信号,用于协调读写操作的精确时序。

4.3.1 基本读写操作流程#

在系统总线层面,一次基本的读写操作流程如下:

  • 读操作流程
    1. CPU 将目标存储单元的物理地址送上地址总线。
    2. CPU 发出有效的读控制信号与片选控制信号。
    3. 主存储器译码后,从对应单元取出数据并送上数据总线。
    4. CPU 在时钟上升沿从数据总线上读取数据并存入内部寄存器。
  • 写操作流程
    1. CPU 将目标存储单元的物理地址送上地址总线。
    2. CPU 将待写入的数据送上数据总线。
    3. CPU 发出有效的写控制信号与片选控制信号。
    4. 主存储器在控制信号作用下,将数据线上的数据写入指定存储单元。
DRAM 地址线复用

在大规模存储器设计中,为了减少芯片引脚数,DRAM 芯片通常采用地址线复用技术。即行地址和列地址通过相同的引脚分时传送,这使得 DRAM 芯片的地址引脚数可以减少为原来的一半。


4.3.2 存储器的扩展#

由于单个存储芯片的字数或位数往往无法直接满足 CPU 对系统存储器容量和数据宽度的要求,因此需要使用多片存储芯片进行组合扩展。

位扩展法(宽度扩展)#

当单个芯片的字数(存储单元数)满足系统要求,但其位数(数据线宽度)小于系统数据总线宽度时,采用位扩展法。

  • 连接规律:将所有芯片的地址线、读写控制信号线和片选信号线分别并联连接到 CPU 对应的总线上。每片芯片的数据线分别连接到 CPU 数据总线的不同数据位上,使多片芯片共同拼接成所需的数据位宽。
  • 所需芯片数位扩展倍数=系统要求的数据位数单片芯片的数据位数\text{位扩展倍数} = \frac{\text{系统要求的数据位数}}{\text{单片芯片的数据位数}}

字扩展法(容量扩展)#

当单片芯片的数据位数满足系统要求,但其字数(存储单元数)小于系统所需的总字数时,采用字扩展法。

  • 连接规律:将所有芯片的地址总线低位、数据总线以及读写控制信号线并联连接。利用地址总线的高位经过译码器产生不同的片选信号,分别连接到各个芯片的片选引脚上,使得任意时刻只有符合当前高位地址的芯片被选中工作。
  • 所需芯片数字扩展倍数=系统要求的总字数单片芯片的字数\text{字扩展倍数} = \frac{\text{系统要求的总字数}}{\text{单片芯片的字数}}

字位联合扩展法#

当系统所需的字数和位数均大于单片芯片的规格时,先通过位扩展将多片芯片组合为满足位宽要求的芯片组,再用多组芯片通过字扩展构成所需总字数的存储器。

  • 总芯片片数计算总片数=字扩展倍数×位扩展倍数=(目标总字数单片字数)×(目标数据位数单片位数)\text{总片数} = \text{字扩展倍数} \times \text{位扩展倍数} = \left(\frac{\text{目标总字数}}{\text{单片字数}}\right) \times \left(\frac{\text{目标数据位数}}{\text{单片位数}}\right)

4.4 并行主存系统#

由于 CPU 的运行速度远快于主存的读取速度,为了缓解“主存瓶颈”问题,可以采用多模块组成的并行主存系统,使多个模块并行或交叉工作。

高位交叉编址(顺序分配方式)#

高位地址决定当前的存储模块号,低位地址决定模块内的单元地址。

  • 地址结构主存地址=高位模块号 + 低位体内地址\text{主存地址} = \text{高位模块号} \ + \ \text{低位体内地址}
  • 工作特点:相邻的物理地址分布在同一个存储模块中。当程序顺序执行时,CPU 会持续访问同一个模块,而其他模块处于闲置状态,无法实现多模块的并行存取,通常仅用于扩展主存容量。

低位交叉编址(交叉分配方式)#

低位地址决定当前的存储模块号,高位地址决定模块内的单元地址。

  • 地址结构主存地址=高位体内地址 + 低位模块号\text{主存地址} = \text{高位体内地址} \ + \ \text{低位模块号}
  • 工作特点:相邻的物理地址分布在不同的存储模块中。由于程序访问具有局部性,CPU 连续访问的指令或数据会均匀分布在不同的模块上,这使得多个存储模块可以采用流水线式的轮流启动机制,从而显著提高主存的整体带宽。
低位交叉存储器无冲突条件及时间计算

设低位交叉存储器的模块数为 mm,每个模块的存储周期为 TT,总线传输周期(即相邻两次启动存储器的时间间隔)为 τ\tau。为了使多模块能无冲突地流水线式工作,模块数 mm 必须满足: mTτm \ge \frac{T}{\tau} 连续读取 nn 个字时,所耗费的总存取时间为: t=T+(n1)τt = T + (n - 1)\tau


4.5 高速缓冲存储器(Cache)#

Cache 是位于 CPU 与主存之间的高速、小容量半导体存储器,用于解决 CPU 与主存速度不匹配的问题。

4.5.1 程序局部性#

Cache 的引入能够获得成功的理论基础是程序的局部性原理

  • 时间局部性:如果程序中某条指令或某个数据被访问,在不久的将来它很可能再次被访问。例如循环结构中的指令、循环控制变量。
  • 空间局部性:如果某个存储单元被访问,在不久的将来其相邻的存储单元也很可能被访问。例如数组的顺序遍历、顺序执行的指令段。

4.5.2 Cache 的基本概念#

主存与 Cache 之间是以数据块为单位进行数据交换的(主存中的“块”在 Cache 中称为“行”)。

  • Cache 命中:当 CPU 发出读请求时,所需的数据块已在 Cache 中,CPU 直接高速访问 Cache 即可,无需访问主存。
  • Cache 缺失:所需数据块不在 Cache 中,CPU 必须访问主存读取数据,并同时将该数据块调入 Cache。

4.5.3 地址映射#

当 CPU 给出主存物理地址时,Cache 的硬件控制器必须能够将该主存地址转换为 Cache 内部的行地址,并判断该主存块是否已经装入 Cache。

主存物理地址通常被拆分为以下三个基本字段:

字段名称作用
标记(Tag)存放在 Cache 每一行的标记位中,用于与主存地址的高位比对以判断是否命中
索引(Index)用于在 Cache 中定位可能存放该数据块的 Cache 行或组
块内地址(Offset)用于在选中的数据块内定位具体的字或字节

直接映射#

主存中的每个数据块只能映射到 Cache 中唯一一个固定的行。

  • 映射关系Cache 行号=主存块号modCache 总行数\text{Cache 行号} = \text{主存块号} \bmod \text{Cache 总行数}
  • 优缺点:硬件设计最简单,地址变换速度快;但由于映射关系固定,极易产生块冲突,导致 Cache 命中率下降。

全相联映射#

主存中的任意数据块可以装入 Cache 中的任意一行。

  • 映射关系:主存块可以放置在 Cache 的任何空闲行中。
  • 优缺点:冲突概率低,Cache 空间利用率和命中率高;但由于需要同时比对 Cache 所有行的标记,硬件电路复杂,成本高。

组相联映射#

将 Cache 所有行分为若干个大小相同的“组”,主存块先通过模运算映射到唯一确定的组,但在该组内部的各行之间可以任意放置(即“组间直接映射,组内全相联映射”)。

  • 映射关系Cache 组号=主存块号modCache 总组数\text{Cache 组号} = \text{主存块号} \bmod \text{Cache 总组数}
  • 优缺点:冲突概率低于直接映射,硬件实现难度与成本又低于全相联映射,是现代处理器中最常用的折中方案。

4.5.4 替换算法与写入策略#

核心替换算法#

当 Cache 对应位置已满,而 CPU 又需要调入新数据块时,必须腾出某个已有的旧数据块,这由替换算法决定:

  • 随机算法:随机选择一个 Cache 行进行替换。实现简单,但未考虑程序访问规律,命中率低。
  • 先进先出算法:优先替换最先调入 Cache 的数据块。同样未考虑局部性规律,可能出现“贝拉迪异常”现象。
  • LRU 算法:优先替换近期最长一段时间未被访问过的数据块。该算法高度契合时间局部性原理,是实际系统和考试题中很常见的近似最优替换策略,但不保证在所有访问序列下命中率最高。
  • 最不经常使用算法:优先替换历史上累计访问次数最少的数据块。
LRU 模拟技巧

考试中若要求手动模拟 LRU 替换过程,只需为每个 Cache 行维护一个“新鲜度”计数器或直接记录访问顺序,每次替换时挑出距离当前时刻最久未被触及的行即可。

Cache 写操作策略#

当 CPU 执行写操作时,若 Cache 命中,为了保证 Cache 与主存中的数据一致性,通常采用以下写策略:

  • 全写法:在写 Cache 的同时,将数据同步写入主存中。该方法能够始终保证主存与 Cache 数据绝对一致,控制简单;但会引起频繁的主存写操作,降低了系统的整体写入效率。
  • 写回法:写操作时仅修改 Cache 对应的行,并为该行设置一个脏位标记为 1。只有当该 Cache 行在未来被替换出 Cache 时,硬件才根据脏位状态决定是否将修改过的数据写回主存。该方法显著减少了主存写次数,但控制逻辑复杂,且在写回前主存与 Cache 数据存在暂时不一致。

若写操作时 Cache 缺失,也有两种处理策略:

  • 写分配法:先将主存中的目标块调入 Cache,然后修改 Cache。常与写回法配合使用。
  • 非写分配法:直接在主存中修改数据,不将数据块调入 Cache。常与全写法配合使用。

4.6 虚拟存储器#

虚拟存储器是计算机系统为了给程序提供一个极大、连续的虚拟地址空间,而在主存和外存之间构建的软硬件统一管理系统。

4.6.1 虚拟存储器的工作原理#

  • 程序运行时使用的是虚拟地址(逻辑地址),而不是物理主存的真实地址。
  • CPU 访问数据时,由硬件和操作系统协同将虚拟地址自动转换为物理地址
  • 当前运行所需的页面调入主存储器中,暂时不用的页面存放在外存储器(磁盘/SSD)中。当访问的页面不在主存时,触发缺页异常,由操作系统负责从外存调度页面。

4.6.2 虚拟存储器的地址映射与变换#

页式虚拟存储器将虚拟空间划分为固定大小的,将物理主存空间划分为大小完全相同的页框

  • 虚拟地址结构虚拟地址=虚拟页号 + 页内偏移量\text{虚拟地址} = \text{虚拟页号} \ + \ \text{页内偏移量}
  • 物理地址结构物理地址=物理页号 + 页内偏移量\text{物理地址} = \text{物理页号} \ + \ \text{页内偏移量}
  • 地址转换核心:通过进程的页表查出“虚拟页号”到“物理页号”的映射关系,而页内偏移量在转换前后保持绝对不变。

4.6.3 页式虚拟存储器#

页表保存在主存中,每个虚拟页在页表中对应一个页表项,通常包含以下控制位:

  • 有效位(装入位):为 1 表示该页面已在主存中,可直接访问;为 0 表示不在主存,会触发缺页中断。
  • 脏位(修改位):为 1 表示该页在主存中被修改过,换出主存时必须写回外存。
  • 引用位(使用位):用于页面置换算法(如 LRU)统计页面是否被访问过。

4.6.4 TLB 的加速作用#

由于页表保存在主存中,CPU 每次进行数据存取时,都必须先访问一次主存中的页表以获取物理页号,然后再访问一次主存存取数据。这种“两次访存”机制严重拖慢了系统速度。

为了加速地址转换,引入了TLB

工作机制#

TLB 是一个小容量、高速度的专用 SRAM 芯片,用于缓存进程页表中最常用的一部分页表项(虚拟页号到物理页号的映射)。

CPU 给出虚拟地址
首先并行查找 TLB
├─ 命中 ──→ 直接得到物理页号 ──→ 访问Cache/主存 (仅需一次物理访存)
└─ 缺失 ─→ 查找主存页表
├─ 页表命中 ──→ 写入TLB并得到物理页号 ──→ 访问Cache/主存
└─ 页表缺失 ──→ 触发缺页异常 ──→ 操作系统进行页面置换
TLB 的加速作用

TLB 的引入显著缩短了虚拟地址到物理地址的转换时间,使得在绝大多数情况下,地址转换对 CPU 执行效率的影响可以忽略不计。


4.7 Cache 与虚拟存储器的对比#

虽然 Cache 与虚拟存储器都是利用局部性原理来构建的存储层次结构,但它们在设计目的和实现细节上存在本质区别:

对比维度高速缓冲存储器(Cache)虚拟存储器
主要设计目的提高 CPU 访存的速度扩大程序的虚拟地址空间
数据源与下一级主存是下一级,数据源自主存外存是下一级,数据源自外存
管理主体纯硬件电路控制器完成,对程序员完全透明硬件与操作系统协同完成,对应用程序员透明
缺失代价极低(仅需访问主存,几十个 CPU 周期)极高(需访问慢速外存,数十万个 CPU 周期)
映射与粒度以主存“块”(一般为几十字节)为单位以“页”(通常为几 KB)为单位
Cache 与虚拟存储器的本质区别

Cache 是主存的加速层,虚拟存储器是主存的扩展层。


4.8 核心逻辑链条总结#

本章的所有设计思想和技术指标,最终均可以通过以下最核心的逻辑链条进行贯通:

CPU 运算速度极快  主存速度较慢  引入 Cache 加速访存\text{CPU 运算速度极快} \ \longleftrightarrow \ \text{主存速度较慢} \ \Longrightarrow \ \text{引入 Cache 加速访存}

主存物理容量有限  进程地址空间需求大  引入虚拟存储器扩展空间\text{主存物理容量有限} \ \longleftrightarrow \ \text{进程地址空间需求大} \ \Longrightarrow \ \text{引入虚拟存储器扩展空间}

主存访问开销较大  页表查询需要访存  引入快表 TLB 加速地址转换\text{主存访问开销较大} \ \longleftrightarrow \ \text{页表查询需要访存} \ \Longrightarrow \ \text{引入快表 TLB 加速地址转换}

存储系统通过这一系列“寄存器 \rightarrow Cache \rightarrow 主存 \rightarrow 外存”的巧妙层次架构,在速度、容量和成本之间取得了完美的平衡。


4.9 历年期末真题分类详解#

本节汇总了历年期末考试中关于第四章存储系统的全部真题,进行系统化分类与详尽解析。

4.9.1 存储器分类与技术指标#

Q1 (南阳理工学院 2024-2025 学年第 2 学期期末试卷(C 卷) 填空题)#

题干:若某存储器存储周期为 250 ns250\text{ ns},每次读出 1616 位,该存储器的数据传输速率是________。

解析: 数据传输速率即为存储带宽。计算公式为: 数据传输速率=每次读出位数存储周期\text{数据传输速率} = \frac{\text{每次读出位数}}{\text{存储周期}} 已知每次读出 16 位,即 16 bit=2 B16\text{ bit} = 2\text{ B}。存储周期为 250 ns=250×109 s250\text{ ns} = 250 \times 10^{-9}\text{ s}。 代入数据计算: 数据传输速率=2 B250×109 s=2250×109 B/s=0.008×109 B/s=8×106 B/s=8 MB/s\text{数据传输速率} = \frac{2\text{ B}}{250 \times 10^{-9}\text{ s}} = \frac{2}{250} \times 10^9 \text{ B/s} = 0.008 \times 10^9 \text{ B/s} = 8 \times 10^6 \text{ B/s} = 8 \text{ MB/s} 若以位为单位,则是 64 Mbit/s64\text{ Mbit/s}。一般默认以字节每秒(B/s)为单位回答。

答案8 MB/s8\text{ MB/s}(或 8×106 B/s8 \times 10^6\text{ B/s})。

Q2 (2022-2023-2考试 判断题)#

题干:半导体 RAM 信息可读可写,且断电后仍能保持记忆。( )

解析: 半导体随机存储器 RAM 是易失性存储器,断电后其内部存储的数据会全部丢失。断电不丢失数据的是非易失性存储器(如 ROM、Flash)。

答案:错。

Q3 (2022-2023-2考试 判断题)#

题干:双端口存储器可以同时访问同一区间、同一单元。( )

解析: 双端口存储器具有两套相互独立的读写控制线路,允许在同一时刻访问主存。只要两个端口不是同时对同一个单元进行写入操作,就允许同时访问。

答案:对。


4.9.2 主存中数据的存放#

Q4 (南阳理工学院 2024-2025 学年第 2 学期期末试卷(C 卷) 选择题)#

题干:以下哪种存储方式将数据的最高位有效字节(MSB)存储在最低地址内存单元?( )

A. 大端方式 B. 小端方式 C. 中端方式 D. 随机方式

答案:A

解析

  • A [正确]:大端方式将多字节数据的高位字节(最高有效字节)存放在低物理地址单元中,而将低位字节存放在高物理地址单元中。这与人类通常的阅读书写顺序(从左到右)是一致的。
  • B [错误]:小端方式与大端方式相反,它将多字节数据的低位字节(最低有效字节)存放在低物理地址单元中,而将高位字节存放在高物理地址单元中。
  • C [错误]:在计算机系统结构中没有所谓的“中端方式”。
  • D [错误]:多字节数据的物理字节存放是有固定逻辑和物理规则的,不可能采用“随机方式”存储。

Q5 (计算机组成原理2020-2021第2学期A 选择题)#

题干:某计算机字长为 32 位,按字节编址,采用小端方式存放数据。假定有一个 double 型变量,其机器数表示为 1122 3344 5566 7788H,存放在 0000 8040H 开始的连续存储单元中,则存储单元 0000 8046H 中存放的是( )。

A. 22H B. 33H C. 77H D. 66H

答案:A

解析

  • A [正确]double 型变量占 8 字节(64 位)。机器数表示为 1122 3344 5566 7788H,其字节从高到低依次为 11H最高有效字节至 88H最低有效字节。采用小端方式存储时,低物理地址存放低位字节,高物理地址存放高位字节。因此,从起始地址 0000 8040H 开始的连续 8 字节单元的存放数据为:

    • 0000 8040H88H
    • 0000 8041H77H
    • 0000 8042H66H
    • 0000 8043H55H
    • 0000 8044H44H
    • 0000 8045H33H
    • 0000 8046H22H
    • 0000 8047H11H

    由上可知,存储单元 0000 8046H 存放的是 22H

  • B [错误]33H 存放于地址 0000 8045H 中。

  • C [错误]77H 存放于地址 0000 8041H 中。

  • D [错误]66H 存放于地址 0000 8042H 中。


4.9.3 芯片参数与存储器扩展#

Q6 (计算机组成原理2020-2021第二学期B 简答题)#

题干:某存储容量为 256MB 的存储器由若干个 4M×8 的 DRAM 芯片构成,则 DRAM 芯片的地址引脚和数据引脚的数量是?( )

解析

  1. DRAM 芯片规格为 4M×84\text{M} \times 8\text{位}
  2. 数据引脚数由芯片的位宽决定,位宽为 8 位,因此数据引脚数为 8 根。
  3. 芯片字数为 4M=2224\text{M} = 2^{22} 个存储单元。如果采用普通的寻址方式,地址线需要 22 根。但 DRAM 芯片为了减少引脚数,普遍采用地址引脚复用技术,行地址和列地址分时复用相同的引脚。因此实际的地址引脚数减半: DRAM 地址引脚数=222=11 根\text{DRAM 地址引脚数} = \frac{22}{2} = 11\text{ 根}

答案:地址引脚 11 根,数据引脚 8 根。

Q7 (计算机组成原理2020-2021第二学期B 选择题)#

题干:某计算机主存容量为 64KB,其中 ROM 区为 4KB,其余为 RAM 区,按字节编址。现要用 2K×8 位的 ROM 芯片和 4K×4 位的 RAM 芯片来设计该存储器,需要上述规格的 ROM 芯片数和 RAM 芯片数分别是( )。

A. 1, 15 B. 2, 15 C. 1, 30 D. 2, 30

答案:D

解析

  • A [错误]:ROM 芯片数与 RAM 芯片数计算均错误。
  • B [错误]:RAM 芯片数计算错误,仅计算了字扩展需求(15),忽略了位扩展需求(应乘以 2)。
  • C [错误]:ROM 芯片数计算错误。ROM 区目标容量为 4KB,使用 2K×82\text{K} \times 8 位(即 2KB)芯片,若仅用 1 片,总容量只有 2KB,达不到 ROM 区容量需求。
  • D [正确]
    1. ROM 区芯片计算: ROM 区总容量为 4KB=4K×84\text{KB} = 4\text{K} \times 8 位。使用规格为 2K×82\text{K} \times 8 位的 ROM 芯片,只需进行字扩展。需要的 ROM 芯片数量为: ROM 芯片数=4KB2K×8=4K×82K×8=2 片\text{ROM 芯片数} = \frac{4\text{KB}}{2\text{K} \times 8\text{位}} = \frac{4\text{K} \times 8\text{位}}{2\text{K} \times 8\text{位}} = 2\text{ 片}
    2. RAM 区芯片计算: 主存总容量为 64KB,ROM 区占 4KB,则 RAM 区容量为 64KB4KB=60KB=60K×864\text{KB} - 4\text{KB} = 60\text{KB} = 60\text{K} \times 8 位。 使用规格为 4K×44\text{K} \times 4 位的 RAM 芯片进行字位联合扩展。字扩展倍数为 60K4K=15\frac{60\text{K}}{4\text{K}} = 15 倍,位扩展倍数为 84=2\frac{8\text{位}}{4\text{位}} = 2 倍。 因此所需的 RAM 芯片总数为: RAM 芯片数=15×2=30 片\text{RAM 芯片数} = 15 \times 2 = 30\text{ 片} 综上,需要的 ROM 芯片为 2 片,RAM 芯片为 30 片。

Q8 (2022-2023-2考试 简答题)#

题干:用一个 512K×8 位的 Flash 存储芯片组成一个 4M×32 位的半导体只读存储器,存储器按字编址,试回答以下问题: (1) 共需要几片这样的存储芯片? (2) 该存储器的数据线和地址线数分别是多少根?

解析

  1. 芯片数计算芯片总片数=(4M512K)×(328)=8×4=32 片\text{芯片总片数} = \left(\frac{4\text{M}}{512\text{K}}\right) \times \left(\frac{32\text{位}}{8\text{位}}\right) = 8 \times 4 = 32\text{ 片}
  2. 数据线与地址线计算
    • 数据总线宽度与存储器的数据位数一致,为 32 位,因此数据线数为 32 根。
    • 存储器按字编址,其字数为 4M=2224\text{M} = 2^{22}。因此,寻址这 4M4\text{M} 个字需要 22 根地址线。

答案:(1) 需要 32 片。(2) 数据线为 32 根,地址线为 22 根。


4.9.4 存储系统层次结构设计目的#

Q9 (计算机组成原理2020-2021第二学期B 选择题)#

题干:计算机的存储器采用分级方式是为了( )。

A. 方便编程 B. 解决容量、速度、价格三者之间的矛盾 C. 保存大量数据方便 D. 操作方便

答案:B

解析

  • A [错误]:方便编程是采用虚拟存储器等软硬件协同管理后的效果之一,从根本上解决存储体系矛盾才是采用分级存储体系的核心出发点。
  • B [正确]:单一存储介质无法同时实现超高速度、超大容量和极低成本。采用“寄存器 - Cache - 主存 - 外存”的多级层次结构,利用了程序的局部性原理,通过软硬件的协同,成功在整体上获得了接近最高速介质的速度、接近最廉价介质的容量以及极低的平均成本,解决了这三者的矛盾。
  • C [错误]:保存大量数据可以直接使用低速、大容量的辅存,无需设计复杂的 Cache 等高速多级分级结构。
  • D [错误]:操作方便主要依靠操作系统的接口实现,并不是物理层面上采用分级存储的主要物理动因。

4.9.5 高位/低位交叉与双端口存储器#

Q10 (南阳理工学院 2024-2025 学年第 2 学期期末试卷(C 卷) 判断题)#

题干:单体多字存储器中,每个存储单元存储多个字。( )

解析: 单体多字存储器是一种并行主存系统。它的特点是只有一个存储体,但每个存储单元的字长是普通存储字长的数倍(例如包含 4 个字)。CPU 每次访问时,可以同时读出或写入多个字的数据,从而在空间上并行提高了存储带宽。

答案:对。


4.9.6 Cache 地址映射与参数计算#

Q11 (计组2019秋18级测试 答案.md 综合分析题)#

题干:假设主存容量为 512MB,Cache 容量为 4KB,每个字块为 16 个字,每个字为 32 位。请回答以下问题: (1) Cache 可容纳多少块,其地址为多少位? (2) 主存可容纳多少块,其地址为多少位? (3) 在四路组相联(即 Cache 每组包含 4 个块)映射方式下,请画出主存地址各字段的位数。

解析: 首先明确基本物理单位:

  • 每个字为 32 位 = 4 字节(B)。
  • 每个字块包含 16 个字 = 16×4 B=64 B16 \times 4\text{ B} = 64\text{ B}
  • Cache 容量为 4KB=4096 B4\text{KB} = 4096\text{ B}
  • 主存容量为 512MB=512×220 B=229 B512\text{MB} = 512 \times 2^{20}\text{ B} = 2^{29}\text{ B}

(1) Cache 参数

  • Cache 的块数 = Cache 容量块大小=4KB64 B=64 块\frac{\text{Cache 容量}}{\text{块大小}} = \frac{4\text{KB}}{64\text{ B}} = 64\text{ 块}
  • Cache 容量为 4KB4\text{KB},按字节寻址需要 12 位地址(因 212=40962^{12} = 4096)。 (2) 主存参数
  • 主存的块数 = 主存容量块大小=512MB64 B=8M 块=223 块\frac{\text{主存容量}}{\text{块大小}} = \frac{512\text{MB}}{64\text{ B}} = 8\text{M 块} = 2^{23}\text{ 块}
  • 主存容量为 512MB512\text{MB},按字节寻址需要 29 位地址(因 229=512M2^{29} = 512\text{M})。 (3) 四路组相联映射下的地址字段划分
  • Cache 总块数为 64 块。因为是四路组相联,每组有 4 块,则 Cache 的总组数 = 644=16 组=24 组\frac{64}{4} = 16\text{ 组} = 2^4\text{ 组}
  • 组地址(Index)需要 4 位。
  • 块内偏移地址(Offset)由块大小决定,块大小为 64 B,按字节寻址需要 6 位(因 26=642^6 = 64)。
  • 主存字块标记(Tag)的位数 = 主存地址总位数 - 组地址位数 - 块内偏移位数 = 2946=19 位29 - 4 - 6 = 19\text{ 位}

答案: (1) Cache 可容纳 64 块,地址为 12 位。 (2) 主存可容纳 8M8\text{M}(即 2232^{23})块,地址为 29 位。 (3) 主存地址各字段划分如下:

主存字块标记(Tag)组地址(Index)字块内地址(Offset)
19位4位6位

Q12 (2022-2023-2考试 计算题)#

题干:某计算机的 Cache 由 64 个存储块构成,采用四路组相联映射方式,主存包含 4096 个存储块,每块由 128 个字组成,访问地址为字地址。 (1) 主存地址和 Cache 地址各有多少位? (2) 按照题干条件中的映射方式,列出主存地址的划分情况,并标出各部分的位数。

解析: 注意此题中访问地址为字地址,即寻址的基本单位是“字”,而不是“字节”。

  • 块大小 = 128 个字。
  • Cache 块数 = 64 块。
  • Cache 容量(字) = 64×128=8192 字=213 字64 \times 128 = 8192\text{ 字} = 2^{13}\text{ 字},因此 Cache 地址为 13 位。
  • 主存块数 = 4096 块 = 212 块2^{12}\text{ 块}
  • 主存容量(字) = 4096×128=212×27=219 字4096 \times 128 = 2^{12} \times 2^7 = 2^{19}\text{ 字},因此主存地址为 19 位。

(2) 地址字段划分

  • 块内地址(Offset)由块大小决定。块大小为 128 字,字地址寻址需要 7 位(因 27=1282^7 = 128)。
  • Cache 组数 = 64 块4 块/组=16 组=24 组\frac{64\text{ 块}}{4\text{ 块/组}} = 16\text{ 组} = 2^4\text{ 组},因此组地址(Index)为 4 位。
  • 主存标记(Tag)的位数 = 主存地址位数 - 组地址位数 - 块内地址位数 = 1947=8 位19 - 4 - 7 = 8\text{ 位}

答案: (1) 主存地址为 19 位,Cache 地址为 13 位。 (2) 主存地址划分如下:

标记(Tag)组号(Index)块内偏移(Offset)
8位4位7位

Q13 (计算机组成原理2020-2021第二学期B 选择题)#

题干:计算机存储系统中的高速缓存采用直接映射策略时,高速缓存控制器如何确定是否命中( )。

A. 高速缓存中行标志与 CPU 给出物理地址的高位一致 B. 高速缓存中与 CPU 给出的物理地址中组索引一致的行中存在行标志与物理地址高位一致的行,且该行有效 C. 高速缓存中与 CPU 给出的物理地址中行索引一致的行中的行标志与物理地址的高位一致,且该行有效 D. 高速缓存中存在行标志与 CPU 给出物理地址的高位一致的行,且该行有效

答案:C

解析

  • A [错误]:直接映射中主存块只能映射到唯一的 Cache 行中。仅仅行标记与高位一致是不够的,还必须要求该 Cache 行的有效位为 1。
  • B [错误]:直接映射按行索引定位,不需要使用组索引。组索引是组相联映射方式所采用的字段。
  • C [正确]:在直接映射策略中,主存中的每一块均映射到 Cache 的唯一固定行中。当 CPU 给出一个访存物理地址时,Cache 控制器首先根据地址中的行索引字段,直接定位到唯一的 Cache 行。接着,控制器需要检查两点:第一,该 Cache 行中的标记(行标志)是否与物理地址中的高位标记(Tag)字段完全一致;第二,检查该行的有效位(Valid Bit)是否为 1。只有当有效位为 1 且标记完全匹配时,才判定为 Cache 命中。
  • D [错误]:此项属于全相联映射方式下的命中判断逻辑,在直接映射下,不需要检索所有的行,只需直接定位并比较那一行即可。

4.9.7 Cache 命中率与局部性#

Q14 (南阳理工学院 2024-2025 学年第 2 学期期末试卷(C 卷) 计算题)#

题干:假设某计算机的存储系统由 Cache 和主存组成,某程序执行过程中访问 20002000 次,其中访问 Cache 缺失(未命中)5050 次,则 Cache 的命中率是多少?

解析: Cache 命中率 HH 的计算公式为: H=命中次数总访问次数=总访问次数未命中次数总访问次数H = \frac{\text{命中次数}}{\text{总访问次数}} = \frac{\text{总访问次数} - \text{未命中次数}}{\text{总访问次数}} 代入数据计算: H=2000502000=19502000=97.5%H = \frac{2000 - 50}{2000} = \frac{1950}{2000} = 97.5\%

答案97.5%97.5\%


4.9.8 虚拟存储器与透明性#

Q15 (南阳理工学院 2024-2025 学年第 2 学期期末试卷(C 卷) 判断题)#

题干:虚拟存储器对应用程序员不透明,对系统程序员透明。( )

解析: 在计算机组成原理和操作系统中,“透明”是指“客观存在但无需关心、看不见”。

  • 虚拟存储器由硬件与操作系统自动管理。应用程序员在编写程序时,可以直接使用大范围的虚拟地址,无需操心物理内存的调入调出细节,因此虚拟存储器对应用程序员是透明的
  • 系统程序员需要编写操作系统的页表管理、页面置换算法和中断处理程序,必须直接控制虚拟存储器的物理运作,因此对系统程序员是不透明的

答案:错。


习题4:课后习题与真题题目汇总#

习题4.0 原题目录#

4.1 名词解释#

解释下列名词:

存取时间、存取周期、存储器带宽、存储单元、边界对齐的数据存放、大端存储、小端存储、静态存储器、动态存储器、刷新、刷新周期、字扩展、位扩展、多体交叉存储器、高速缓冲存储器、双端口存储器、相联存储器、时间局部性、地址映射、直接相联映射、全相联映射、组相联映射、命中率、虚拟存储器、页框号、页表(通常称慢表)、页表项、TLB(通常称快表)、LRU 算法、LFU 算法、Cache 一致性、写回法、写穿法。


4.2 选择题(考研真题)#

(1) [2010] 下列有关 RAM 和 ROM 的叙述中,正确的是______。#

Ⅰ. RAM 是易失性存储器,ROM 是非易失性存储器
Ⅱ. RAM 和 ROM 都采用随机存取方式进行信息访问
Ⅲ. RAM 和 ROM 都可用作 Cache
Ⅳ. RAM 和 ROM 都需要进行刷新

A. 仅 Ⅰ 和 Ⅱ
B. 仅 Ⅱ 和 Ⅲ
C. 仅 Ⅰ、Ⅱ 和 Ⅳ
D. 仅 Ⅱ、Ⅲ 和 Ⅳ

(2) [2020] 在按字节编址,采用小端方式的 32 位计算机中,为以下 C 语言结构型变量 a 分配存储空间。#
struct record {
short x1;
int x2;
} a;

若 a 的首地址为 2020 FE00H,a 的成员变量 x2 的机器数为 1234 0000H,则其中 34H 所在存储单元的地址是______。

A. 2020 FE03H
B. 2020 FE04H
C. 2020 FE05H
D. 2020 FE06H

(3) [2014] 某容量为 256MB 的存储器若由若干 4M×84\text{M}\times 8 位的 DRAM 芯片构成,该 DRAM 芯片的地址引脚和数据引脚总数是______。#

A. 19
B. 22
C. 30
D. 36

(4) [2009] 某计算机主存容量为 64KB,其中 ROM 区为 4KB,其余为 RAM 区,按字节编址。现要用 2K×82\text{K}\times 8 位的 ROM 芯片和 4K×44\text{K}\times 4 位的 RAM 芯片来设计该存储器,则需要上述规格的 ROM 芯片数和 RAM 芯片数分别是______。#

A. 1、15
B. 2、15
C. 1、30
D. 2、30

(5) [2010] 假定用若干 2K×42\text{K}\times 4 位的芯片组成一个 8K×88\text{K}\times 8 位的存储器,则地址 0B1FH 所在芯片的最小地址是______。#

A. 0000H
B. 0600H
C. 0700H
D. 0800H

(6) [2021] 某计算机的存储器总线中有 24 位地址线和 32 位数据线,按字节编址,字长为 32 位。如果 00 0000H ~ 3F FFFFH 为 RAM 区,那么需要 512K×8512\text{K}\times 8 位的 RAM 芯片数为______。#

A. 8
B. 16
C. 32
D. 64

(7) [2023] 某计算机的 CPU 有 30 根地址线,按字节编址,CPU 和主存芯片连接时,要求主存芯片占满所有可能存储地址空间,并且 RAM 区和 ROM 区所分配的空间大小比为 3:1。若 RAM 在连续低地址区,ROM 在连续高地址区,则 ROM 的地址范围______。#

A. 0000 0000H ~ 0FFF FFFFH
B. 1000 0000H ~ 2FFF FFFFH
C. 3000 0000H ~ 3FFF FFFFH
D. 4000 0000H ~ 4FFF FFFFH

(8) [2022] 某内存条包含 8 个 8192×8192×88192\times 8192\times 8 位的 DRAM 芯片,按字节编址,支持突发传送方式,对应存储器总线宽度为 64 位,每个 DRAM 芯片内有一个行缓冲区。下列关于该内存条的叙述中,不正确的是______。#

A. 内存条的容量为 512MB
B. 采用多模块交叉编址方式
C. 芯片的地址引脚为 26 位
D. 芯片内行缓冲有 8192×88192\times 8

(9) [2018] 假定 DRAM 芯片中存储阵列的行数为 rr、列数为 cc,对于一个 2K×12\text{K}\times 1 位的 DRAM 芯片,为保证其地址引脚数最少,并尽量减少刷新开销,则 rrcc 的取值分别是______。#

A. 2048、1
B. 64、32
C. 32、64
D. 1、2048

(10) [2019] 假定一台计算机采用 3 通道存储器总线,配套的内存条型号为 DDR3-1333,即内存条所接插的存储器总线的工作频率为 1333MHz,总线宽度为 64 位,则存储器总线的总带宽大约是______。#

A. 10.66GB/s
B. 32GB/s
C. 64GB/s
D. 96GB/s

(11) [2015] 某计算机使用 4 体交叉编址存储器,假定在存储器总线上出现的主存地址序列为 8005、8006、8007、8008、8001、8002、8003、8004、8000,则可能发生访存冲突的地址对是______。#

A. 8004 和 8008
B. 8002 和 8007
C. 8001 和 8008
D. 8000 和 8004

(12) [2015] 下列存储器中,在工作期间需要周期性刷新的是______。#

A. SRAM
B. SDRAM
C. ROM
D. FLASH

(13) [2011] 下列各类存储器中,不采用随机存取方式的是______。#

A. EPROM
B. CDROM
C. DRAM
D. SRAM

(14) [2012] 下列关于闪存的叙述中,错误的是______。#

A. 信息可读可写,并且读、写速度一样快
B. 存储元由 MOS 管组成,是一种半导体存储器
C. 掉电后信息不丢失,是一种非易失性存储器
D. 采用随机访问方式,可替代计算机外部存储器

(15) [2017] 某 C 语言程序段如下:#
for (i = 0; i <= 9; i++) {
temp = 1;
for (j = 0; j <= i; j++)
temp *= a[j];
sum += temp;
}

下列关于数组 a 的访问局部性的描述中,正确的是______。

A. 时间局部性和空间局部性皆有
B. 无时间局部性,有空间局部性
C. 有时间局部性,无空间局部性
D. 时间局部性和空间局部性皆无

(16) [2009] 某计算机的 Cache 共有 16 块,采用二路组相联映射方式。每个主存块大小为 32B,按字节编址。主存 129 号单元所在主存块应装入的 Cache 组号是______。#

A. 0
B. 1
C. 4
D. 6

(17) [2012] 假设某计算机按字编址,Cache 有 4 行,Cache 与主存之间交换的块大小为 1 个字。若 Cache 的内容初始为空,采用二路组相联映射方式和 LRU 替换策略。访问的主存地址依次为 0、4、8、2、0、6、8、6、4、8 时,命中 Cache 的次数是______。#

A. 1
B. 2
C. 3
D. 4

(18) [2015] 假定主存地址为 32 位,按字节编址,主存和 Cache 之间采用直接相联映射方式,主存块大小为 4 个字,每个字 32 位,采用写回的方式,则能存放 4K 字数据的 Cache 的总容量至少是______位。#

A. 146K
B. 147K
C. 148K
D. 158K

(19) [2021] 若计算机主存地址为 32 位,按字节编址,Cache 数据区大小为 32KB,主存块大小为 32B,采用直接映射方式和回写策略,则 Cache 行的位数至少是______。#

A. 275
B. 274
C. 258
D. 257

(20) [2022] 若计算机主存地址为 32 位,按字节编址,某 Cache 的数据区容量为 32KB,主存块大小为 64B,采用 8 路组相联映射方式,该 Cache 中比较器的个数和位数分别为______。#

A. 8,20
B. 8,23
C. 64,20
D. 64,23

(21) [2014] 采用指令 Cache 与数据 Cache 分离的主要目的是______。#

A. 降低 Cache 的缺失损失
B. 提高 Cache 的命中率
C. 降低 CPU 平均访存时间
D. 减少指令流水线资源冲突

(22) [2024] 下列事件中,不是在 MMU 地址转换过程中检测的是______。#

A. 访问越权
B. Cache 缺失
C. 页面缺失
D. TLB 缺失

(23) [2024] 对于页式虚拟存储管理系统,下列关于存储器层次结构的叙述中,错误的是______。#

A. Cache-主存层次的交换单位为主存块,主存-外存层次的交换单位为页
B. Cache-主存层次替换算法由硬件实现,主存-外存层次由软件实现
C. Cache-主存层次可采用回写法写策略,主存-外存层次通常采用回写法
D. Cache-主存层次可采用直接映射,主存-外存层次通常采用直接映射

(24) [2022] 某计算机主存地址为 24 位,采用分页虚拟存储管理方式,虚拟地址空间大小为 4GB,页大小为 4KB,按字节编址。某进程的页表部分内容如下表所示。#
虚页号实页号存在位
82024H0
129180H1
130018H1

当 CPU 访问虚拟地址 0008 2840H 时,虚-实地址转换的结果是______。

A. 得到主存地址 02 4840H
B. 得到主存地址 18 0840H
C. 得到主存地址 01 8840H
D. 检测到缺页异常

(25) [2015] 假定编译器将赋值语句 “x=x+3;” 转换为指令 “add xaddr,3”,其中,xaddr 是 x 对应的存储单元地址。若执行该指令的计算机采用页式虚拟存储管理方式,并配有相应的 TLB,且 Cache 使用写穿的方式,则完成该指令功能需要访问主存的次数至少是______。#

A. 0
B. 1
C. 2
D. 3

(26) [2010] 下列命中组合情况中,一次访存过程中不可能发生的是______。#

A. TLB 未命中,Cache 未命中,Page 未命中
B. TLB 未命中,Cache 命中,Page 命中
C. TLB 命中,Cache 未命中,Page 命中
D. TLB 命中,Cache 命中,Page 未命中

(27) [2013] 某计算机主存地址空间大小为 256MB,按字节编址。虚拟地址空间大小为 4GB,采用页式存储管理方式,页面大小为 4KB,TLB 采用全相联映射,有 4 个页表项,内容如下表所示。#
有效位标记页框号
0FF180H0002H
13FFF1H0035H
002FF3H0351H
103FFFH0153H

则对虚拟地址 03FFF180H 进行虚实地址转换的结果是______。

A. 0153180H
B. 0035180H
C. TLB 缺失
D. 缺页

(28) [2024] 某计算机按字节编址,采用页式虚拟存储管理方式,虚拟地址为 32 位,主存地址为 30 位,页大小为 1KB,若 TLB 有 32 个表项,采用 4 路组相联映射方式,则 TLB 表项中标记字段位数至少是______。#

A. 17
B. 18
C. 19
D. 20

(29) [2019] 下列关于缺页处理的叙述中,错误的是______。#

A. 缺页是在地址转换时 CPU 检测到的一种异常
B. 缺页处理由操作系统提供的缺页处理程序完成
C. 缺页处理程序根据页故障地址从外存读入所缺失的页
D. 缺页处理完成后执行发生缺页的指令的下一条指令

(30) [2020] 下列关于 TLB 和 Cache 的叙述中,错误的是______。#

A. 命中率都与程序局部性有关
B. 缺失后都需要去访问主存
C. 缺失处理都可以由硬件实现
D. 都由 DRAM 存储器组成


4.3 简答题#

(1) 计算机系统中采用层次化存储体系结构的目的是什么?
(2) 为什么在存储器芯片中设置片选输入端?
(3) 动态 MOS 存储器为什么要刷新?如何刷新?
(4) 试述多体交叉存储器的设计思想和实现方法。
(5) 为什么说 Cache 对程序员是透明的?
(6) 直接相联映射方式下为什么不需要使用替换算法?
(7) 为什么要考虑 Cache 的一致性?
(8) 替换算法有哪几种?它们各有何优缺点?


4.4#

对于 32KB 容量的存储器,若按 16 位字编址,其地址寄存器应是多少位?数据寄存器是多少位?


4.5#

用 4 个 32K×832\text{K}\times 8 位 SRAM 存储芯片可设计出哪几种不同容量和字长的存储器?画出相应设计图并完成与 CPU 的连接。


4.6#

32K×832\text{K}\times 8 位 RAM 芯片和 64K×464\text{K}\times 4 位 ROM 芯片设计 256K×8256\text{K}\times 8 位存储器。其中,从 30000H3FFFFH 的地址空间为只读存储区,其他为可读、可写存储区。完成存储器与 CPU 的连接。


4.7#

某计算机字长为 16 位,主存容量为 128K×16128\text{K}\times 16 位,请用 16K×816\text{K}\times 8 位的静态 RAM 芯片和 32K×1632\text{K}\times 16 位的 ROM 芯片为该机设计一个主存储器。要求 18000H ~ 1FFFFH 为 ROM 区,其余为 RAM 区。画出该存储器结构及其与 CPU 连接的框图。


4.8#

设有某动态 RAM 芯片,容量为 64K×164\text{K}\times 1 位,除电源线、接地线和写使能控制线外,该芯片的最小引脚数量是多少?


4.9#

64K×164\text{K}\times 1 位的 DRAM 芯片构成 1M×81\text{M}\times 8 位的存储器,若采用异步刷新,每次刷新间隔不超过 2ms,则产生刷新信号的间隔时间是多少?假设读写周期为 0.5μs0.5\mu\text{s},若采用集中刷新方式,则存储器刷新一遍最少要用多少个读写周期?CPU 的死时间为多少?


4.10#

16K×116\text{K}\times 1 位的 DRAM 芯片构成 64K×864\text{K}\times 8 位的存储器,设存储器的读写周期为 0.5μs0.5\mu\text{s},要使 CPU 在 1μs1\mu\text{s} 内至少访问存储器一次,采用哪种刷新方式比较合适?若每次刷新间隔不超过 2ms,该方式下刷新信号的产生周期是多少?


4.11#

设 Cache 的容量为 2142^{14} 块,每块 4 个字节,主存按字节编址,其中有下表所示的数据(地址和数据均采用十六进制表示)。

地址数据地址数据
0000008756853601FFFC4FFFFC68
00000887792301FFFFF801BF2460
0100049ABEFCD0

将主存中这些数据装入 Cache 后,Cache 各块中的数据内容及相应的标志是什么?
(1) 全相联映射;
(2) 直接相联映射;
(3) 四路组相联映射。


4.12#

某计算机的 Cache 由 64 个存储块构成,采用四路组相联映射方式,主存包含 4096 个存储块,每块由 128 个字组成,访问地址为字地址。
(1) 主存地址和 Cache 地址各有多少位?
(2) 按照题干条件中的映射方式,列出主存地址的划分情况,并标出各部分的位数。


4.13#

某计算机的主存容量为 4MB,Cache 容量为 16KB,每块包含 8 个字,每字为 32 位,映射方式采用四路组相联。设 Cache 的初始状态为空,CPU 依次从主存第 0, 1, 2, …, 99 号单元读出 100 个字(每次读一个字),并重复此操作 10 次,替换算法采用 LRU 算法。
(1) 求 Cache 的命中率。
(2) 若 Cache 比主存快 10 倍,分析采用 Cache 后存储访问速度提高了多少。


4.14#

假定某数组元素按行优先顺序存放在主存中,则在以下两段伪代码 A 和 B 中,分析下列问题。
(1) 两段代码中对数组访问的时间局部性和空间局部性。
(2) 变量 sum 的时间局部性和空间局部性。
(3) for 循环体对指令访问的时间局部性和空间局部性。

代码 A:

int sum_array_A(int a[M][N]) {
int i, j, sum = 0;
for (i = 0; i < M; i++)
for (j = 0; j < N; j++)
sum += a[i][j];
return sum;
}

代码 B:

int sum_array_B(int a[M][N]) {
int i, j, sum = 0;
for (i = 0; i < N; i++)
for (j = 0; j < M; j++)
sum += a[j][i];
return sum;
}

4.15#

假定主存地址为 32 位,按字节编址,指令 Cache 和数据 Cache 与主存之间均采用 8 路组相联映射、写穿策略和 LRU 替换算法,主存块大小为 64B,数据区容量各为 32KB。开始时 Cache 均为空。请回答下列问题。
(1) Cache 每一行中标记、LRU 位各占几位?是否有修改位?
(2) 有如下 C 语言程序段:

for (k = 0; k < 1024; k++)
s[k] = 2 * s[k];

若数组 s 及其变量 k 均为 int 型,int 型数据占 4B,变量 k 分配在寄存器中,数组 s 在主存中的起始地址为 0080 00C0H,则该程序段执行过程中,访问数组 s 的数据 Cache 缺失次数为多少?
(3) 若 CPU 最开始的访问操作是读取主存单元 0001 0003H 中的指令,简要说明从 Cache 中访问该指令的过程,包括 Cache 缺失处理过程。


4.16#

已知计算机 M 字长为 32 位,按字节编址,采用请求调页策略的虚拟存储管理方式,虚拟地址 32 位,页面大小为 4KB;数据 Cache 采用 4 路组相联映射方式,数据区大小为 8KB,主存块大小为 32B。现有 C 语言程序段如下:

int a[24][64];
for (i = 0; i < 24; i++)
for (j = 0; j < 64; j++)
a[i][j] = 10;

已知二维数组 a 按行优先存放,在虚拟地址空间中分配的起始地址为 0042 2000Hsizeof(int)=4。假定在 M 上执行上述程序段之前数组 a 不在主存,且在该程序执行过程中不会发生页面置换。请回答下列问题:
(1) 数组分布在几个页面中?对于数组 a 的访问,会发生几次缺页异常?页故障地址各是什么?
(2) 不考虑变量 i 和 j,该程序段的数据访问是否具有时间局部性?为什么?
(3) 计算机 M 的虚拟地址 (A31A0A_{31} \sim A_0) 中哪几位用作块内地址?哪几位用作 Cache 组号?a[1][0] 的虚拟地址是多少?其所在主存块对应的 Cache 组号是多少?
(4) 数组 a 占用多少主存块?假设上述程序段执行过程中数组 a 的访问不会和其他数据发生 Cache 访问冲突,则数组 a 的 Cache 命中率是多少?若将循环中 i 和 j 的次序按如下方式调换:

for (j = 0; j < 64; j++)
for (i = 0; i < 24; i++)
a[i][j] = 10;

则数组 a 的 Cache 命中率又是多少?


4.17#

主存容量为 8MB,虚存容量为 2GB,分页管理时若页面大小为 4KB,求出对应的 VPN、VPO、PPN、PPO 的位数。


4.18#

某页式虚拟存储器共 8 页,每页为 1KB,主存容量为 4KB,页表如下表所示。

虚页号实页号装入位
031
121
210
320
431
510
601
700

(1) 失效的页有哪几页?
(2) 虚地址 0、3028、1023、2048、4096、8000 的实地址分别是多少?


4.19#

某计算机系统中的一个 TLB 和 L1 级数据 Cache,存储系统按字节编址,虚拟存储容量为 2GB,主存容量为 4MB,页大小为 128KB,TLB 采用四路组相联方式,共有 16 个页表项。Cache 容量为 16KB,每块包含 8 个字,每字为 32 位,映射方式采用四路组相联,回答下列问题。
(1) 虚拟地址中哪几位表示虚拟页号?哪几位表示页内地址?虚拟页号中哪几位表示 TLB 标记?哪几位表示 TLB 索引?
(2) 物理地址中哪几位表示物理页号?哪几位表示偏移地址?
(3) 为实现主存与数据 Cache 之间的组相联映射,对该地址应进行怎样的划分?


4.20#

假设计算机 M 的主存地址为 24 位,按字节编址;采用分页存储管理方式,虚拟地址为 30 位,页大小为 4KB;TLB 采用 2 路组相联方式和 LRU 替换策略,共 8 组。请回答下列问题。
(1) 虚拟地址中哪几位表示虚页号?哪几位表示页内地址?
(2) 已知访问 TLB 时虚页号高位部分用作 TLB 标记,低位部分用作 TLB 组号,M 的虚拟地址中哪几位是 TLB 标记?哪几位是 TLB 组号?
(3) 假设 TLB 初始时为空,访问的虚页号依次为 10、12、16、7、26、4、12、20,在此过程中,哪一个虚页号对应的 TLB 表项被替换?说明理由。
(4) 若将 M 中的虚拟地址位数增加到 32 位,则 TLB 表项的位数增加几位?


4.21#

某计算机采用页式虚拟存储管理方式,按字节编址,虚拟地址为 32 位,物理地址为 24 位,页大小为 8KB;TLB 采用全相联映射;Cache 数据区大小为 64KB,按 2 路组相联方式组织,主存块大小为 64B。

(1) 物理地址各个字段的位数各是多少?TLB 标记中存放的是什么信息?
(2) 将块号为 4099 的主存块装入 Cache 中时,映射的 Cache 组号是多少?对应标记的内容是什么?
(3) Cache 缺失处理的时间开销大还是缺页处理的时间开销大?为什么?
(4) 为什么 Cache 可以采用写穿策略,而修改页面内容时总是采用写回策略?


4.22#

某计算机采用页式虚拟存储管理方式,按字节编址。CPU 进行页式虚拟存储器访问。回答下列问题。
(1) 主存的物理地址占多少位?
(2) TLB 采用什么映射方式?TLB 是用 SRAM 还是用 DRAM 实现?
(3) Cache 采用什么映射方式?若 Cache 采用 LRU 替换算法和写回策略,则 Cache 每行中除数据、tag 和有效位外,还应有哪些附加位?Cache 总容量是多少?Cache 中有效位的作用是什么?
(4) 若 CPU 给出的虚拟地址为 0008 C040H,则对应的物理地址是多少?是否在 Cache 中命中?说明理由。若 CPU 给出的虚拟地址为 0007 C260H,则该地址所在主存块映射到的 Cache 组号是多少?


4.1 名词解释详细解答#

(1) 主存:用于存放 CPU 正在运行的程序和数据的系统存储器,可由 CPU 通过系统总线直接进行随机寻址,物理上主要由半导体 DRAM 芯片组成,属于内部存储器。
(2) 辅存:用于存放暂不运行的程序和海量数据,CPU 不能直接访问它,必须通过 I/O 系统调入主存后才能运行。典型设备如机械硬盘、固态硬盘,属于外部存储器。
(3) 存取时间:是指从存储器接收到合法的读/写控制命令及地址开始,到数据线上的数据物理上稳定输出(或写入完毕)所需的时间间隔。
(4) 存取周期:是指存储器进行连续两次独立的读或写操作之间所需的最小物理时间间隔。存取周期通常大于存取时间。
(5) 存储器带宽:单位时间内存储器能够与外部(如 CPU)传输的最大数据量,单位为字节/秒(B/s)或位/秒(bps)。
(6) 存储元:用于存储一位二进制数据 0 或 1 的最基础物理电路,是存储器内部最小的物理存储载体。
(7) 存储单元:由若干个存储元组成,是存储器可以按照物理地址进行寻址的最小存储组合单位。
(8) 存储字:存放在一个存储单元中的二进制代码组合。
(9) 存储字长:一个存储单元中包含的二进制代码的位数(即存储字的长度)。
(10) 大端存储:将多字节数据的低有效字节存放在高物理地址单元中,而将高有效字节存放在低物理地址单元中的字节存储顺序。
(11) 小端存储:将多字节数据的低有效字节存放在低物理地址单元中,而将高有效字节存放在高物理地址单元中的字节存储顺序。
(12) 边界对齐:为了提升 CPU 访存效率,多字节数据(如 2 字节短整型、4 字节整型)存放在其数据大小的整数倍地址处的内存编址方式。
(13) SRAM:静态随机存取存储器,依靠双稳态触发器保存二进制状态的半导体随机存储器。存取速度极快,但集成度低、功耗大、成本高,常用作 Cache。
(14) DRAM:动态随机存取存储器,利用微小电容上的电荷状态保存二进制数据的随机存储器。集成度极高、功耗低、容量大、成本低,但电容会缓慢泄露电荷,因而需要定期进行刷新,常用作系统主存储器。
(15) 重写:对于具有破坏性读出特征的存储元,在读取操作后,为了恢复其原有的物理状态,由内部控制电路自动重新写入原数据的物理过程。
(16) 刷新:为了防止 DRAM 存储元电容电荷泄露导致数据丢失,由外部定时刷新电路定期对 DRAM 芯片的每一行进行读取并重新写入的过程。
(17) 刷新周期:DRAM 芯片中全部存储元必须完成一次刷新操作的最大允许时间间隔,通常为 2ms。
(18) 位扩展:通过并联多个物理芯片的数据引脚,以增加存储系统的字长(位宽)的扩展设计方法。
(19) 字扩展:通过使用片选信号(译码驱动)增加芯片数量,以增加存储系统总存储单元个数的扩展设计方法。
(20) 字位同时扩展:在字数和位数都达不到系统目标容量时,同时进行字方向和位方向的拼接扩展方法。
(21) 多体交叉存储器:由多个物理上独立、具有相同容量和字长的存储体组成的存储器系统。通过对地址的低位进行交叉编址,使 CPU 能够以流水线重叠或并行的方式访问不同的物理存储体,从而提升主存带宽。
(22) 双端口存储器:具有两套完全独立的读写控制线、地址线和数据缓冲,允许两个独立的 CPU 或控制器在同一时刻并发访问该存储器的多通道存储组件。
(23) 相联存储器:不是依靠物理地址,而是根据待检索数据的部分内容(关键字标记)进行全表项并行比较和读写的特殊存储器,常用于 TLB 和 Cache 标记字段匹配。
(24) Cache:高速缓冲存储器,设置在 CPU 和主存之间、用快速的 SRAM 实现的高速、小容量存储器。它利用局部性原理暂存 CPU 频繁访问的数据,以缓解 CPU 速度与主存慢速之间的瓶颈。
(25) 时间局部性:如果某个存储单元被访问,在不久的将来它极有可能再次被访问。
(26) 空间局部性:如果某个存储单元被访问,在不久的将来其邻近的物理存储单元极有可能被访问。
(27) 地址映射:将主存的物理地址转换为 Cache 中的地址(确定主存块与 Cache 行之间对应关系)的转换过程。
(28) 直接相联映射:主存中的每一个块只能映射到 Cache 的一个唯一、固定的行中的单射映射方式。
(29) 全相联映射:主存中的任意一块可以映射到 Cache 中任意一行的自由映射方式。
(30) 组相联映射:将 Cache 划分为若干组,主存块通过直接相联映射定位到 Cache 的固定组中,在组内则可以采用全相联映射放入任意一行。
(31) 命中率:在存储体系中,CPU 访问的数据成功存在于 Cache 中的次数占总访存次数的比例。
(32) 虚拟存储器:为了给程序员提供连续且极大的逻辑地址空间,由系统软件和硬件共同管理,将主存与外存(磁盘)统一编址的存储体系。
(33) 页表:存放在主存中的特殊映射表,用于记录虚拟页号到物理页框号的转换关系。
(34) TLB:快表,常集成在 CPU 内部,是页表项的快速缓冲,用于加速虚拟地址到物理地址的转换过程。


4.2 选择题答案与详细解析#

(1) 答案:A

解析

  • A [正确]:由于 Ⅰ 和 Ⅱ 正确,Ⅲ 和 Ⅳ 错误,因此仅 Ⅰ 和 Ⅱ 正确。具体分析为:Ⅰ 正确,RAM 为易失性存储器,ROM 为非易失性存储器;Ⅱ 正确,SRAM 和 DRAM、ROM 均采用随机存取方式进行信息访问,访问任何一个存储单元的时间都相同且与物理位置无关。
  • B [错误]:由于 Ⅲ 错误,该选项错误。Ⅲ 错误原因为:ROM 无法用作高速缓存,因为高速缓存必须支持 CPU 的高速写入,而 ROM 在正常工作时是只读的。
  • C [错误]:由于 Ⅳ 错误,该选项错误。Ⅳ 错误原因为:ROM 与 SRAM 均不需要刷新,只有 DRAM 因为电容漏电才需要进行周期性刷新。
  • D [错误]:由于 Ⅲ 和 Ⅳ 错误,该选项错误。

(2) 答案:D

解析

  • A [错误]2020 FE03H 为结构体中的填充字节(为了满足 int 成员的 4 字节边界对齐,在 x1 后的 2020 FE02H2020 FE03H 进行填充)。
  • B [错误]2020 FE04H 存放的是成员变量 x2 的最低有效字节 00H
  • C [错误]2020 FE05H 存放的是成员变量 x2 的次低有效字节 00H
  • D [正确]:由于边界对齐要求,4 字节的成员 x2 必须从 4 的整数倍地址开始存放,因此其起始地址为 2020 FE04H。在小端方式下,高位字节存放在高地址,低位字节存放在低地址。x2 机器数 12340000H 的字节从低到高依次为 00H00H34H12H,分别存放在 2020 FE04H2020 FE07H。因此,34H 存放在 2020 FE06H 中。

(3) 答案:A

解析

  • A [正确]:DRAM 芯片规格为 4M×84\text{M} \times 8 位,字容量为 4M=2224\text{M} = 2^{22},数据位宽为 8 位。因为 DRAM 芯片采用地址复用技术,其行、列地址线分时复用,故地址引脚数为 222=11\frac{22}{2} = 11 根。数据引脚数等于数据位宽,即 8 根。不考虑控制引脚及电源、接地线,地址与数据引脚总数为 11+8=1911 + 8 = 19 根。
  • B [错误]:此选项未考虑 DRAM 的地址复用技术,直接将 22 根地址线与数据引脚相加或有其他计算错误。
  • C [错误]:此项计算错误,误将总存储容量 256MB256\text{MB} 作为芯片引脚计算基础。
  • D [错误]:此项计算错误,未考虑地址复用技术且计算有偏差。

(4) 答案:D

解析

  • A [错误]:ROM 芯片数与 RAM 芯片数计算均错误。
  • B [错误]:RAM 芯片数计算错误,仅计算了字扩展需求,忽略了位扩展需求。
  • C [错误]:ROM 芯片数计算错误,仅用 1 片只能得到 2K×82\text{K} \times 8 位的容量,无法达到 4KB4\text{KB} 的 ROM 区容量。
  • D [正确]
    • ROM 区容量为 4KB=4K×84\text{KB} = 4\text{K} \times 8 位,使用 2K×82\text{K} \times 8 位的 ROM 芯片进行字扩展,需要芯片数 4K×82K×8=2\frac{4\text{K} \times 8}{2\text{K} \times 8} = 2 片。
    • RAM 区容量为主存总容量减去 ROM 区容量,即 64KB4KB=60KB=60K×864\text{KB} - 4\text{KB} = 60\text{KB} = 60\text{K} \times 8 位。使用 4K×44\text{K} \times 4 位的 RAM 芯片进行字位联合扩展,字扩展倍数为 60K4K=15\frac{60\text{K}}{4\text{K}} = 15,位扩展倍数为 84=2\frac{8}{4} = 2,所以需要 RAM 芯片总数为 15×2=3015 \times 2 = 30 片。

(5) 答案:D

解析

  • A [错误]0000H 是第一组芯片(地址范围 0000H ~ 07FFH)的最小地址,而地址 0B1FH 超出了该范围。
  • B [错误]0600H 并非以 2KB2\text{KB} 为组边界的芯片起始地址,芯片组的起始地址必须是 2KB2\text{KB}(即 0800H)的整数倍。
  • C [错误]0700H 不是按 2KB2\text{KB} 划分芯片组的边界起始地址。
  • D [正确]:使用 2K×42\text{K} \times 4 位芯片组成 8K×88\text{K} \times 8 位存储器,需要将每 2 片并联进行位扩展,组成 2K×82\text{K} \times 8 位的芯片组(容量为 2KB2\text{KB})。整个存储器共有 8KB2KB=4\frac{8\text{KB}}{2\text{KB}} = 4 组芯片,各组的地址分配如下:组 0 为 0000H ~ 07FFH;组 1 为 0800H ~ 0FFFH;组 2 为 1000H ~ 17FFH;组 3 为 1800H ~ 1FFFH。地址 0B1FH 落入组 1(即第二组芯片)的地址范围内,因此该芯片组的最小起始地址为 0800H

(6) 答案:A

解析

  • A [正确]:地址空间为 00 0000H ~ 3F FFFFH,共 2222^{22} 个地址单元,因为按字节编址,所以容量为 4MB4\text{MB}。数据线为 32 位,意味着存储器的数据总线位宽为 32 位。为了与 32 位数据线连接,必须使用 4 片 512K×8512\text{K} \times 8 位的芯片进行位扩展,组成一个 512K×32512\text{K} \times 32 位(即 2MB2\text{MB})的芯片组。然后再进行字扩展,需要 4MB2MB=2\frac{4\text{MB}}{2\text{MB}} = 2 组这样的芯片组。因此,总芯片数为 4×2=84 \times 2 = 8 片。
  • B [错误]:此选项计算出的芯片数为 16,可能是字扩展或位扩展倍数计算错误。
  • C [错误]:此选项计算出的芯片数为 32,可能是误将 32 位数据线与其它参数混淆计算。
  • D [错误]:此选项计算出的芯片数为 64,计算过程有误。

(7) 答案:C

解析

  • A [错误]:此范围是前 256MB256\text{MB} 的地址区间,若 RAM 在连续低地址区,这应属于 RAM 区的一部分。
  • B [错误]:此区间为 256MB256\text{MB}768MB768\text{MB} 之间的地址区间,属于 RAM 区的一部分。
  • C [正确]:CPU 有 30 根地址线,按字节编址,最大可寻址空间为 230 B=1GB2^{30}\text{ B} = 1\text{GB},对应的十六进制地址范围为 0000 0000H ~ 3FFF FFFFH。RAM 区和 ROM 区容量之比为 3:1,则 RAM 区占 34×1GB=768MB\frac{3}{4} \times 1\text{GB} = 768\text{MB},ROM 区占 14×1GB=256MB\frac{1}{4} \times 1\text{GB} = 256\text{MB}。由于 RAM 在连续低地址区,ROM 在连续高地址区,ROM 的起始地址为整个空间的 34\frac{3}{4} 处,即 768MB768\text{MB} 边界点(对应十六进制地址为 3000 0000H)。因此,ROM 的地址范围为 3000 0000H ~ 3FFF FFFFH
  • D [错误]4000 0000H 超出了 30 根地址线所能表示的最大范围。

(8) 答案:C

解析

  • A [错误]:单个芯片容量为 8192×8192×88192 \times 8192 \times 8 位 = 64MB64\text{MB},8 个芯片组成的内存条总容量为 8×64MB=512MB8 \times 64\text{MB} = 512\text{MB}。因此该叙述是正确的。
  • B [错误]:存储器总线宽度为 64 位,每个芯片的数据线宽度只有 8 位,需要 8 个芯片采用多模块位扩展/交叉编址方式并行工作。因此该叙述是正确的。
  • C [正确]:该芯片容量为 64MB64\text{MB},行、列数各为 8192=2138192 = 2^{13}。DRAM 芯片通常采用地址复用技术,行地址与列地址分时复用同一组地址引脚,所以仅需要 13 根地址引脚即可,而非 26 根。因此该叙述是错误的,符合题意。
  • D [错误]:DRAM 芯片每次读出一整行,行缓冲区的大小与列数和芯片位宽对应,即为 8192×88192 \times 8 位。因此该叙述是正确的。

(9) 答案:C

解析

  • A [错误]:此选项行数 r=2048=211r=2048 = 2^{11},列数 c=1c=1。复用后地址引脚数为 max(11,0)=11\max(11, 0) = 11 根,引脚数不是最少,且行数过多导致刷新开销极大。
  • B [错误]:此选项虽然复用后地址引脚数也是 max(6,5)=6\max(6, 5) = 6 根,但行数为 64。DRAM 刷新是以行为单位进行的,行数越多刷新次数越多,开销越大。因此在引脚数最少(均为 6 根)的情况下,应该选择行数更少的方案。
  • C [正确]:芯片容量为 2K×12\text{K} \times 1 位,总存储单元数为 20482048。行数 rr 与列数 cc 的乘积需满足 r×c=2048r \times c = 2048。由于 DRAM 采用地址复用技术,所需的地址引脚数为 max(log2r,log2c)\max(\log_2 r, \log_2 c)。为使引脚数最少,rrcc 应尽可能接近。又因为 DRAM 刷新以“行”为单位,为了尽量减少刷新次数以降低刷新开销,行数 rr 应尽可能小。当 max(log2r,log2c)\max(\log_2 r, \log_2 c) 取得最小值 66 时,满足条件的组合有 32×6432 \times 6464×3264 \times 32。选择行数较小的一方,即 r=32r=32(5 位地址线),c=64c=64(6 位地址线),此时地址引脚数仅为 max(5,6)=6\max(5, 6) = 6 根,且行数最少,刷新开销最小。
  • D [错误]:此选项行数 r=1r=1,列数 c=2048c=2048。复用后的地址引脚数为 max(0,11)=11\max(0, 11) = 11 根,引脚数不是最少。

(10) 答案:B

解析

  • A [错误]10.66GB/s 只是单通道内存总线的带宽,忽略了系统采用的 3 通道配置。
  • B [正确]:工作频率为 1333MHz1333\text{MHz},总线宽度为 64 位(即 8 B8\text{ B})。单通道的带宽为 1333M×8 B/s10.66 GB/s1333\text{M} \times 8\text{ B/s} \approx 10.66\text{ GB/s}。由于系统采用 3 通道内存总线,因此存储器总线的总带宽为 10.66 GB/s×332 GB/s10.66\text{ GB/s} \times 3 \approx 32\text{ GB/s}
  • C [错误]:此项计算结果为 64 GB/s64\text{ GB/s},数值与 3 通道实际带宽不符。
  • D [错误]:此项计算结果为 96 GB/s96\text{ GB/s},数值计算有误。

(11) 答案:D

解析

  • A [错误]:计算体号:8004mod4=08004 \bmod 4 = 08008mod4=08008 \bmod 4 = 0。虽然它们都映射到 0 号模块,但在访问序列中它们之间相隔了 4 次访问。由于交叉存储器的周期为 4,此时 0 号模块已被释放,因此不会发生冲突。
  • B [错误]8002mod4=28002 \bmod 4 = 28007mod4=38007 \bmod 4 = 3,映射到不同的模块(体 2 和体 3),不会发生冲突。
  • C [错误]8001mod4=18001 \bmod 4 = 18008mod4=08008 \bmod 4 = 0,映射到不同的模块(体 1 和体 0),不会发生冲突。
  • D [正确]:在 4 体低位交叉存储器中,地址 AA 对应的存储体模块号为 Amod4A \bmod 4。计算访问序列中各地址的体号:800518005 \to 1800628006 \to 2800738007 \to 3800808008 \to 0800118001 \to 1800228002 \to 2800338003 \to 3800408004 \to 0800008000 \to 0。可以看到,地址 8004800480008000 均映射到 0 号模块,且在访问序列中紧挨着连续被访问。因为同一个物理存储体在完成一次读写周期前无法立即接受下一次访问,因此会发生访存冲突。

(12) 答案:B

解析

  • A [错误]:SRAM使用双稳态触发器保存数据,只要电源通电,数据就会一直保持,不需要刷新。
  • B [正确]:SDRAM是一种动态随机存储器,其内部依靠电容存储电荷来保存数据。由于电容漏电,电荷会逐渐流失,必须在工作期间对其进行周期性的刷新以维持信息不丢失。
  • C [错误]:ROM属于非易失性存储器,断电后数据不丢失,正常工作期间不需要刷新。
  • D [错误]:FLASH也是一种非易失性存储器,无需刷新即可长期保留数据。

(13) 答案:B

解析

  • A [错误]:EPROM是半导体只读存储器,采用随机存取方式,访问任何存储单元的时间都是相同的。
  • B [正确]:CD-ROM属于光盘存储器,它是通过激光束扫描螺旋形光道来寻找数据,寻道时间与当前的物理位置有关,因此不属于随机存取存储器。
  • C [错误]:DRAM属于半导体随机存储器,采用随机存取方式。
  • D [错误]:SRAM属于半导体随机存储器,采用随机存取方式。

(14) 答案:A

解析

  • A [正确]:闪存可以读写,但由于其特殊的物理结构,在写入数据前必须先对所在的扇区或块进行擦除操作,导致其写入速度明显慢于读取速度。因此“读、写速度一样快”的叙述错误,符合题意。
  • B [错误]:闪存的存储元主要由浮栅 MOS 管组成,确实属于半导体存储器。该叙述正确。
  • C [错误]:闪存属于非易失性存储器,掉电后信息不丢失。该叙述正确。
  • D [错误]:闪存支持随机读取,常用来制作固态硬盘等外部存储器。该叙述正确。

(15) 答案:A

解析

  • A [正确]:在程序段中,外层循环 ii 从 0 到 9,内层循环总是从 a[0]a[0] 顺序访问到 a[i]a[i]
    • 时间局部性:同一数组元素(例如 a[0]a[0])会在外层循环的多个连续轮次中被反复访问,因此具有时间局部性。
    • 空间局部性:内层循环中是连续顺序访问数组相邻单元,因此具有空间局部性。
  • B [错误]:忽略了数组同一元素在后续循环中会被再次读取的事实,错误地认为无时间局部性。
  • C [错误]:忽略了内层循环连续访问相邻地址单元的特征,错误地认为无空间局部性。
  • D [错误]:错误地排除了时间局部性和空间局部性。

(16) 答案:C

解析

  • A [错误]:计算错误,混淆了块号或组号的计算规则。
  • B [错误]:此组号不正确,未正确计算块号 44 对组数 88 取模的结果。
  • C [正确]:按字节编址,每个主存块大小为 32B32\text{B}。主存 129129 号单元所在的主存物理块号为 129/32=4\lfloor 129 / 32 \rfloor = 4。由于 Cache 共有 16 块且采用二路组相联映射,因此 Cache 的组数为 162=8\frac{16}{2} = 8 组。根据组相联映射的规则,主存块号为 4 的块映射到 Cache 的组号为 4mod8=44 \bmod 8 = 4
  • D [错误]:计算出的组号不正确。

(17) 答案:A

解析

  • A [正确]:Cache 有 4 行,采用二路组相联映射,故组数为 22 组。由于访问的所有主存地址均为偶数,它们对组数 2 取模的结果均为 0,所以全部映射到 Cache 组 0。 具体模拟过程(假设数组左端为最久未用,右端为最新访问):
    1. 访问 0:组 0 状态为 [0],未命中。
    2. 访问 4:组 0 状态为 [0, 4],未命中。
    3. 访问 8:替换 0,状态为 [4, 8],未命中。
    4. 访问 2:替换 4,状态为 [8, 2],未命中。
    5. 访问 0:替换 8,状态为 [2, 0],未命中。
    6. 访问 6:替换 2,状态为 [0, 6],未命中。
    7. 访问 8:替换 0,状态为 [6, 8],未命中。
    8. 访问 6:命中,状态更新为 [8, 6],命中 1 次。
    9. 访问 4:替换 8,状态为 [6, 4],未命中。
    10. 访问 8:替换 6,状态为 [4, 8],未命中。 综上,只有第 8 次访问(地址 6)命中,总命中次数为 1。
  • B [错误]:此项计算结果为 2 次,原因为对 LRU 替换状态更新逻辑或组号分配有误。
  • C [错误]:此项计算结果为 3 次,存在计算失误。
  • D [错误]:此项计算结果为 4 次,计算有误。

(18) 答案:C

解析

  • A [错误]:可能在计算时漏掉了修改位(脏位)或有效位,或者块内偏移位数计算有误。
  • B [错误]:可能漏掉了修改位,仅计算了有效位和标记位。
  • C [正确]
    • Cache 数据容量为 4K4\text{K} 字,每个主存块为 4 个字,故 Cache 的总行数为 4K4=1024\frac{4\text{K}}{4} = 1024 行。
    • 主存按字节编址,块大小为 4×32=128=16B4 \times 32\text{位} = 128\text{位} = 16\text{B},因此块内地址占 log216=4\log_2 16 = 4 位。
    • 采用直接映射,Cache 的行索引占用 log21024=10\log_2 1024 = 10 位。
    • 标记(Tag)的位数 = 主存地址位数 - 索引位数 - 偏移位数 = 32104=1832 - 10 - 4 = 18 位。
    • 采用写回策略,每个 Cache 行除了数据区和标记字段外,还需包含 1 位有效位和 1 位修改位(脏位),故每行额外的控制信息和标记项总位数为 18+1+1=2018 + 1 + 1 = 20 位。
    • 每一个 Cache 行的总位数为:数据区 128128 位 + 标记控制项 2020 位 = 148148 位。
    • Cache 总容量 = 10241024×148\times 148 位 = 148K148\text{K} 位。
  • D [错误]:计算错误,超出了合理计算范围。

(19) 答案:A

解析

  • A [正确]
    • Cache 行数 = 32KB32B=1024=210\frac{32\text{KB}}{32\text{B}} = 1024 = 2^{10} 行。
    • 块内偏移位数占 log232=5\log_2 32 = 5 位。
    • 直接映射的行索引占用 log21024=10\log_2 1024 = 10 位。
    • 标记(Tag)的位数 = 32105=1732 - 10 - 5 = 17 位。
    • 回写策略下,每一行应包含:数据区 32×8=25632 \times 8 = 256 位,标记字段 1717 位,有效位 1 位,脏位 1 位。
    • Cache 行的总位数 = 256+17+1+1=275256 + 17 + 1 + 1 = 275 位。
  • B [错误]:可能漏掉了脏位或有效位中的一位。
  • C [错误]:仅计算了数据位与标记位数再加上少许控制位,不符合完整行结构。
  • D [错误]:计算出的位数过小,遗漏了某些必要控制字段。

(20) 答案:A

解析

  • A [正确]
    • Cache 总行数 = 32KB64B=512\frac{32\text{KB}}{64\text{B}} = 512 行。采用 8 路组相联映射,即每组包含 8 个 Cache 行,组数为 5128=64\frac{512}{8} = 64 组。
    • 当 CPU 访存时,首先根据主存地址中的组索引字段定位到具体的某一组,然后需要将主存地址的标记与该组内的所有 8 行标记进行并行比较。因此,所需的比较器个数等于每组的行数,即 8 个。
    • 主存地址共 32 位。块大小为 64B64\text{B},故块内偏移地址为 log264=6\log_2 64 = 6 位;组数为 64,故组索引为 log264=6\log_2 64 = 6 位。
    • 标记的位数 = 326(组索引)6(块内偏移)=2032 - 6\text{(组索引)} - 6\text{(块内偏移)} = 20 位。比较器要比较的就是标记,因此比较器的位数等于标记的位数,即 20 位。
  • B [错误]:比较器的位数计算错误,未正确扣除组索引和块内偏移位数。
  • C [错误]:错误地以组数(64)作为比较器个数,比较器应与组内的路数(8)相匹配。
  • D [错误]:比较器个数和位数计算均有误。

(21) 答案:D

解析

  • A [错误]:缺失损失由主存的访问速度和 Cache 块的大小决定,与指令和数据 Cache 是否分离无关。
  • B [错误]:分离 Cache 虽然能避免指令与数据之间的相互替换,但由于各自容量变小,并不一定会提高命中率。
  • C [错误]:降低平均访存时间是最终带来的效果,但首要设计目的是为了解决流水线中的结构冲突。
  • D [正确]:在具有流水线设计的 CPU 中,流水线的取指阶段需要从存储器读取指令,而访存阶段需要从存储器读写数据。如果将指令和数据存放在同一个统一的高速缓存中,当两个阶段在同一个时钟周期内进行时,就会发生对同一个 Cache 的访问冲突(结构冲突)。将高速缓存分离为指令高速缓存 and 数据高速缓存,使得取指和数据读写可以并行独立进行,从而有效减少了指令流水线的资源冲突。

(22) 答案:B

解析

  • A [错误]:访问越权(如只读页面尝试写入)是通过检查页表项中的保护位来完成的,这在 MMU 地址转换期间发生。
  • B [正确]:MMU 的职责是进行虚拟地址到物理地址的转换。当物理地址生成后,CPU 才会将物理地址送往高速缓存进行检索。如果数据不在高速缓存中,属于高速缓存缺失,这一事件是由高速缓存控制器在地址转换完成后检测的,与 MMU 的虚实地址转换过程无关。
  • C [错误]:页面缺失(缺页)是通过检查页表项的有效位(存在位)是否为 0 来判断的,这发生在 MMU 查表进行地址转换的过程中。
  • D [错误]:TLB 缺失是指快表未命中,MMU 在将虚拟地址转换为物理地址的第一步就是查询快表,若快表中没有该虚拟页号的记录,则检测出快表缺失。

(23) 答案:D

解析

  • A [错误]:高速缓存 - 主存层次的数据传输和调度以主存块为单位,而主存 - 外存层次以页为基本调度单位。该叙述正确。
  • B [错误]:高速缓存的缺失替换为了追求速度完全由硬件逻辑实现;而虚拟存储器的缺页处理涉及慢速外存访问,开销很大,所以采用操作系统内核软件来调度和实现替换算法。该叙述正确。
  • C [错误]:高速缓存可根据设计需求选用写穿或回写法;而虚拟存储器层次由于外存的写入速度极慢,为了避免频繁写磁盘,必须采用回写法。该叙述正确。
  • D [正确]:高速缓存 - 主存层次由于检索速度要求极高,可采用直接映射、组相联映射或全相联映射;但主存 - 外存层次发生页面缺失时需要访问慢速磁盘,开销巨大,为了尽可能降低缺页率,必须采用映射最灵活、空间利用率最高、冲突概率最低的全相联映射,而不是直接映射。因此该叙述是错误的,符合题意。

(24) 答案:C

解析

  • A [错误]:误用十六进制表示下的虚拟页号 82(实际对应十进制虚页号 130)去查找虚页号为 82 的表项。虚页号 82 的存在位为 0,这会导致误判为缺页异常。
  • B [错误]:计算错误,对应十进制的 129 号虚页的物理转换结果。
  • C [正确]:虚拟地址为 0008 2840H。页大小为 4KB=212 B4\text{KB} = 2^{12}\text{ B},即低 12 位为页内偏移量。
    • 去掉页内偏移量后,剩余的高位部分即为虚拟页号(十六进制为 00082H,转换为十进制为 8×16+2=1308 \times 16 + 2 = 130)。
    • 查页表项,当虚页号为 130 时,存在位(有效位)为 1,说明该页面已装入主存。
    • 其对应的物理页框号(实页号)为 018H
    • 将物理页框号 018H 与页内偏移量 840H 拼接,可得最终转换后的主存物理地址为 01 8840H
  • D [错误]:虚页号 130 的存在位为 1,说明页面在内存中,不会触发缺页异常。

(25) 答案:B

解析

  • A [错误]:由于高速缓存采用了写穿策略,向高速缓存写入数据时必须同步写入主存,所以至少会有 1 次主存写入操作,无法实现 0 次访存。
  • B [正确]:指令的执行可分为以下几个阶段:
    1. 取指令:若指令所在的页面在主存中,快表命中且高速缓存命中,则无需访问主存。
    2. 源操作数读取:需要读取 xaddr 处的数据 x。若 xaddr 所在的物理页面已在主存中,快表命中且高速缓存命中,则同样无需访问主存。
    3. 数据写回:计算 x+3x+3 并将新值写回 xaddr。由于高速缓存使用的是写穿策略,向高速缓存中写入数据时,必须同时将新数据写入主存。这步必须进行 1 次主存写入。 综上,最理想情况下(全部命中),完成该指令功能至少需要访问主存 1 次。
  • C [错误]:高估了最少访存次数,当快表和高速缓存均命中时,读操作不需要访问主存。
  • D [错误]:计算错误。

(26) 答案:D

解析

  • A [错误]:这属于全不命中的常见情况。当要访问的页面不在主存中时,TLB中自然没有该页表项,且高速缓存(Cache)中也不可能存有该页的数据。这种情况可能发生。
  • B [错误]:当访问的页面在主存中,但其页表项尚未调入快表,而页面对应的块刚好被缓存到了高速缓存中。这种情况可能发生。
  • C [错误]:页面已调入主存且其页表项在快表中,但该地址的数据尚未调入高速缓存中。这种情况可能发生.
  • D [正确]:快表是主存页表的一小部分缓存拷贝。如果快表命中,意味着对应虚拟页的页表项已在快表中,该页表项指示的页面必定已经存在于主存中。此时不可能发生页面未命中。因此,“TLB 命中,Page 未命中”是逻辑上相矛盾的,不可能发生,符合题意。

(27) 答案:A

解析

  • A [正确]:虚拟地址为 03FFF180H。由于页面大小为 4KB=212 B4\text{KB} = 2^{12}\text{ B},页内偏移量占低 12 位(即十六进制低 3 位 180H)。
    • 虚拟地址的高 20 位(即十六进制前 5 位 03FFFH)为虚拟页号。
    • 检索快表表项,第 4 行的标记正好为 03FFFH,且其有效位为 1。
    • 该表项对应的物理页框号为 0153H
    • 将物理页框号 0153H 与页内偏移量 180H 拼接,可得最终转换后的物理地址为 0153180H
  • B [错误]:此项使用了错误的快表项进行转换(对应的是第 2 行的物理页框号 0035H,但其 Tag 3FFF1H 与当前的虚拟页号不匹配)。
  • C [错误]:快表中存在有效且匹配虚拟页号的表项,属于快表命中,不属于快表缺失。
  • D [错误]:快表命中说明页面必定在主存中,不会发生缺页。

(28) 答案:C

解析

  • A [错误]:计算错误,可能在页内偏移或组索引位数计算上存在偏差。
  • B [错误]:计算有误,未能正确算出标记字段的位数。
  • C [正确]
    • 页大小为 1KB=210 B1\text{KB} = 2^{10}\text{ B},主存按字节编址,因此页内偏移为 10 位。
    • 虚拟地址共 32 位,故虚拟页号的位数为 3210=2232 - 10 = 22 位。
    • 快表有 32 个表项,采用 4 路组相联映射,每组有 4 个表项,快表的总组数为 324=8\frac{32}{4} = 8 组。
    • 组索引所需的位数为 log28=3\log_2 8 = 3 位。
    • 在组相联映射下,标记字段的位数 = 虚拟页号位数 - 组索引位数 = 223=1922 - 3 = 19 位。
  • D [错误]:计算有误,未正确划分子字段位数。

(29) 答案:D

解析

  • A [错误]:当 MMU 访问页表检测到对应虚拟页的存在位为 0 时,就会向 CPU 发出缺页中断信号。这确实是在地址转换时由 CPU检测到的一种异常。该叙述正确。
  • B [错误]:发生缺页异常后,CPU 会转入内核态,执行由操作系统提供的缺页异常处理程序。该叙述正确。
  • C [错误]:操作系统会根据页面故障的逻辑地址,到外存中找到该页面的映像,并将其读入主存的空闲页框中。该叙述正确。
  • D [正确]:缺页处理属于故障,当页面从外存调入主存并更新完页表后,发生缺页的那条指令必须被重新执行,以完成其访存操作。不能直接执行下一条指令。因此该叙述是错误的,符合题意。

(30) 答案:D

解析

  • A [错误]:快表和高速缓存均基于程序局部性原理来缓存频繁访问的数据和页表项。该叙述正确。
  • B [错误]:当快表缺失时,需要访问保存在主存中的完整页表;当高速缓存未命中时,同样需要访问主存来调入所需的数据块。该叙述正确。
  • C [错误]:高速缓存的缺失处理由硬件实现,快表的缺失处理也可以由硬件实现。该叙述正确。
  • D [正确]:为了使快表和高速缓存的读写延迟能够与 CPU 极高的工作频率相匹配,它们通常采用访问速度极快的SRAM来构建,而主存才使用DRAM。因此该叙述是错误的,符合题意。

4.3 简答题详细解答#

(1) 计算机系统中采用层次化存储体系结构的目的是什么?
:目的是为了解决存储器在容量、速度和成本三者之间难以调和的物理矛盾。通过在 CPU 和主存之间引入高速、小容量的 Cache,在主存外侧引入大容量、低成本 of 辅存,利用程序的局部性原理,使整个存储系统在接近最快存储器(Cache)速度的同时,获得了接近最便宜存储器(辅存)的巨大容量与低廉的单位平均成本。
(2) 为什么在存储器芯片中设置片选输入端?
:在计算机系统中,主存通常由多块存储芯片进行字扩展或位扩展组合而成。片选输入端(CS 或 CE)用于控制该芯片是否被当前总线操作选中。只有当片选端有效时,该芯片的内部译码与读写电路才工作,允许与总线进行数据交换。这可以防止多个芯片同时输出数据导致总线数据冲突,是进行字扩展设计的基础。
(3) 动态 MOS 存储器为什么要刷新?如何刷新?
:DRAM 是利用栅极电容上的电荷状态来保存二进制信息。由于电容非常微小,其电荷会由于漏电而在几毫秒内缓慢流失,导致信息丢失。因此,必须在电荷流失殆尽前定期对芯片进行刷新。
刷新是以“行”为单位进行的。刷新时,由刷新控制器依次产生行地址,并发出刷新控制信号,对该行内的所有存储元进行一次“读出-重写”操作。常见的刷新方式有三种:集中刷新、分散刷新和异步刷新。
(4) 试述多体交叉存储器的设计思想和实现方法。
:设计思想是利用多个物理上独立、具有相同容量和字长的存储体组成存储器系统。通过对地址的低位进行交叉编址,使 CPU 能够以流水线重叠或并行的方式访问不同的物理存储体,从而提升主存带宽。
(5) 为什么说 Cache 对程序员是透明的?
:因为 Cache 的地址映射、命中检测、缺失调块以及数据替换等一系列操作,完全是由 CPU 内部的 Cache 控制器硬件电路自动完成的。对于系统级或应用程序员来说,在编写代码时只需要使用主存的物理地址或虚拟地址,不需要在指令中显式地对 Cache 进行任何读写或替换控制。因此,Cache 的物理存在和运行机制在软件逻辑层面上是不可见的。
(6) 直接相联映射方式下为什么不需要使用替换算法?
:直接相联映射规定主存中的每一个块只能映射到 Cache 的一个唯一、固定的行中。当 CPU 访问某主存块发生缺失,需要将其调入 Cache 时,由于该块在 Cache 中只有一个专属的位置,如果该位置当前已被其他主存块占用,新调入的块只能无条件将其覆盖。由于没有任何选择空间,因此不需要替换算法。
(7) 为什么要考虑 Cache 的一致性?
:在计算机系统中,同一份数据可能会同时存在于主存中以及 Cache 的拷贝中。在多处理器架构中,不同处理器的 Cache 可能存有同一主存单元的多份拷贝;或者在 I/O 设备进行 DMA 传送时直接修改了主存的数据。如果某个处理器或 I/O 设备修改了其中一份拷贝,而其他拷贝或主存中的原数据未能及时同步更新,就会导致不同的部件读取到不同的陈旧数据,引发程序运行错误。因此,必须通过一致性协议来确保所有部件看到的数据始终保持一致。
(8) 替换算法有哪几种?它们各有何优缺点?
:常用的替换算法有以下四种:

  • 先进先出算法(FIFO):优点是实现简单,缺点是未考虑程序的局部性规律,可能会频繁淘汰最近仍在使用的块,甚至会出现 Belady 异常。
  • 近期最少使用算法(LRU):优点是严格依据局部性原理,命中率非常高,是目前最常用的主流算法;缺点是需要维护复杂的计数器以记录各块的新鲜度,硬件开销大。
  • 最不经常使用算法(LFU):优点是将访问次数最少的块淘汰,能较好反映块的历史使用频次;缺点是无法及时淘汰在程序前期被频繁访问但后期不再使用的“垃圾块”。
  • 随机替换算法(RAND):优点是硬件结构最简单;缺点是命中率不稳定,完全依靠概率。

4.4 至 4.22 计算与分析大题步骤及详细解答#

4.4#

  1. 存储器容量为 32KB = 32×1024×832 \times 1024 \times 8 位。
  2. 若按 16 位字编址,则存储器的字容量为:
    字数=32KB÷2B=16K=16384\text{字数} = 32\text{KB} \div 2\text{B} = 16\text{K} = 16384 个字。
  3. 地址寄存器(MAR)的位数取决于字数。因为 16K=21416\text{K} = 2^{14},所以地址寄存器应是 14 位
  4. 数据寄存器(MDR)的位数取决于字长,字长为 16 位,因此数据寄存器是 16 位

4.5#


使用 4 个 32K×832\text{K}\times 8 位的 SRAM 芯片,可以通过不同的排列组合进行字扩展或位扩展,设计出以下三种不同容量和字长的存储器:

  1. 设计方案一:容量 32K×3232\text{K}\times 32 位(容量 128KB,字长 32 位)
    • 实现方法:进行位扩展。将 4 个芯片并联,其地址线 A14A0A_{14}\sim A_0 均连接到 CPU 的地址线;4 个芯片的片选信号线 CS\overline{\text{CS}} 并联后接 CPU 的访存控制线;数据线分别连接到 CPU 32位数据总线的不同字节段 D0D7D_0\sim D_7D8D15D_8\sim D_{15}D16D23D_{16}\sim D_{23}D24D31D_{24}\sim D_{31}
  2. 设计方案二:容量 128K×8128\text{K}\times 8 位(容量 128KB,字长 8 位)
    • 实现方法:进行字扩展。将 4 个芯片的地址线 A14A0A_{14}\sim A_0 和数据线 D7D0D_7\sim D_0 分别并联。使用 CPU 的高位地址线 A16,A15A_{16}, A_{15} 通过一个 242\:4 译码器,产生四个独立的片选信号分别连接到 4 个芯片的片选端 CS\overline{\text{CS}}
  3. 设计方案三:容量 64K×1664\text{K}\times 16 位(容量 128KB,字长 16 位)
    • 实现方法:字位同时扩展。将 2 个芯片作为一组进行位扩展组成 32K×1632\text{K}\times 16 位的单元(共 2 组)。再利用高位地址线 A15A_{15} 经过一个非门译码,分别控制两组芯片的片选端。

4.6#

  1. 分析地址空间与容量需求
    • 只读存储区(ROM):地址范围 30000H ~ 3FFFFH。其大小为 3FFFFH - 30000H + 1 = 10000H 字节 = 64KB。
    • 可读写存储区(RAM):目标总容量为 256K×8256\text{K}\times 8 位 = 256KB。由于 ROM 占用了 64KB,其余的 256KB - 64KB = 192KB 空间为 RAM 区。
  2. 芯片数量计算
    • ROM 区:需要 64KB。用 64K×464\text{K}\times 4 位的 ROM 芯片,需要进行位扩展。芯片数 = 64KB÷(64K×4)=264\text{KB} \div (64\text{K}\times 4\text{位}) = 2 片。
    • RAM 区:需要 192KB。用 32K×832\text{K}\times 8 位的 RAM 芯片,需要进行字扩展。芯片数 = 192KB÷32KB=6192\text{KB} \div 32\text{KB} = 6 片。
  3. 地址分配与片选译码设计
    • 地址线共 18 位(A17A0A_{17}\sim A_0),因为 256KB=218256\text{KB} = 2^{18}
    • 地址高两位 A17,A16A_{17}, A_{16} 决定地址区间:
      • ROM区地址:30000H ~ 3FFFFH。当 A17A16=11A_{17}A_{16} = 11 时选通 ROM,此时片选信号 CSROM=A17A16\overline{\text{CS}}_{\text{ROM}} = \overline{A_{17} \cdot A_{16}}
      • RAM区地址:分为 6 组 32KB(地址线需 15 位 A14A0A_{14}\sim A_0)。可以用高位地址线 A17,A16,A15A_{17}, A_{16}, A_{15} 经由译码器输出分别选通 6 组 RAM。

4.7#

  1. 容量与芯片分析
    • 主存总容量为 128K×16128\text{K}\times 16 位。按字节编址,总容量为 256KB。
    • ROM 区地址范围:18000H ~ 1FFFFH。其大小为 1FFFFH - 18000H + 1 = 8000H 字节 = 32KB。由于字长 16 位,对应的只读区域为 16K×1616\text{K}\times 16 位。
    • 芯片选型:ROM 芯片规格为 32K×1632\text{K}\times 16 位,使用其一半的容量。
    • RAM 区:其余空间为 RAM 区。RAM 总大小 = 256KB - 32KB = 224KB,对应 112K×16112\text{K}\times 16 位。使用 16K×816\text{K}\times 8 位的 SRAM 芯片,每 2 片进行位扩展组成 16K×1616\text{K}\times 16 位的一组。共需要 112K / 16K = 7 组,芯片总数 = 7 × 2 = 14 片。
  2. 连接设计要点
    • 地址线 17 位(A16A0A_{16}\sim A_0)。
    • 译码电路:使用 383\:8 译码器对高位地址进行译码,输出的 8 个片选信号分别对应 1 组 ROM 和 7 组 RAM。

4.8#

  1. 容量为 64K × 1 位,则存储元个数为 64K = 2162^{16},正常的地址线需要 16 根。
  2. 该芯片为动态 RAM(DRAM),采用地址复用技术,行地址与列地址分时复用,因此所需的地址引脚数减半,为 16 / 2 = 8 根。
  3. 芯片必须的引脚包括:地址线 8 根,数据线 1 根,行选通信号 RAS\overline{\text{RAS}} 1 根,列选通信号 CAS\overline{\text{CAS}} 1 根。
  4. 除电源、地线及写使能外的最小引脚数 = 地址线(8) + 数据线(1) + RAS\overline{\text{RAS}}(1) + CAS\overline{\text{CAS}}(1) = 11 根

4.9#

  1. 控制参数1M×81\text{M}\times 8 位由 64K×164\text{K}\times 1 位芯片构成,每个芯片有 256 行。
  2. 异步刷新计算
    • 异步刷新是在 2ms 内将所有 256 行轮流刷新一遍。
    • 产生刷新信号的间隔时间 = 2ms ÷ 256 行 = 7.81μs7.81\mu\text{s}(或约 7.8μs7.8\mu\text{s})。
  3. 集中刷新计算
    • 读写周期为 0.5μs0.5\mu\text{s}。刷新一行需要一个读写周期。
    • 存储器刷新一遍最少需要的读写周期数 = 芯片的行数 = 256 个周期
    • CPU 的死时间 = 256 × 0.5μs0.5\mu\text{s} = 128μs128\mu\text{s}

4.10#

  1. 刷新方式选择
    • 存储器读写周期为 0.5μs0.5\mu\text{s},CPU 要求在 1μs1\mu\text{s} 内至少能访问存储器一次。
    • 如果采用集中刷新方式,刷新期间会产生 128μs128\mu\text{s} 的死时间,无法满足 CPU 在 1μs1\mu\text{s} 内必须访问的要求。
    • 如果采用分散刷新方式,每个工作周期分为读写和刷新两部分,存取周期拉长为 0.5μs×2=1μs0.5\mu\text{s} \times 2 = 1\mu\text{s},CPU 刚好可以在 1μs1\mu\text{s} 内访问一次,且没有死时间。但分散刷新过于频繁,降低了系统性能。
    • 如果采用异步刷新方式,每隔 7.81μs7.81\mu\text{s} 才刷新一行(耗时 0.5μs0.5\mu\text{s}),只要避开 CPU 访问时刻,CPU 的访问不会被长时间阻塞,最合适。
    • 结论:采用异步刷新分散刷新均可,其中以异步刷新在维持系统整体性能上最为合适。
  2. 刷新信号的产生周期
    • 16K×116\text{K}\times 1 位芯片有 128 行。
    • 刷新间隔为 2ms,所以产生刷新信号的周期 = 2ms ÷ 128 行 = 15.625μs15.625\mu\text{s}

4.11#


Cache 容量为 2142^{14} 块(16384 块),每块 4B。主存按字节编址。
块内偏移(Offset)占 2 位(22=4B2^2 = 4\text{B})。Cache 索引(Index)占 14 位。

  1. 全相联映射
    • 映射规则:主存块可以放入 Cache 的任意空闲行。Cache 标记项保存物理块号(即主存地址的高 30 位)。
    • 标记内容:地址去掉低 2 位后的值。例如地址 000008H,其标记为 000002H
  2. 直接相联映射
    • 映射规则:Cache 行号 = 物理块号 mod 2142^{14}
    • 地址划分:高位为 Tag,中间 14 位为 Index,低 2 位为 Offset。
      • 地址 000000H:Index = 0,Tag = 0。装入 Cache 的第 0 块。
      • 地址 000008H:Index = 2,Tag = 0。装入 Cache 的第 2 块。
  3. 四路组相联映射
    • 组数 = 214÷4=2122^{14} \div 4 = 2^{12} 组。组索引(Index)占 12 位。高位为 Tag,低 2 位为 Offset。

4.12#


(1) 主存地址和 Cache 地址位数

  • 主存包含 4096 个存储块,每块 128 个字。主存总字数 = 4096×128=2194096 \times 128 = 2^{19} 个字。因为访问地址为字地址,所以主存地址有 19 位
  • Cache 由 64 个存储块构成,每块 128 字。Cache总字数 = 64×128=21364 \times 128 = 2^{13} 字。所以 Cache 地址有 13 位
    (2) 主存地址划分(四路组相联):
  • 块内字地址(Offset):7 位(因为每块有 128=27128 = 2^7 个字)。
  • Cache 共有 64 块,四路组相联表示每组有 4 块。组数 = 64 / 4 = 16 组。组号(Index)占 4 位(因为 16=2416 = 2^4)。
  • 标记(Tag):19 - 4 - 7 = 8 位。
  • 划分结构[ Tag (8位) ] + [ 组号 (4位) ] + [ 块内字地址 (7位) ]

4.13#


(1) Cache 命中率计算

  • Cache 容量为 16KB,每字 32 位(4 字节),包含的字数 = 16KB ÷ 4B = 4K 字。
  • 块大小为 8 个字 = 32B。Cache 的总行数 = 16KB ÷ 32B = 512 行。采用四路组相联,组数 = 512 ÷ 4 = 128 组。
  • CPU 依次从主存第 0 到 99 号字单元读出 100 个字。因为 100 个字运小于 Cache 的总容量(4K 字),这 100 个字可以完全被装入 Cache 中,且不会发生替换。
  • 第一次循环时,Cache 为空。读取第 0 单元缺失,调入 0~7 单元。因此 100 个字在第 1 遍中发生的缺失次数 = 100/8=13\lceil 100 / 8 \rceil = 13 次。
  • 在随后的 9 次循环中,所需数据已全部在 Cache 中,命中率为 100%。
  • 总访问次数 = 100 × 10 = 1000 次。总缺失次数 = 13 次。
  • Cache 命中率 H=(100013)÷1000=98.7%H = (1000 - 13) \div 1000 = 98.7\%
    (2) 访问速度提高倍数
  • 设 Cache 访问周期为 tt,则主存访问周期为 10t10t
  • 平均访问时间 Ta=Ht+(1H)10t=0.987t+0.013×10t=0.987t+0.13t=1.117tT_a = H \cdot t + (1 - H) \cdot 10t = 0.987t + 0.013 \times 10t = 0.987t + 0.13t = 1.117t
  • 速度提高倍数 = 原始主存时间 ÷ 平均时间 = 10t÷1.117t8.9510t \div 1.117t \approx 8.95 倍。

4.14#


(1) 数组访问的局部性

  • 二维数组 a[M][N]a[M][N] 在内存中是按行优先顺序连续存放的。
  • 代码 A:内层循环变量为 jj,访问序列为 a[i][0],a[i][1],a[i][0], a[i][1], \ldots。这是严格按照内存物理顺序顺序读取,具有极佳的空间局部性;因为每个数组元素只被访问了一次,所以无时间局部性。
  • 代码 B:内层循环变量为 jj,访问序列为 a[0][i],a[1][i],a[2][i],a[0][i], a[1][i], a[2][i], \ldots。在内存中每次访问都跳过了 NN 个元素。若 NN 较大,每次读取都会发生 Cache 缺失,空间局部性极差;无时间局部性。
    (2) 变量 sum 的局部性
  • 变量 sum 在循环体内部被反复进行读出和累加改写。因此,sum 具有极强的时间局部性;因为它是单量,无空间局部性。
    (3) 循环体指令访问的局部性
  • 循环体内的指令代码在循环期间被 CPU 反复、顺序地取出并执行。因此,指令访问既具有极强的时间局部性,又具有极强的空间局部性。

4.15#


(1) Cache 附加位计算

  • 数据区容量为 32KB,主存块大小 64B,行数 = 32KB ÷ 64B = 512 行。采用 8 路组相联,组数 = 512 ÷ 8 = 64 组。
  • 块内地址占 6 位,组号占 6 位。Tag 位数 = 32 - 6 - 6 = 20 位。
  • 8 路组相联采用 LRU,状态数 8 个,LRU 位占 log28=3\log_2 8 = 3 位。
  • 采用写穿策略,数据修改同步写入主存,因此不需要修改位(脏位)。
  • 结论:标记占 20 位,LRU 占 3 位,没有修改位。
    (2) 数据 Cache 缺失次数
  • 起始地址 0080 00C0H (十进制 192)能被 64 整除,数组首元素刚好与 Cache 的一个块的边界对齐。
  • 数组 s 共有 1024 个元素,占用的内存字节数 = 1024 × 4B = 4096B。主存块大小为 64B,因此数组共占用 4096 ÷ 64 = 64 个主存块。
  • 循环执行 s[k] = 2 * s[k],对每个元素进行一次读取和一次写入。每个块有 16 个整型元素。第一次读取首元素会发生缺失,启动主存块调入,随后的 15 次读取和 16 次写入均命中。
  • 数组占用 64 个块,总缺失次数 = 64 × 1 = 64 次
    (3) 指令访问及缺失处理过程
  • CPU 给出的虚拟地址为 0001 0003H
    1. CPU 首先在 TLB 中进行地址映射获取物理地址。
    1. 得到物理地址后,利用中间 6 位定位到指令 Cache 的对应组,并行读取该组 8 行中的 Tag 字段进行比较。
    1. 若相等且有效位为 1,则命中,根据低 6 位偏移行内字节数据送入 CPU IR。
    1. 若不匹配,则发生缺失。Cache 控制器向主存发起读请求,将该物理块(64B)整体调入 Cache 组内(若该组已满,根据 LRU 算法替换出最久未使用的块),更新该行的 Tag 并将有效位置 1,最后将所需指令送入 CPU。

4.16#


(1) 页面分布及缺页异常次数

  • 数组 a[24][64] 共有 1536 个 int 元素,容量 = 1536 × 4B = 6144B。页面大小为 4KB = 4096B。起始地址 0042 2000H 对齐。
  • 页面 1:存放数组的前 4096B,即前 1024 个元素(对应行 0 至行 15)。
  • 页面 2:存放数组剩余的 2048B,即后 512 个元素(行 16 至行 23)。
  • 分布结论:分布在 2 个页面中。
  • 缺页异常:数组按行优先顺序读取,第一次访问 a[0][0] 时,页面 1 发生缺页;访问到 a[16][0] 时,页面 2 发生缺页。共发生 2 次缺页异常。
  • 页故障地址:分别为 0042 2000H0042 3000H
    (2) 时间局部性不具有时间局部性。因为每一个元素都仅仅被执行了一次写入操作,之后不再被重复访问。
    (3) 地址字段划分与组号计算
  • 块内偏移占 5 位(25=32B2^5 = 32\text{B})。组号(Index)占 6 位(26=642^6 = 64 组)。数据 Cache 组号占 6 位,块内地址占 5 位。
  • a[1][0] 的虚拟地址 = 0042 2000H + (1 × 64 + 0) × 4 = 0042 2100H
  • 其页内偏移与物理地址低位一致为 100H(二进制:0001 0000 0000)。按划分规则:低 5 位 00000 为块内偏移,中间 6 位 001000(十进制为 8)为组号。所以对应的 Cache 组号是 8
    (4) Cache 命中率计算
  • 行优先顺序访问:每个主存块包含的 8 个元素被连续访问。仅在访问块中第 1 个元素时缺失,后 7 个均命中。命中率 = 7 / 8 = 87.5%
  • 列优先顺序访问:每次访问在内存中跳跃了一整行。在访问完一列前,主存块的内容早已被全部替换出 Cache(因为 Cache 总组数仅 64 组,无法同时驻留这么多跳跃地址的块)。所以每次访问都会发生 Cache 缺失,命中率为 0%

4.17#

  1. 虚存容量为 2GB = 2312^{31} 字节,页面大小为 4KB = 2122^{12} 字节。页内偏移地址 VPO = 12 位,虚拟页号 VPN = 31 - 12 = 19 位
  2. 主存容量为 8MB = 2232^{23} 字节,物理地址为 23 位。页内物理偏移地址 PPO = 12 位,物理页框号 PPN = 23 - 12 = 11 位

4.18#


(1) 缺页失效的虚页号有:2、3、5、7
(2) 页大小为 1KB = 1024B。

  • 虚地址 0VPN=0÷1024=0\text{VPN} = 0 \div 1024 = 0。对应实页号为 3,装入位 1。实地址 = 3×1024+0=30723 \times 1024 + 0 = 3072
  • 虚地址 3028VPN=3028÷1024=2\text{VPN} = 3028 \div 1024 = 2。装入位为 0,引发缺页失效,无实地址
  • 虚地址 1023VPN=1023÷1024=0\text{VPN} = 1023 \div 1024 = 0。对应实页号为 3。实地址 = 3×1024+1023=40953 \times 1024 + 1023 = 4095
  • 虚地址 2048VPN=2048÷1024=2\text{VPN} = 2048 \div 1024 = 2。装入位为 0,引发缺页失效,无实地址
  • 虚地址 4096VPN=4096÷1024=4\text{VPN} = 4096 \div 1024 = 4。页表对应实页号为 3,装入位 1。实地址 = 3×1024+0=30723 \times 1024 + 0 = 3072
  • 虚地址 8000VPN=8000÷1024=7\text{VPN} = 8000 \div 1024 = 7。装入位为 0,缺页失效,无实地址

4.19#


(1) 虚拟地址划分

  • 虚拟容量为 2GB = 2312^{31}B,地址为 31 位。页大小为 128KB = 2172^{17}B。页内地址占低 17 位,虚拟页号(VPN)占高 14 位
  • TLB 组数 = 16 ÷ 4 = 4 组。TLB 索引占 2 位
  • 高位中的低 2 位(V18,V17V_{18}, V_{17})为 TLB 索引,高 12 位(V30V19V_{30}\sim V_{19})为 TLB 标记。
    (2) 物理地址划分
  • 主存容量 4MB = 2222^{22}B,物理地址共 22 位。页大小为 128KB,偏移地址占低 17 位,物理页框号占高 5 位
    (3) Cache 地址映射划分
  • Cache 共有 512 行。采用四路组相联,组数 = 512 ÷ 4 = 128 组。
  • 块内偏移占 5 位(25=32B2^5 = 32\text{B})。组号(Index)占 7 位(27=1282^7 = 128 组)。Tag 位数 = 22 - 7 - 5 = 10 位。
  • 划分结构[ Tag (10位) ] + [ 组号 (7位) ] + [ 块内偏移 (5位) ]

4.20#


(1) 虚拟地址 30 位,页大小 4KB(2122^{12}B)。虚页号占高 18 位,页内地址占低 12 位
(2) TLB 共 8 组(23=82^3 = 8),故 TLB 组号占 3 位,低 3 位用作组号,高 15 位用作标记。虚拟地址中,V14V12V_{14}\sim V_{12} 为 TLB 组号,V29V15V_{29}\sim V_{15} 为 TLB 标记。
(3) TLB 替换模拟过程
将访问的虚页号转换为二进制以计算组号(低 3 位):

  • 10 (二进制 001010) → 组号 = 2 (低三位 010)。组 2 状态:[10]。
  • 12 (二进制 001100) → 组号 = 4 (低三位 100)。组 4 状态:[12]。
  • 16 (二进制 010000) → 组号 = 0 (低三位 000)。组 0 状态:[16]。
  • 7 (二进制 000111) → 组号 = 7 (低三位 111)。组 7 状态:[7]。
  • 26 (二进制 011010) → 组号 = 2。并入后变为 [26, 10]。
  • 4 (二进制 000100) → 组号 = 4。并入后变为 [4, 12]。
  • 12 (二进制 001100) → 组号 = 4。命中,更新状态为 [12, 4](12 最新)。
  • 20 (二进制 010100) → 组号 = 4。组 4 满,4 最久未用,故淘汰 4
  • 结论虚页号 4 对应的表项被替换。
    (4) 每个 TLB 表项中的标记增加 2 位,整个表项位数增加 2 位

4.21#


(1) 物理地址字段划分

  • 物理地址为 24 位。页大小为 8KB = 2132^{13}B。物理页号 = 24 - 13 = 11 位,页内偏移地址 = 13 位
  • Cache 组数 = 512 组。块内偏移占 6 位。组索引占 9 位。Tag 位数 = 24 - 9 - 6 = 9 位。
  • 划分[ Tag (9位) ] + [ 组号 (9位) ] + [ 块内偏移 (6位) ]
  • TLB 采用全相联映射,TLB 标记中存放的是完整的虚拟页号(VPN = 19位)以及属性位。
    (2) 主存块装入映射计算
  • 块号为 4099。映射的 Cache 组号 = 块号 mod 512 = 4099 mod 512 = 3
  • 对应 Tag 的内容:物理块号高位部分,物理 Tag = 000001000_2(十六进制:008H)。
    (3) 时间开销对比缺页处理的开销远大于 Cache 缺失的开销。因为 Cache 缺失只需从主存读取数据块,耗时几十到上百纳秒;而页缺失需要访问磁盘,需要几毫秒甚至十几毫秒。时间相差达 5 个数量级。
    (4) 写策略原因:Cache 采用写穿策略时,写主存延迟在几十纳秒内,性能影响小。而主存修改如果采用写穿到磁盘,将面临高达毫秒级的磁盘写入延迟,导致系统效率极低。因此采用写回法。

4.22#


(1) 主存为 1MB1\text{MB},物理地址占 20 位
(2) TLB 采用全相联映射组相联映射,采用 SRAM 芯片实现。
(3) Cache 采用组相联映射。Cache 行中除数据外,还应有 LRU位修改位(脏位)。有效位作用是指示当前 Cache 行中的数据是否有效。
(4) 虚拟地址 0008 C040H。物理地址为物理页框号加低 12 位 040H。是否命中取决于该物理地址对应的 Tag 是否与 Cache 对应行中的 Tag 一致。若虚拟地址为 0007 C260H:其物理偏移为 260H。利用物理地址的组索引字段定位到对应的 Cache 组。

课后习题原图书影#

课后习题与真题截图1 课后习题与真题截图2 课后习题与真题截图3 课后习题与真题截图4 课后习题与真题截图5 课后习题与真题截图6 课后习题与真题截图7 课后习题与真题截图8

分享

如果这篇文章对你有帮助,欢迎分享给更多人!

存储系统
https://dawn114514.site/posts/计组/存储系统/
作者
黎明
发布于
2026-06-29 09:31:16
许可协议
MIT

部分信息可能已经过时

目录