Skip to content

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