Computer Systems: A Programmer's Perspective¶
第六章:存储器层次结构¶
存储技术¶
Todo
磁盘¶
本节还描述了直接内存访问(Direct Memory Access, DMA):
- 使用内存映射 I/O 的系统中,有一块地址为 I/O 设备通信保留,这些地址称为 I/O 端口。设备连接到总线时与端口关联。
- CPU 向 I/O 端口执行存储指令通知设备读取,随后就不管了。
- 磁盘控制器读取完成后,将数据通过总线传送到主存,不需要 CPU 干涉,这就是 DMA。
- DMA 完成后,磁盘控制器向 CPU 发送中断信号。
局部性¶
两种形式:时间和空间局部性;不同对象:数据和指令局部性。
存储器层次结构¶
- L0:寄存器
- L1-L3:基于 SRAM 的高速缓存
- L4:主存
- L5:磁盘
- L6:远程二级存储
一些基本概念:
- 数据以块大小为传送单元在相邻层次之间传送。不同层次对之间块大小可以不同。
- 缓存命中、不命中;替换策略、LRU;冷(强制性)不命中、缓存热身;放置策略、冲突不命中;工作集、容量不命中。
- 缓存管理:
- L1-L3:硬件逻辑
- L4:有虚拟内存时,由操作系统和 CPU 上的地址翻译硬件共同管理
高速缓存存储器¶
三个层次高速缓存的大致时延:
- L1: 4 时钟周期
- L2: 10 时钟周期
- L3: 40~75 时钟周期
各类高速缓存:
- 直接映射、组相联、全相联。
- 全相联搜索电路复杂且昂贵,只适合小容量,用于 TLB。
- 它们的组选择、行匹配、字选择、行替换、冲突不命中、写策略(直写、写回;写分配、非写分配)。
Intel 的高速缓存层次结构:
- L1 分为 i-cache 和 d-cache
- L2 单核使用,L3 所有核共享
编写高速缓存友好的代码¶
尽量减小每个循环内部的缓存不命中数量。
综合:高速缓存对程序性能的影响¶
本节分析了存储器山,讲解了对矩阵乘法进行重排以减少缓存不命中的例子。此外,分块能在没有预取机制的系统上获得性能收益。
第九章:虚拟内存¶
三个能力:高效使用主存、提供一致地址空间、保护进程地址空间。
物理和虚拟寻址¶
VA、PA、MMU
地址空间¶
虚拟与物理地址空间
虚拟内存作为缓存的工具¶
- VP、PP;未分配的,缓存的,未缓存的。
- SRAM 和 DRAM 缓存:DRAM 全相联,总是使用写回,虚拟页比较大,都是因为磁盘访问时间太长。
- 物理内存中存放页表,MMU 翻译时查询它。
- 页命中、缺页(page fault)、交换(swapping)/页面调度(paging)、按需页面调度(demand paging)
- 缺页:地址翻译硬件->缺页异常->内核异常处理程序->重启缺页命令。
- 系统调用
getrusage
可以监测缺页次数。
虚拟内存作为内存管理的工具¶
实际上,操作系统为每个进程提供单独页表,意味着独立的虚拟地址空间。
- 多个虚拟页可映射到同一个物理页。
- 简化了链接(使用虚拟内存,无需关心物理内存布局)、加载(只分配页,第一次访问时换入)、数据共享(用户进程和操作系统之间)、内存分配(连续的虚拟页面随机分散在物理页面中)。
虚拟内存作为内存保护的工具¶
地址翻译硬件要读页表项,可以在页表项中设置许可位。常见许可位:
- SUP:内核模式访问
- READ:读权限
- WRITE:写权限
指令违反许可条件使 CPU 触发异常,Linux 一般报告为段错误。
地址翻译¶
Todo
案例研究:Intel Core i7/Linux 内存系统¶
Todo