Computer Organization: Virtual Memory
/ 18 min read
Table of Contents
Course index · Previous: Cache · Next: I/O and Parallelism
OS Functions
当时间片(Time Slice)耗尽,硬件定时器就会“响”。这个“响声”是一个硬件中断(interrupt) 这个中断会强制 CPU 暂停当前的用户程序,将状态切换为管态(Supervisor Mode),并自动跳转回操作系统内核的 Trap Handler 中。
Virtual Memory
Physical Memory and Storage
- DRAM(动态随机存取存储器): 它的基本存储单元是由1 个电容和 1 个晶体管组成的。电容就像一个小水桶,里面有电荷代表
1,没电荷代表0。但是电容天生会漏电(水桶漏水),如果不去管它,数据很快就会丢失。因此,系统必须每隔几毫秒就对 DRAM 进行一次读取和重写(补水),这个动作叫做“刷新”(Refresh)。因为它需要不断地动态刷新来维持数据,所以叫“动态”。 - SRAM(静态随机存取存储器): 它的基本存储单元通常是由 6 个晶体管组成的“触发器”电路。只要不断电,这个电路就能像跷跷板一样死死卡在
1或0的状态,绝对不会漏电。因为它不需要定时刷新就能稳定保存数据,所以叫“静态”。
| 特性 | SRAM (静态 RAM) | DRAM (动态 RAM) |
|---|---|---|
| 存储结构 | 触发器(多晶体管,通常 6 个) | 电容 + 晶体管(1T1C) |
| 数据维持 | 不需要刷新 | 必须持续不断地刷新 |
| 读写速度 | 极快(延迟极低,能跟上 CPU 的速度) | 较慢(充电/放电及刷新机制导致延迟) |
| 存储密度 | 低(一个单元占地面积大,总容量小) | 极高(结构极其简单,可以密集排布) |
| 制造成本 | 极其昂贵(按 MB 计算) | 非常便宜(按 GB 计算) |
| 功耗表现 | 待机功耗极低 | 功耗相对较高(因为需要频繁执行刷新动作) |
| 常见用途 | CPU 内部缓存(L1 / L2 / L3 Cache) | 计算机主存(你买的 DDR4 / DDR5 内存条) |
storage主要就是指disk,SSD(固态硬盘),HDD(机械硬盘) SSD 是一种完整的存储设备,而 Flash Memory(特别是 NAND Flash)是 SSD 内部用来真正存放数据的载体。
Memory Manager
问题的引入:
Paged Memory
操作系统把虚拟内存和真实的物理内存(DRAM)都切分成固定大小的“块”,这个块就叫做页(Page)。通常一页的大小是 4KB。 翻译的时候,我们不再精确到每一个字节,而是以“页”为单位进行粗粒度翻译。 分页翻译的本质,就是“替换页号,保留偏移量”
这一页ppt计算了一个进程的page table有足足4MB,cache根本装不下,只能把这个巨大的“翻译字典(页表)”存放到普通的物理内存(DRAM)中。这就会带来访问DRAM需要两次。DRAM 的速度比 CPU 慢上百倍。现在所有内存操作都要磨洋工做两次,这直接导致整个计算机的运行速度被拦腰斩断(降低 50% 以上)。这是绝对无法接受的。
如何挽救性能? (How could we minimize the penalty?) 为了不让虚拟内存机制拖垮整台电脑,PPT 底部提出了两种利用“缓存(Cache)”思想的拯救方案:
- 方案一:利用空间局部性 (Exploit spatial locality) 当系统去 DRAM 查页表时,不要只拿当前需要的那一条记录(Word),而是干脆把那一整块(Block)相邻的翻译记录都顺手搬进 CPU 内部的高级缓存中。因为程序运行时,往往倾向于连续访问相邻的内存。
- 方案二:专门为页表建一个 VIP 缓存 (Use a cache for frequently used page table entries…) 既然 4 MiB 的完整字典塞不进 CPU,那我们就把最频繁查询的那几条/几十条翻译记录,单独提取出来,存放在 CPU 内部一块极小、极快的专属缓存中。
Page Faults
DISK只能接受write-back,因为write-through很慢
Hierarchical Page Tables
问题的引入:单级的Page table,一个就需要4MB,如果有很多进程,会很占用内存!
Translation Lookaside Buffers(TLB)
问题:之前提到过,如果用1级页表,那么每次翻译虚拟内存需要2次访问内存;如果用2级页表,每次翻译虚拟内存需要2次访问内存,以此类推。所以我们需要一个buffer(为什么不叫cache是因为它出现的时间比cache早)
TLB 就是把多级页表寻址的最终结果(叶子 PPN + 权限位)和初始输入(VPN)直接绑定在一起的缓存。 也就是说,无论用的是几个级别的Page Table,直接拿原始的VPN去查,hit了查到的就是最终叶子节点的PPN. 上图中是一个全相联的TLB结构,直接拿VPN当作tag(索引),去TLB里找PPN,因为是全相联,会判断TLB中所有的tag有没有一个是等于VPN的
(上图VPN被分为tag和index是因为这里使用的是组相联 or direct-map)
TLBs in Datapath
VM Performance
其实这里还是这样算比较好,no paging:
加上虚拟内存的Page miss之后,区别是:L2 miss之后会访问memory(DRAM),因此需要使用TLB翻译VM,然后看看数据页是否在内存中,若在内存中Page hit,否则就要去磁盘Page miss:
就是Hit Rate of Main Memory(主存命中率)
I/O
Course index · Previous: Cache · Next: I/O and Parallelism