Appendix B4 Review of Memory Hierarchy

Virtual Memory

在任何时候,计算机都在运行多个进程,每个进程都有自己的地址空间。 (进程将在下一节中描述。​​)为每个进程分配一个完整的内存地址空间会很昂贵,特别是因为许多进程只使用它们地址空间的一小部分。 因此,必须有一种方法可以在许多进程之间共享更少量的物理内存。

一种方法是虚拟内存,将物理内存划分为多个块并将它们分配给不同的进程。 这种方法所固有的必须是一种保护方案,将进程限制为仅属于该进程的块。 大多数形式的虚拟内存还减少了启动程序的时间,因为在程序开始之前并非所有代码和数据都需要在物理内存中。

虽然虚拟内存提供的保护对于当前的计算机来说是必不可少的,但共享并不是发明虚拟内存的原因。 如果一个程序对于物理内存来说太大了,程序员的工作就是让它适合。 程序员将程序分成多个部分,然后识别相互排斥的部分,并在执行过程中在用户程序的控制下加载或卸载这些叠加层。 程序员确保程序永远不会尝试访问比计算机中更多的物理主内存,并且在正确的时间加载正确的覆盖。 正如您可以想象的那样,这种责任侵蚀了程序员的生产力。

发明虚拟内存是为了减轻程序员的这种负担; 它自动管理由主存储器和辅助存储器代表的两个级别的存储器层次结构。 图 B.19 显示了一个四页程序的虚拟内存到物理内存的映射。
在这里插入图片描述
除了共享受保护的内存空间和自动管理内存层次结构外,虚拟内存还简化了加载程序以供执行。 这种机制称为重定位,允许同一个程序在物理内存中的任何位置运行。 图 B.19 中的程序可以放置在物理内存或磁盘中的任何位置,只需更改它们之间的映射即可。 (在虚拟内存流行之前,处理器将包含一个重定位寄存器,仅用于此目的。)硬件解决方案的替代方案是每次运行程序时更改程序中所有地址的软件。

第 1 章中关于缓存的几个通用内存层次结构概念类似于虚拟内存,尽管许多术语不同。 页或段用于块,页错误或地址错误用于未命中。 使用虚拟内存,处理器生成虚拟地址,通过硬件和软件的组合将这些虚拟地址转换为访问主内存的物理地址。 这个过程称为内存映射或地址转换。 今天,由虚拟内存控制的两个内存层次级别是 DRAM 和磁盘。 图 B.20 显示了虚拟内存的典型内存层次参数范围。
在这里插入图片描述
除了图 B.20 中提到的数量上的差异之外,缓存和虚拟内存之间还有进一步的差异:
■ 缓存未命中的替换主要由硬件控制,而虚拟内存替换主要由操作系统控制。 更长的未命中惩罚意味着做出正确的决定更重要,因此操作系统可以参与并花时间决定替换什么。
■ 处理器地址的大小决定了虚拟内存的大小,但缓存大小与处理器地址大小无关。
■ 除了充当层次结构中主内存的低级后备存储之外,辅助存储还用于文件系统。 实际上,文件系统占据了大部分二级存储。 它通常不在地址空间中。

虚拟内存还包含若干相关技术。 虚拟内存系统可以分为两类:具有固定大小块的称为页的类和具有可变大小块的称为段的类。 页通常固定在 4096-8192 字节,而段大小则不同。 任何处理器上支持的最大段范围从 216 字节到 232 字节; 最小的段是 1 个字节。 图 B.21 显示了这两种方法如何划分。

使用分页虚拟内存还是分段虚拟内存的决定会影响处理器。 分页寻址有一个固定大小的地址,分为页号和页面内的偏移量,类似于缓存寻址。 单个地址不适用于分段地址; 段的可变大小要求段号需要 1 个字,段内的偏移量需要 1 个字,总共 2 个字。 未分段的地址空间对编译器来说更简单。

这两种方法的优缺点已在操作系统教科书中详细记录; 图 B.22 总结了这些论点。 由于替换问题(图的第三行),今天很少有计算机使用纯分割。 一些计算机使用混合方法,称为分页段,其中段是整数个页面。 这简化了替换,因为内存不需要是连续的,并且完整的段不需要在主内存中。 最近的一种混合方法是让计算机提供多种页面大小,较大的大小是最小页面大小的 2 倍的幂。 例如,IBM 405CR 嵌入式处理器允许 1 KiB、4 KiB(22$1 KiB)、16 KiB(24 美元 1 KiB)、64 KiB(26 美元 1 KiB)、256 KiB(28 美元 1 KiB)、1024 KiB(210 美元 1 KiB)和 4096 KiB(212 美元 1 KiB)作为单个页面。

在这里插入图片描述

Four Memory Hierarchy Questions Revisited

Q1: Where Can a Block be Placed in Main Memory?

虚拟内存的未命中代价涉及对旋转磁存储设备的访问,因此非常高。 考虑到选择较低的未命中率或更简单的布局算法,操作系统设计人员通常会选择较低的未命中率,因为会导致过高的未命中率。 因此,操作系统允许将块放置在主存储器中的任何位置。 根据第 B-8 页图 B.2 中的术语,该策略将被标记为完全关联。

Q2: How Is a Block Found If It Is in Main Memory?

分页和分段都依赖于由页号或段号索引的数据结构。 该数据结构包含块的物理地址。 对于分段,将偏移量添加到分段的物理地址以获得最终物理地址。 对于分页,偏移量只是连接到这个物理页地址(见图 B.23)。 这种包含物理页地址的数据结构通常采用页表的形式。 以虚拟页号为索引,表的大小就是虚拟地址空间中的页数。 给定 32 位虚拟地址、4 KiB 页和每个页表条目 (PTE) 4 个字节,页表的大小将为(232/212)$22¼222 或 4 MiB。

在这里插入图片描述

为了减小这种数据结构的大小,一些计算机对虚拟地址应用了散列函数。 散列允许数据结构是主内存中物理页数的长度。 这个数字可能远小于虚拟页面的数量。 这样的结构称为倒排页表。使用前面的例子,512 MiB 的物理内存只需要 1 MiB(8$512 MiB/4 KiB)用于倒排页表; 每个页表条目的额外 4 个字节用于虚拟地址。 HP/Intel IA-64 通过提供传统页表和倒排页表涵盖了这两种基础,将机制的选择留给操作系统程序员。

为了减少地址转换时间,计算机使用专用于这些地址转换的缓存,称为转换后备缓冲区,或简称为转换缓冲区,稍后将进行更详细的描述。

Q3: Which Block Should be Replaced on a Virtual Memory Miss?

如前所述,最重要的操作系统指南是尽量减少页面错误。 与此准则一致,几乎所有操作系统都尝试替换最近最少使用 (LRU) 块,因为如果过去预测未来,那么它不太可能被需要。

为了帮助操作系统估计 LRU,许多处理器提供了一个使用位或参考位,每当访问页面时逻辑上设置它。 (为了减少工作量,它实际上只在翻译缓冲区未命中时设置,稍后将对此进行描述。)操作系统会定期清除使用位,然后记录它们,以便确定在特定时间段内哪些页面被触摸。 通过以这种方式进行跟踪,操作系统可以选择最近最少被引用的页面。

Q4: What Happens on a Write?

主内存以下的级别包含旋转磁盘,需要数百万要访问的时钟周期数。 由于访问时间的巨大差异,还没有人构建一个虚拟内存操作系统,通过主内存写入处理器每个存储上的磁盘。 (这句话不应该被解释为第一个构建一个成名的机会!)因此,写入策略始终是回写。

因为不必要地访问下一个较低级别的成本如此之高,所以虚拟内存系统通常包含一个脏位。 它只允许块在从磁盘读取后发生更改时才写入磁盘。

Techniques for Fast Address Translation

页表通常很大,以至于它们存储在主内存中,有时会自行分页。 分页意味着每次内存访问在逻辑上至少需要两倍的时间,一次内存访问获取物理地址,第二次访问获取数据。 如第 2 章所述,我们使用局部性来避免额外的内存访问。 通过将地址转换保存在特殊缓存中,内存访问很少需要第二次访问来转换数据。 这种特殊的地址转换缓存称为转换后备缓冲区 (TLB),也称为转换缓冲区 (TB)。

TLB 条目就像一个缓存条目,其中标签保存部分虚拟地址,数据部分保存物理页帧号、保护字段、有效位,通常还有使用位和脏位。 要更改物理页框编号或页表中条目的保护,操作系统必须确保旧条目不在 TLB 中; 否则,系统将无法正常运行。 请注意,这个脏位意味着相应的页面是脏的,而不是 TLB 中的地址转换是脏的,也不是数据缓存中的特定块是脏的。 操作系统通过更改页表中的值来重置这些位,然后使相应的 TLB 条目无效。 当条目从页表重新加载时,TLB 会获得这些位的准确副本。

图 B.24 显示了 Opteron 数据 TLB 组织,并标记了翻译的每个步骤。 此 TLB 使用完全关联的放置; 因此,翻译开始(步骤 1 和 2)通过将虚拟地址发送到所有标签。 当然,标签必须标记为有效以允许匹配。 同时,内存类型检查访问是否违反 TLB 中的保护信息(也在步骤 2 中)

在这里插入图片描述

由于与缓存情况类似的原因,TLB 中不需要包含 12 位页面偏移量。 匹配标签通过有效的 40:1 多路复用器发送相应的物理地址(步骤 3)。 然后将页偏移量与物理页框组合以形成完整的物理地址(步骤 4)。 地址大小为 40 位。

地址转换很容易在决定处理器时钟周期的关键路径上进行,因此 Opteron 使用虚拟寻址、物理标记的 L1 缓存。

Selecting a Page Size

最明显的架构参数是页面大小。 选择页面是一个平衡支持较大页面大小与支持较小页面大小的力量的问题。 以下倾向于更大的尺寸:

■ 页表的大小与页大小成反比; 因此,可以通过使页面更大来节省内存(或用于内存映射的其他资源)。
■ 如B.3 节所述,较大的页面大小可以允许较大的缓存和较快的缓存命中时间。
■ 将较大的页面传入或传出辅助存储(可能通过网络)比传输较小的页面更有效。
■ TLB 条目的数量受到限制,因此更大的页面大小意味着可以有效映射更多内存,从而减少 TLB 未命中的数量。

正是出于这个最后一个原因,最近的微处理器决定支持多种页面大小; 对于某些程序,TLB 未命中对 CPI 的影响可能与缓存未命中一样重要。

较小页面大小的主要动机是节省存储空间。 当虚拟内存的连续区域的大小不等于页面大小的倍数时,较小的页面大小将减少浪费的存储空间。 页面中未使用的内存的术语是内部碎片。 假设每个进程有三个主要段(文本、堆和堆栈),每个进程平均浪费的存储空间将是页面大小的 1.5 倍。 对于具有数百 MB 内存和 4-8 KiB 页面大小的计算机来说,这个数量可以忽略不计。 当然,当页面大小变得非常大(超过 32 KiB)时,可能会浪费存储(主要和辅助)以及 I/O 带宽。 最后一个问题是流程启动时间; 许多进程都很小,所以大的页面大小会延长时间
调用一个进程。

Summary of Virtual Memory and Caches

使用虚拟内存、TLB、一级缓存和二级缓存映射虚拟和物理地址空间的所有部分,可能会混淆哪些位去哪里。 图 B.25 给出了一个从 64 位虚拟地址到具有两级缓存的 41 位物理地址的假设示例。 由于缓存大小和页面大小均为 8 KiB,因此该 L1 缓存是虚拟索引和物理标记的。 L2 缓存为 4 MiB。 两者的块大小都是 64 字节。
在这里插入图片描述
首先,64位虚拟地址在逻辑上分为虚拟页号和页偏移量。 前者送至TLB翻译成物理地址,后者的高位送至L1缓存作为索引。 如果 TLB 匹配成功,则物理页号被发送到 L1 缓存标签以检查匹配。 如果匹配,则为 L1 缓存命中。 然后块偏移为处理器选择字。

如果 L1 缓存检查导致未命中,则使用物理地址尝试 L2 缓存。 物理地址的中间部分用作 4 MiB L2 缓存的索引。 将生成的 L2 缓存标记与物理地址的上半部分进行比较以检查是否匹配。 如果匹配,我们就有一个 L2 缓存命中,数据被发送到处理器,处理器使用块偏移来选择所需的字。 在 L2 未命中时,物理地址随后用于从内存中获取块。

尽管这是一个简单的示例,但此绘图与真实缓存之间的主要区别在于复制。 首先,只有一个 L1 缓存。 当有两个 L1 缓存时,图的上半部分是重复的。 请注意,这将导致两个 TLB,这是典型的。 因此,一个高速缓存和 TLB 用于指令,从 PC 驱动,一个高速缓存和 TLB 用于数据,从有效地址驱动。

第二个简化是所有缓存和 TLB 都是直接映射的。 如果有 n 路组关联,那么我们将复制每组标签存储器、比较器和数据存储器 n 次,并将数据存储器与 n:1 多路复用器连接以选择命中。 当然,如果总缓存大小保持不变,根据第 B-22 页图 B.7 中的公式,缓存索引也将缩小 log 2n 位。

第二个简化是所有缓存和 TLB 都是直接映射的。 如果有 n 路组关联,那么我们将复制每组标签存储器、比较器和数据存储器 n 次,并将数据存储器与 n:1 多路复用器连接以选择命中。 当然,如果总缓存大小保持不变,根据第 B-22 页图 B.7 中的公式,缓存索引也将缩小 log 2n 位。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值