CSAPP 第九章 虚拟内存

虚拟内存的三个角色

作为缓存工具

each cache block is called page.

  • 磁盘上的虚拟页叫 VPs
  • DRAM中的物理页是 PPs

利用DRAM快的特性,把常用的数据缓存起来。

一般使用 Write-back 机制(置换出去的时候才写入到内存中,需要用dirty bit来实现,因为要确保缓存中数据保存到内存中了)

页表:页表项PTE的数组,DRAM上每一个进程都有自己的页表,每一个PTE把虚拟也映射到物理页。

image

查表:

  • Page hit:访问到蓝色PTE的地址时。
  • Page fault:与上述相反时,会将数据从磁盘中复制到DRAM中,然后再执行访问指令。
  • null:即没有分配,分配时先让PTE指向虚拟内存上的某个页,不复制到DRAM上,当有page fault的时候才copy数据。

作为内存管理工具

image

作为内存保护工具

image

地址翻译

虚拟地址VA:

  • TLBI:TLE索引值
  • TLBT:TLBtag
  • VPO:虚拟页偏移量
  • VPN:虚拟页编号

物理地址PA:

  • PPO:物理页偏移量
  • PPN:物理页编号

MMA:应该是作为组装用

地址翻译方式如下:

image

  1. 通过虚拟页编号VPN找到PT中相应的PTE。

  2. check the valid bit

  3. 页表中的相应的PPN加上VPO就是物理地址。

  • Page hit就直接按以上操作进行即可。
  • Page fault的话就把磁盘中找到对应的与DRAM中的页置换之后,再进行Page hit形式的访问。

TLB

image

多层页表

若地址太大,所需要的页表大小也太大。

利用以下这种方式从而合理利用空间起到减小内存的效果。

image

地址翻译实例

image

TLB:

image

页表:

image

缓存:

image

对于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中的垃圾收集)

需要对齐

image

性能指标

提高吞吐量(单位时间内进行的malloc和free的请求的数量)和内存利用率(与内存碎片有关)。

内部碎片

由于对齐会出现碎块儿。

image

外部碎片

有足够的空间,但空间不连续

image

posted @ 2024-06-02 16:13  _daybreak  阅读(7)  评论(0编辑  收藏  举报