第1章 · 播客 第3集
计算机组成与体系结构 · 磁盘、Cache 与三种映射
🎙️ 本集播客:第3集:硬盘四层次与访问时间公式、Cache 与 CAM 的工作原理、命中率公式连 14.7ns 例题,再把直接映像 7 位、全相联 11 位、组相联 8 位这三组标记位一位一位算出来,含两种退化情形。 语音由微软 Edge 神经网络语音预生成(女声·晓伊,男声·云希)。点击下方任意对话可直接从该句开始播,当前句朗读时下一句已预先加载,无缝衔接。
明
阿明
辅存那边呢,磁带和硬盘。
雅
小雅
磁带存储器是一种顺序存取的设备,特点是存取时间较长,但存储容量大、便于携带、价格便宜;应用场景越来越少,目前主要用于资料的归档保存。硬盘复杂些,信息分布呈四个层次,顺序你要记牢:记录面、圆柱面、磁道和扇区。
雅
小雅
细节逐个给你。一台硬盘驱动器中有多个磁盘片,每个盘片有两个记录面,每个记录面对应一个磁头,所以记录面号就是磁头号;所有磁头安装在一个公用的传动设备或支架上,磁头一致地沿盘面径向移动,单个磁头不能单独地移动。在记录面上,一条条磁道形成一组同心圆,最外圈的磁道为 0 号,往内则磁道号逐步增加。
明
阿明
柱面是怎么来的,我一直没画明白。
雅
小雅
在一个盘组中,各记录面上相同编号也就是相同位置的各磁道,构成一个柱面。所以若每个磁盘片有 m 个磁道,则该硬盘共有 m 个柱面。引入柱面的概念是为了提高硬盘的存储速度:当主机要存入一个较大的文件、一条磁道存不完时,应首先将一个文件尽可能地存放在同一柱面中;如果仍存放不完,再存入相邻的柱面内。
明
阿明
因为同一柱面不用挪磁头。扇区呢?
雅
小雅
通常将一条磁道划分为若干个段,每个段称为一个扇区或扇段,每个扇区存放一个定长信息块,例如 512 个字节;一条磁道划分多少扇区、每个扇区存放多少字节,一般由操作系统决定。这里有个特别爱考的细节:磁道上的扇区编号从 1 开始,不像磁头或柱面编号从 0 开始。
明
阿明
扇区从 1,磁头和柱面从 0。这种题一看就是专门坑人的。
雅
小雅
然后是磁盘访问时间的公式。在磁盘上读写信息,首先需要定位到目标磁道,这个过程称为寻道,所消耗的时间称为寻道时间;定位到目标磁道后需要定位到目标扇区,此过程通过旋转盘片完成,平均旋转半圈可到目标位置。所以:磁盘访问时间,也叫存取时间,等于寻道时间加旋转延迟时间。
明
阿明
就这两项相加,不含别的?选项里要是有「传输时间」我会犹豫。
雅
小雅
按本教材,答案就是寻道时间加旋转延迟时间这两项。看到「寻道时间 + 旋转延迟时间」直接选它。好,现在进 Cache,这是本章分值最重的一块。
雅
小雅
先说它存在的意义:Cache 的功能是提高 CPU 数据输入输出的速率,突破所谓的「冯·诺依曼瓶颈」,即 CPU 与存储系统间数据传送带宽限制。实现上,Cache 通常采用相联存储器 CAM,这是一种基于数据内容进行访问的存储设备。
明
阿明
CAM 具体怎么工作?
雅
小雅
写入数据时,CAM 能够自动选择一个未用的空单元进行存储;读出数据时,不是给出存储单元的地址,而是直接给出该数据或者该数据的一部分内容,CAM 对所有存储单元中的数据同时进行比较,并标记符合条件的所有数据以供读取。由于比较是同时、并行进行的,所以这种基于数据内容读写的机制,速度比基于地址读写的方式要快很多。
雅
小雅
工作流程也考:当 CPU 需要读取数据时,首先在 Cache 中查找是否有所需内容,如果有则直接从 Cache 中读取;若没有,再从内存中读取该数据,然后同时送往 CPU 和 Cache。注意最后这个「同时送往 CPU 和 Cache」,问「未命中时数据怎么走」就答这句。
明
阿明
命中率公式我背过:t3 等于 t1 乘 h 加 t2 乘 1 减 h。但每个字母代表啥我要想一下。
雅
小雅
把定义钉死:h 代表对 Cache 的访问命中率,1 减 h 称为失效率或者未命中率;t1 表示 Cache 的周期时间,t2 表示内存的周期时间,t3 是使用「Cache 加主存储器」的系统的平均周期。原文还有一句结论:系统的平均存储周期与命中率有很密切的关系,命中率的提高即使很小,也能导致性能上的较大改善。
明
阿明
那个 14.7 纳秒的例题,能一步步过一遍吗?
雅
小雅
来。条件:某计算机主存的读写时间为 100ns,有一个指令和数据合一的 Cache,该 Cache 的读写时间为 10ns,取指令的命中率为 98%,取数的命中率为 95%,执行某类程序时约有 1/5 指令需要存取一个操作数,并假设指令流水线在任何时候都不阻塞。问设置 Cache 后每条指令的平均访存时间。
雅
小雅
分两部分。第一部分是取指令:每条指令都要取指,命中率 98%,所以是 2% 乘 100ns 加 98% 乘 10ns——未命中的那 2% 走主存 100ns,命中的 98% 走 Cache 10ns。第二部分是取操作数:只有 1/5 的指令需要,所以整体乘 1/5,括号里同理是 5% 乘 100ns 加 95% 乘 10ns。两部分相加,结果约等于 14.7ns。
明
阿明
所以关键是别忘了给取数那部分乘 1/5,也别把命中率和未命中率乘错对象。
雅
小雅
对,这两处是唯一的坑。接下来是映射机制,三种,每种都要会算标记位。先讲大前提:当 CPU 发出访存请求后,存储器地址先被送到 Cache 控制器以确定所需数据是否已在 Cache 中,若命中则直接对 Cache 进行访问,这个过程称为 Cache 的地址映射;在地址映射中,主存和 Cache 将均分成容量相同的块,也叫页。
明
阿明
第一种直接映像,主存地址被切成几段?
雅
小雅
三段,从高到低依次是:区号、页号、页内地址。这个「三段」本身就是考点——题目问「主存地址分为区号、页号和页内地址三部分的映射方式是哪种」,注意看原文的例子,直接映像的地址就是这三段。原文给的参数是:内存容量 1GB,Cache 容量 8MB,页面大小 512KB。
雅
小雅
算法是先分区再分页。一个区的大小就是 Cache 容量的大小,所以一共分:1GB 除以 8MB 等于 128 个区,128 是 2 的 7 次方,所以区号 7 位。每个区分:8MB 除以 512KB 等于 16 个页,16 是 2 的 4 次方,所以页号 4 位。
明
阿明
那标记位呢?是 7 加 4 等于 11 位?
雅
小雅
错,这是最经典的错法。直接映像里,每个区的 N 号页都必须进入到 Cache 的 N 号页,页号是固定对应的、不需要记,所以只需要记录区号即可——标记位长度就是 7 位。你把区号和页号相加,就掉进坑里了。
明
阿明
因为页号是「注定」的,不用存。那它的毛病在哪?
雅
小雅
块冲突率非常高。映像规律是主存中每个区的第 0 页只能进入 Cache 的第 0 页。原文的例子讲得很直白:若当前时刻 Cache 中 0 号页已被占据,而 1 到 15 号页空闲,现在要将 1 区第 0 页也就是内存的第 16 页调入 Cache,是会发生冲突的。所以优点是比较容易实现、硬件电路较简单,缺点是不够灵活,有可能使 Cache 的存储空间得不到充分利用。
明
阿明
明白。全相联呢,听名字就很自由。
雅
小雅
全相联映像使用相联存储器组成的 Cache 存储器,主存的每一页可以映像到 Cache 的任一页;如果淘汰 Cache 中某一页的内容,则可调入任一主存页的内容,因而比直接映像灵活。它的主存地址只分两个部分:地址部分也就是主存页标记,和数据部分也就是页内地址。
雅
小雅
标记位这样算:在原文给的例子里,程序访存时高 11 位给出主存页号,低 19 位给出页内地址。因为每个 Cache 页可映像到 2048 个主存页中的任一页,所以每页的 Cache 标记也需要 11 位,用来表明它现在所映像的主存页号。结论就是 Cache 标记信息位数增加,比较逻辑成本随之增加。
明
阿明
这么灵活,缺点是啥?总不能白得。
雅
小雅
缺点很致命,而且是原文原话。在全相联方式中,主存地址不能直接提取 Cache 页号,需要将主存页标记与 Cache 各页的标记逐个比较,直到找到标记符合的页也就是命中,或者全部比较完后仍无符合的标记也就是访问失败。因此这种映像方式速度很慢,失掉了高速缓存的作用——这是它的最大缺点。如果让主存页标记与各 Cache 标记同时比较,则成本又太高。所以它因比较器电路难于设计和实现,只适用于小容量 Cache。
明
阿明
「失掉了高速缓存的作用」这句挺狠。那组相联是折中?
雅
小雅
对,组相联映像也叫页组映像,介于直接映像和全相联映像之间,是这两种映像的一种折衷方案。做法是主存与 Cache 都分组,主存中一个组内的页数与 Cache 的分组数相同。原文例子的参数是:主存分 128 个区,每个区 8 个组,每个组 2 个页。
雅
小雅
规则记两句就够:主存中的组与 Cache 的组形成直接映像关系,而每个组内的页是全相联映像关系。举原文的例子——主存 1 区 0 页,它在 0 组中,所以只能进入 Cache 的 0 组中;至于进入到 Cache 的 0 组 0 页还是 0 组 1 页,并无强制要求,可任意放置。
明
阿明
组间固定、组内自由。那它的标记位是 8 位?
雅
小雅
对,8 位,而且要能说出为什么:因为此时除了要记录区号,还得记录组号,即区号 7 位加组号 1 位等于 8 位。你把三种映射的标记位串起来记——直接映像 7 位只记区号,全相联 11 位记整个主存页号,组相联 8 位是区号加组号。这三个数字连同理由,几乎每年都在考。
明
阿明
那组相联的两个极端情况呢?我记得有个「退化」。
雅
小雅
两句原文:如果 Cache 中每组只有一页,则组相联映像方式就变成了直接映像方式;如果 Cache 中每组页数为 16 页也就是 Cache 只分一组,则就是全相联映像。所以题目问「若 Cache 每组只有 1 页,组相联退化为哪种」,答直接映像;反过来只分一组就是全相联。这两头你别记反:组内页数越少越像直接映像,组数越少越像全相联。
明
阿明
那要是问三种映射的灵活性排序呢?
雅
小雅
从低到高是:直接映像、组相联映像、全相联映像。理由就在定义里——直接映像每个主存页只能进固定的一页,最死;全相联任一页可进任一页,最活;组相联是折中,所以夹在中间。顺带把组相联的优点补上:由于 Cache 中每组有若干可供选择的页,因而它在映像定位方面较直接映像方式灵活;每组页数有限,因此付出的代价不是很大,可以根据设计目标选择组内页数。
明
阿明
那这些映射是软件做的还是硬件做的?我写代码要不要管?
雅
小雅
原文有专门的提示,也是考点:为保障性能,内存与 Cache 之间的映射往往采用硬件完成,所以 Cache 对于程序员而言是透明的,程序员编程时完全不用考虑 Cache。「对程序员透明」这个说法记住,判断题常拿它出。
雅
小雅
本集必背:磁盘访问时间等于寻道时间加旋转延迟时间,扇区编号从 1 开始而磁头和柱面从 0 开始;命中率公式 t3 等于 t1 乘 h 加 t2 乘 1 减 h,例题答案 14.7 纳秒,别忘了给取操作数那部分乘 1 除以 5;三组标记位——直接映像 7 位只记区号、全相联 11 位记主存页号、组相联 8 位是区号 7 位加组号 1 位;灵活性从低到高是直接、组相联、全相联;每组一页退化为直接映像,只分一组就是全相联。
明
阿明
标记位那三个数字加上理由,我总算不是死记了。下一集是替换和流水线?