skip to content
[Jimjimu Notes]

Computer Organization: Virtual Memory

/ 18 min read

Table of Contents

Course index · Previous: Cache · Next: I/O and Parallelism

OS Functions

Pasted image 20260523110508 Pasted image 20260523110532 Pasted image 20260523110836 Pasted image 20260523110907 Pasted image 20260523110924 Pasted image 20260523111028 Pasted image 20260523111205

当时间片(Time Slice)耗尽,硬件定时器就会“响”。这个“响声”是一个硬件中断(interrupt) 这个中断会强制 CPU 暂停当前的用户程序,将状态切换为管态(Supervisor Mode),并自动跳转回操作系统内核的 Trap Handler 中。

Pasted image 20260523111607

Virtual Memory

Pasted image 20260523115427

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 内存条)
Pasted image 20260523113804

storage主要就是指disk,SSD(固态硬盘),HDD(机械硬盘) SSD 是一种完整的存储设备,而 Flash Memory(特别是 NAND Flash)是 SSD 内部用来真正存放数据的载体。

Pasted image 20260523114801

Memory Manager

问题的引入:

Pasted image 20260523115312 Pasted image 20260523115330 Pasted image 20260523115348

Paged Memory

Pasted image 20260523130416 Pasted image 20260523130625

操作系统把虚拟内存和真实的物理内存(DRAM)都切分成固定大小的“块”,这个块就叫做页(Page)。通常一页的大小是 4KB。 翻译的时候,我们不再精确到每一个字节,而是以“页”为单位进行粗粒度翻译。 分页翻译的本质,就是“替换页号,保留偏移量”

Pasted image 20260523131045

这一页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

Pasted image 20260523130827 Pasted image 20260523131259 Pasted image 20260523131643 Pasted image 20260523131959 Pasted image 20260523132017

DISK只能接受write-back,因为write-through很慢

Hierarchical Page Tables

Pasted image 20260529162903

问题的引入:单级的Page table,一个就需要4MB,如果有很多进程,会很占用内存!

Pasted image 20260529163440 Pasted image 20260529163540

Translation Lookaside Buffers(TLB)

Pasted image 20260529174608

问题:之前提到过,如果用1级页表,那么每次翻译虚拟内存需要2次访问内存;如果用2级页表,每次翻译虚拟内存需要2次访问内存,以此类推。所以我们需要一个buffer(为什么不叫cache是因为它出现的时间比cache早)

Pasted image 20260529174739

TLB 就是把多级页表寻址的最终结果(叶子 PPN + 权限位)初始输入(VPN)直接绑定在一起的缓存。 也就是说,无论用的是几个级别的Page Table,直接拿原始的VPN去查,hit了查到的就是最终叶子节点的PPN. 上图中是一个全相联的TLB结构,直接拿VPN当作tag(索引),去TLB里找PPN,因为是全相联,会判断TLB中所有的tag有没有一个是等于VPN的

Pasted image 20260529174804 Pasted image 20260529174920 Pasted image 20260529174856

(上图VPN被分为tag和index是因为这里使用的是组相联 or direct-map)

TLBs in Datapath

Pasted image 20260529195920 Pasted image 20260529195932 Pasted image 20260529195951

VM Performance

Pasted image 20260529195443 Pasted image 20260529200105 Pasted image 20260529201658

其实这里还是这样算比较好,no paging:

1+5%×(10+40%×200)1 + 5\% \times (10 + 40\% \times 200)

加上虚拟内存的Page miss之后,区别是:L2 miss之后会访问memory(DRAM),因此需要使用TLB翻译VM,然后看看数据页是否在内存中,若在内存中Page hit,否则就要去磁盘Page miss:

L1hit+L1missrate×L1misspenalty=L1hit+L1missrate×(L2hit+L2missrate×L2misspenalty)=L1hit+L1missrate×(L2hit+L2missrate×(PageHit+PageMiss×MissPenalty)))=1+0.05×(10+0.4×(200+0.01×20M))=4005.5Cycle\begin{aligned} &L1_{hit} + L1_{miss-rate} \times L1_{miss-penalty} \\ = &L1_{hit} + L1_{miss-rate} \times (L2_{hit} + L2_{miss-rate} \times L2_{miss-penalty}) \\ = &L1_{hit} + L1_{miss-rate} \times (L2_{hit} + L2_{miss-rate} \times (PageHit + PageMiss \times MissPenalty))) \\ =& 1 + 0.05 \times(10 + 0.4 \times (200 + 0.01 \times 20M))\\ =& 4005.5 \quad Cycle \end{aligned} Pasted image 20260529201707

HRMemHR_{Mem}就是Hit Rate of Main Memory(主存命中率)

I/O

Pasted image 20260529213051 Pasted image 20260530163301 Pasted image 20260530163555

Course index · Previous: Cache · Next: I/O and Parallelism

Backlinks