1437 字
7 分钟
内存虚拟化
2023-10-02

内存管理的基本要求#

  • 内存的分配与回收
  • 地址转换
  • 内存空间扩容
  • 内存共享
  • 存储保护

程序的链接与装入#

  • 编译
  • 链接
    • 静态
    • 动态
      • 装入时链接
      • 惰性链接
      • dlsym
  • 装入
    • 绝对装入
    • 可重定位装入
      • 静态~
      • 动态~

逻辑地址与物理地址#

程序的内存映像#

内存保护#

基址寄存器和界限寄存器

内存共享#

可重入代码

内存分配与回收#

内存碎片#

外部碎片内部碎片

连续分配#

静态分配方式#

  • 单一分配
  • 固定分区分配
    • 分区大小相等
    • ~不相等 ||作业道数|内部碎片|外部碎片|硬件支持|管理空间的数据结构|解决空间不足的方法|提高作业道数| |—|—|—|—|—|—|—|—| |单道连续分配|1|O|X|界地址寄存器 越界检查||覆盖|交换| |多道固定连续分配|小于分的块数|O|X|基址寄存器界限寄存器动态地址转换|空闲链表 空闲表|||| |多道可变连续分配|不好说|X|O|同上|同上|紧凑|||

动态分区分配算法#

  • freelist
    • firstfit
      • 对各个部分的内存磨损不一致, 内存起始部分容易出现碎片
    • nextfit
      • 不如首次匹配
      • 尾部磨损严重
    • bestfit
      • 内存块按升序组织,找到第一个刚好大于申请大小的内存块
      • 碎片化严重
    • 最差匹配
      • 内存块降序组织,取出第一个内存块
      • 浪费大内存块
      • 碎片化不严重
  • Memory pool
    • slab
      • cache
  • buddy allocator
  • region based allocation
    • arnea allocator
    • bump allocator

非连续分配#

方式#

  • 段式分配 段号 页内偏移 段表 段式逻辑地址是二维结构
  • 页式分配 页 虚拟页号 物理页号 页内偏移
  • 段页式分配

页式存储#

  • 页表
  • 多级页表
  • 页表项 存在位 脏位 权限位rwxu(代表在u特权级下是否可以访问) 算法位(access)内存块地址…
  • 页表基址寄存器
  • TLB
    • tlb表项 有效位 脏位 算法位 tag位 页表项内容

(页式)虚拟内存管理#

传统存储管理方式特征#

  • 一次性
  • 驻留性

虚拟存储器的定义和特征#

基于局部性原理

  • 多次性
  • 对换性
  • 虚拟性

请求分页管理机制#

页表#

缺页中断机构#

20231003231906

地址变换机构#

20231003232217

虚拟内存下的命中情况#

  • tlb hit, pg hit, cache hit 一次tlb访问加一次cache访问
  • tlb hit, pg hit, cache miss 一次tlb访问加一次cache访问加一次内存访问
  • tlb miss, pg hit, cache hit 一次tlb访问加一次内存访问加一次cache访问开销(忽略修改tlb的开销)
  • tlb miss, pg hit, cache miss 一次tlb访问加一次内存访问加一次cache访问开销加一次内存访问开销(忽略修改tlb的开销)
  • tlb miss, pg miss, cache miss 页表miss说明内容不在内存中故肯定也不在cache中 一次tlb访问加一次内存访问加页故障加访问tlb加一次cache访问开销加一次内存访问开销(忽略修改tlb跟pg的开销)

页面分配#

驻留集#

指请求分页存储管理中给进程分配的物理块的集合 太大浪费 太小频繁的处理缺页异常

分配策略#

  • 局部固定分配
  • 局部可变分配
  • 全局可变分配
  • 全局固定分配不存在

时机#

  • 预调页策略 —> 立刻分配
  • 请求调页策略 —> 惰性分配

从何处调入页面#

缓存淘汰策略#

缓存淘汰策略

工作集#

概念#

工作窗口、工作时间 与驻留集不同,工作集指的是在某段时间间隔(工作时间之前的一段工作窗口)里,进程实际访问页面的集合。 工作集的大小若大于驻留集,则会发生抖动现象。

mmap#

虚拟内存存储器的性能分析#

  • 指标缺页率
  • 指导思想:局部性原理
  • 大页缺页低
  • 驻留集大小
  • 页面置换策略
  • 局部性好的程序 数组按行访问还是按列访问
  • 写回磁盘的频率 在系统中建立一分已修改换出页面的链表,对每个要被换出的页面(已修改),可以暂不将它们写回磁盘,而将它挂在该链表上,仅当被换出页面数达到给定值时,才将它们一起写回磁盘,这样就可显著滅少磁盘 1/O的次数,即减少已修改页面换出的开销。此外,若有进程在这批数据还未写回磁盘时需要再次访问这些页面,则不需从外存调入,而直接从已修改换出页面链表上获取,这样也可以减少页面从磁盘读入内存的频率,减少页面换进的开销

其他#

虚拟存储器的大小#

  • 虚拟存储器的大小:小于主存加外存的大小
  • 虚拟存储器的最大大小/虚拟存储器地址空间大小:2^虚拟地址位数

虚拟存储器计算缺页率#

详见

区分页越界与页故障#

教材与实际情况的区别

内核也是运行在虚拟内存下的那么内核如何访问修改页表#

https://os.phil-opp.com/paging-implementation/#accessing-page-tables 关注递归映射方式

计算虚拟内存访问时间#

不要忘了加上访问实际内容的时间

内存虚拟化
https://blog.pipago360.site/posts/操作系统/内存虚拟化/
作者
Ashenye
发布于
2023-10-02
许可协议
CC BY-NC-SA 4.0