B.6 谬误与陷阱
即便只是回顾存储层次结构,也有谬误与陷阱!
陷阱:地址空间过小
DEC 与卡内基梅隆大学合作设计新一代 PDP-11 计算机家族后,仅仅五年,人们就发现这个设计存在致命缺陷。相比之下,IBM 在 PDP-11 之前六年发布的一种体系结构,只经过小幅修改,25 年后仍然兴盛。而曾因包含多余功能而受到批评的 DEC VAX,在 PDP-11 停产后仍卖出了数百万台。这是为什么?
PDP-11 的致命缺陷是地址只有 16 位,而 IBM 360 的地址为 24–31 位,VAX 为 32 位。地址位数限制了程序长度,因为程序及其所需数据的大小必须小于 。地址位数之所以难以改变,是因为它决定了所有可能保存地址的部件的最小宽度:PC、寄存器、存储字,以及有效地址运算的宽度。如果一开始就没有扩展地址的计划,后来成功修改地址位数的机会微乎其微,通常也就意味着这个计算机家族走到了尽头。
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% |
表中“应用固有未命中”和“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 页。
陷阱:指望操作系统随着时间推移改变页大小
Alpha 的体系结构设计者制定了一套周密计划,希望随着时间推移增大页大小,从而扩展体系结构,甚至将这一计划体现在虚拟地址大小的设计中。然而,当后续 Alpha 真要增大页面时,操作系统设计者却不愿配合。最终,只好修改虚拟存储器系统,在保持 8 KiB 页面不变的情况下扩展地址空间。
其他计算机的设计者观察到很高的 TLB 未命中率,于是在 TLB 中增加了对多种更大页面的支持。他们希望操作系统程序员把对象分配到合理范围内最大的页中,以节约 TLB 表项。经过十年的尝试,多数操作系统仍只在少数专门挑选的功能中使用这些 superpage:映射显示内存或其他 I/O 设备,或者让数据库代码使用非常大的页。