# B.6 谬误与陷阱
<!-- source: p0781 -->

即便只是回顾存储层次结构，也有谬误与陷阱！

## 陷阱：地址空间过小

DEC 与卡内基梅隆大学合作设计新一代 PDP-11 计算机家族后，仅仅五年，人们就发现这个设计存在致命缺陷。相比之下，IBM 在 PDP-11 之前六年发布的一种体系结构，只经过小幅修改，25 年后仍然兴盛。而曾因包含多余功能而受到批评的 DEC VAX，在 PDP-11 停产后仍卖出了数百万台。这是为什么？

PDP-11 的致命缺陷是地址只有 16 位，而 IBM 360 的地址为 24–31 位，VAX 为 32 位。地址位数限制了程序长度，因为程序及其所需数据的大小必须小于 \(2^{\text{地址位数}}\)。地址位数之所以难以改变，是因为它决定了所有可能保存地址的部件的最小宽度：PC、寄存器、存储字，以及有效地址运算的宽度。如果一开始就没有扩展地址的计划，后来成功修改地址位数的机会微乎其微，通常也就意味着这个计算机家族走到了尽头。

<!-- source: p0782 -->

Bell 与 Strecker（1976）这样说：

> 在计算机设计中，只有一种错误很难挽回：没有为存储器寻址和存储管理提供足够的地址位。PDP-11 延续了几乎所有已知计算机从未中断的这一传统。［第 2 页］

一些曾经成功的计算机最终因地址位不足而“饿死”，包括 PDP-8、PDP-10、PDP-11、Intel 8080、Intel 8086、Intel 80186、Intel 80286、Motorola 6800、AMI 6502、Zilog Z80、CRAY-1 和 CRAY X-MP；这还只是部分名单。

历史悠久的 80x86 系列的特别之处，在于它成功扩展过两次：先是在 1985 年随 Intel 80386 扩展到 32 位，较近的一次则是随 AMD Opteron 扩展到 64 位。

## 陷阱：忽视操作系统对存储层次结构性能的影响

图 B.29 给出了三个大型工作负载中由操作系统引起的存储停顿时间。约 25% 的停顿时间或者直接用于操作系统的未命中，或者源于操作系统的干扰使应用程序发生未命中。

| 工作负载 | 未命中发生在应用中的比例 | 未命中发生在 OS 中的比例 | 应用固有未命中所占时间 | OS 与应用冲突所占时间 | OS 指令未命中所占时间 | 迁移引起的数据未命中所占时间 | 块操作中的数据未命中所占时间 | 其他 OS 未命中所占时间 | OS 未命中及与应用冲突的总时间比例 |
|---|---:|---:|---:|---:|---:|---:|---:|---:|---:|
| Pmake | 47% | 53% | 14.1% | 4.8% | 10.9% | 1.0% | 6.2% | 2.9% | 25.8% |
| Multipgm | 53% | 47% | 21.6% | 3.4% | 9.2% | 4.2% | 4.7% | 3.4% | 24.9% |
| Oracle | 73% | 27% | 25.7% | 10.2% | 10.6% | 2.6% | 0.6% | 2.8% | 26.8% |
{#fig-B.29 .wide .expand num="B.29" caption="应用程序与操作系统的未命中及未命中耗时。操作系统使应用执行时间增加约 25%。每个处理器配有 64 KiB 指令缓存，以及一级 64 KiB、二级 256 KiB 的两级数据缓存；全部采用直接映射和 16 字节块。数据采自 Silicon Graphics POWER station 4D/340，这是一台配备四个 33 MHz R3000 处理器的多处理器，在 UNIX System V 下运行三种应用工作负载：Pmake 并行编译 56 个文件；Multipgm 同时运行并行数值程序 MP3D、Pmake 和一个五屏编辑会话；Oracle 使用 Oracle 数据库运行受限版本的 TP-1 基准。"}

表中“应用固有未命中”和“OS 与应用冲突”两列属于应用未命中导致的时间；“OS 指令未命中”“迁移引起的数据未命中”“块操作中的数据未命中”“其他 OS 未命中”四列属于直接由 OS 未命中导致的时间。数据来源：Torrellas, J., Gupta, A., Hennessy, J., 1992. *Characterizing the caching and synchronization performance of a multiprocessor operating system*（多处理器操作系统缓存与同步性能的特征分析）. *Proceedings of the Fifth International Conference on Architectural Support for Programming Languages and Operating Systems (ASPLOS)*，1992 年 10 月 12–15 日，波士顿（*SIGPLAN Notices* 27:9，9 月），162–174 页。

<!-- source: p0783 -->

## 陷阱：指望操作系统随着时间推移改变页大小

Alpha 的体系结构设计者制定了一套周密计划，希望随着时间推移增大页大小，从而扩展体系结构，甚至将这一计划体现在虚拟地址大小的设计中。然而，当后续 Alpha 真要增大页面时，操作系统设计者却不愿配合。最终，只好修改虚拟存储器系统，在保持 8 KiB 页面不变的情况下扩展地址空间。

其他计算机的设计者观察到很高的 TLB 未命中率，于是在 TLB 中增加了对多种更大页面的支持。他们希望操作系统程序员把对象分配到合理范围内最大的页中，以节约 TLB 表项。经过十年的尝试，多数操作系统仍只在少数专门挑选的功能中使用这些 **superpage**：映射显示内存或其他 I/O 设备，或者让数据库代码使用非常大的页。
