CSAPP 第九章 虚拟内存
虚拟内存的三个角色
作为缓存工具
each cache block is called page.
- 磁盘上的虚拟页叫 VPs
- DRAM中的物理页是 PPs
利用DRAM快的特性,把常用的数据缓存起来。
一般使用 Write-back 机制(置换出去的时候才写入到内存中,需要用dirty bit来实现,因为要确保缓存中数据保存到内存中了)
页表:页表项PTE的数组,DRAM上每一个进程都有自己的页表,每一个PTE把虚拟也映射到物理页。
查表:
- Page hit:访问到蓝色PTE的地址时。
- Page fault:与上述相反时,会将数据从磁盘中复制到DRAM中,然后再执行访问指令。
- null:即没有分配,分配时先让PTE指向虚拟内存上的某个页,不复制到DRAM上,当有page fault的时候才copy数据。
作为内存管理工具
作为内存保护工具
地址翻译
虚拟地址VA:
- TLBI:TLE索引值
- TLBT:TLBtag
- VPO:虚拟页偏移量
- VPN:虚拟页编号
物理地址PA:
- PPO:物理页偏移量
- PPN:物理页编号
MMA:应该是作为组装用
地址翻译方式如下:
-
通过虚拟页编号VPN找到PT中相应的PTE。
-
check the valid bit
-
页表中的相应的PPN加上VPO就是物理地址。
- Page hit就直接按以上操作进行即可。
- Page fault的话就把磁盘中找到对应的与DRAM中的页置换之后,再进行Page hit形式的访问。
TLB
多层页表
若地址太大,所需要的页表大小也太大。
利用以下这种方式从而合理利用空间起到减小内存的效果。
地址翻译实例
TLB:
页表:
缓存:
对于0x03D4:
转化为二进制为00001111010100
VPN:00001111=0x0F
TLBI:11=0x3
TLBT:000011=0x3
VPO:010100=0x0A
查表:发现TLB第三个索引中确实有tag=3的,PPN为0x0D,再加上0x0A,在缓存中即可找到对应的。
对于0x0020
动态内存分配
可通过malloc来获得虚拟内存,动态内存分配器会管理一个虚拟内存区域heap。
两种分配器:
-
显示分配器:分配并回收malloc和free
-
隐式分配器:分配但不回收(Jave中的垃圾收集)
需要对齐
性能指标
提高吞吐量(单位时间内进行的malloc和free的请求的数量)和内存利用率(与内存碎片有关)。
内部碎片
由于对齐会出现碎块儿。
外部碎片
有足够的空间,但空间不连续