7 虚拟内存

type
status
date
slug
summary
tags
category
icon
password

7.1 虚拟内存的定义

  1. 早期,整个程序装入内存执行,内存不够不能运行
  1. 后来,内存不足时以进程为单位在内外存之间交换
  1. 对内存采用分页/分段管理后:
      • 进程中所有内存访问都是逻辑地址,运行时动态转换为物理地址,使重定位成为可能。
      • 进程被划分成许多块(页或段),不需要连续地位于内存中。
  1. 进程不需要所有的页/段都在内存中(局部性原理)
      • 时间局部性:某条指令被执行后,不久可能被再次执行,某数据被访问后,不久之后可能再次访问  (Cache)
      • 空间局部性:一段时间内所访问的地址集中在一定范围内(虚存)
  • 在页/段表项中,加入一个标志位,使处理器知悉该页/段是否在内存中。
  • 调页时机:预调页(×);请求调页(√)
  • 处理器需要访问一个不在内存中的逻辑地址时,会产生缺页中断。
  • 进程被阻塞,操作系统发出磁盘I/O请求。
  • 当块被载入内存后,修改页表,并通过I/O中断,唤醒该进程。
  • 如果内存已满,先进行置换,置换是在缺页中断期间发生的。
  • 在一条指令的执行过程中,可能多次发生缺页中断。
  • 给一个进程分配的物理页框的集合被称之为驻留集。
待解决的问题:驻留集分配策略、内存置换策略、从何处调入
虚拟内存带来的效果:
  • 支持更有效的系统并发度:在内存中保留更多的进程
  • 解除用户与内存之间没必要的紧密约束:进程可以比内存全部空间都大
虚存的最大容量由计算机地址机构决定
手段:(段)页管理 + 部分加载 + 请求调页 + 换入换出

7.2 支持虚拟内存地硬件和控制结构

隐患:系统抖动(内存几乎所有空间都被各个进程占据时,当操作系统读取一块时,必须把另一块换出。如果此块正好在将要用时被换出,操作系统不得不很快将其取回。处理器大部分时间用于交换块,而不是执行指令)
解决方法:基于局部性原理推断将来最可能用到的块
众多操作系统的经验已经证明了虚存的可行性,基于分页的、分页和分段的虚拟内存已经成为当代操作系统的一个基本构件
虚拟内存通常与使用分页的系统联系在一起,每个进程都有自己的页表

分页存储管理

单级页表

notion image
notion image
页表也可能占据很大的内存空间
Pentium处理器,进程的虚存空间:2^32=4GB,使用4KB的页,进程的页表将有2^20个页表项,每项占4个字节,则页表将占用2^10个页,单个页表占 4MB。
解决方法:多级页表
使用二级页表:一级页号10位,一级页表有2^10个页表项,每项4个字节,一级页表占1页;二级页号10位,二级页表有2^10个页表项,每项4个字节,每个二级页表占1页,共2^10个二级页表,最坏情况需要 1024 个二级页表,共 4MB,但通常进程不需要全部空间,因此二级页表显著节省内存。

多级页表

notion image
notion image
notion image
一级/多级页表的大小与虚拟地址空间成正比
替代方案:倒排页表

倒排页表

用“物理页框号”为索引的页表,每项记录该页属于哪个进程、对应哪个虚拟页。
notion image

快表 TLB

转换检测缓冲区(Translate Lookaside Buffer, TLB)又称为快表,在MMU中,功能与Cache相似,包含有最近用过的页表项
notion image

高速缓存 Cache

页表项可能在TLB、内存或磁盘中
被访问的数据可能在Cache、内存或磁盘中
notion image
notion image
这两张图片来自《计算机组成原理》课程

分段存储管理

notion image
notion image
notion image

段页式存储管理

notion image
notion image
notion image
页尺寸
  • 页越小,内碎片总量越少
  • 页越小,页表越大,可用内存减少,可能导致一次内存访问两次缺页中断。
  • 页非常小,页数多,最近访问的部分都被包含在内存中,则缺页率低
  • 页越大,页数减少,代码(数据)越集中,局部性原理的影响被削弱,缺页中断有增加的可能
  • 页尺寸接近整个进程大小时,缺页率下降,最后为零
页尺寸对缺页中断发生概率的影响
notion image

7.3 支持虚拟内存的操作系统机制

驻留集分配策略

驻留集(工作集)是给进程分配的物理内存空间,其一般是动态变化的。
操作系统决定给特定的进程分配多大的主存空间:
  • 分配给一个进程的物理内存越小,驻留在主存中的进程数就越多,从而可以提高处理器的利用率
  • 如果一个进程分配的物理内存(页框)过少,尽管有局部性原理,页错误率仍然会相对较高
  • 如驻留集较大,由于局部性原理,当给特定进程分配更多的主存空间时,对进程的缺页错误率没有明显的影响。
两种分配方式:
  1. 固定分配(fixed-allocation):驻留集大小固定,可以:
      • 各进程平均分配;
      • 根据程序大小按比例分配;
      • 按优先权分配。
  1. 可变分配(variable-allocation):驻留集大小可动态变化,
      • 按照缺页率动态调整(高或低→增大或减小常驻集)
      • 性能较好,增加算法运行的开销。

页面置换策略

  1. 全局置换:
      • 从所有进程的页面中选择需要置换的页面;
      • 当内存紧张且多个进程频繁缺页时,系统会选择未被频繁访问的页面进行置换。
  1. 局部置换:
      • 在该进程的驻留集内部进行置换。
      • 能减少进程间干扰,简化页面分配策略
      • 最优算法(理想化模型)、先进先出算法(FIFO)、最近最久未使用算法(LRU)、CLOCK算法
置换算法
notion image
notion image
LRU是公认的很好的页置换算法,怎么实现?
  • 解决方法1:维护一个时间戳(time stamp),即计数器。每次页引用时,计数器加1,并将该值复制到相应页表项中。当需要置换页时,选则计数值最小的页。
    • 存在的问题:每次地址访问都需要修改时间戳,需维护一个全局时钟(该时钟溢出怎么办?),需要找到最小值,这样的实现代价较大。
  • 解决方法2:建立一个容量为有效页框数的页码栈。每当引用一个页时,该页号就从栈中上升到栈的顶部,栈底为LRU页。当需要置换页时,直接置换栈底页即可
    • 存在的问题:每次地址访问都需要修改栈,实现代价仍然较大
LRU准确,能更好地逼近OPT,但现实世界中用得非常少
CLOCK是LRU的近似实现
  • 结构初始化
    • 所有可用页框按顺序组成一个环形队列。
    • 每个页框都有一个“使用位(use bit)”,初始值为 0。
    • 一个指针(类似时钟指针)指向当前检查的位置。
  • 页面访问时
    • 当某页被访问(读或写)时,将该页的“使用位”设为 1(表示该页最近被使用过。)
  • 缺页时的替换过程
    • 当发生缺页中断,需要腾出页框时:
      • 从当前指针位置开始,检查页框的使用位:
        • 若为 1 → 将其清零(表示“刚刚用过,但下次可以考虑换出”),并移动指针到下一项;
        • 若为 0 → 表示该页最近没被用过,选它进行替换。
    • 将被替换页框装入新页,并把它的使用位设为 1。
    • 指针移到下一页框位置。
notion image

页面调入与放置策略

请求调页系统中的外存分为:
  • 文件区:存放(可执行)文件(原始存放位置)
  • 交换区:存放交换页面
交换区
  • 基于文件系统:Windows中pagefile.sys文件
  • 独立的磁盘分区:生磁盘(RAW),不需要文件系统和目录结构,如Linux中的swap分区
页面置换到什么地方?
  • 系统拥有足够的交换区空间:可以全部从交换区调入所需页面,以提髙调页速度。在进程运行前,需将与该进程有关的文件从文件区复制到交换区。
  • 系统缺少足够的交换区空间:凡不会被修改的文件都直接从文件区调入;而当换出这些页面时,由于它们未被修改而不必再将它们换出。对于可能被修改的部分,将它们换出时须放到交换区,需要时再从交换区调入。
  • UNIX方式:未运行过的页面,都应从文件区调入。曾经运行过但又被换出的页面,被放在交换区,下次调入时从交换区调入。

课堂练习

notion image
B
notion image
B
notion image
D
notion image
C
notion image
C
notion image
ABCD
notion image
0000 0000 0000 0000 0110 1111 0001 0010
0000 0000 00|00 0000 0110| 1111 0001 0010
notion image
notion image
notion image
notion image
页表项大小4B,小端序
0000 0000 0100 0000 0110 0111 1111 1010
0000 0000 01|00 0000 0110| 0111 1111 1010
一级页表里第第0x1 + 1个4B,二级页表里第0x110 + 1个4B
一级页表起始地址0x00000000,找第1 + 1个4B(0x00000004)
小端序,只有高20位有效
00 00 2|0 07 ←控制位,清零 下级页表起始地址:0x00 00 20 00,找第6 + 1个4B(0x00002018)
00 40 6|0 07 ←控制位,清零 块号:0x00 40 6 物理地址:0x00 40 67 FA
notion image

期末真题

2024秋

三、关于内存管理,回答下列问题。(8分)
1)阐述什么是内部碎片和外部碎片,并说明其产生原因。(2分)
  • 内部碎片(Internal Fragmentation):
    • 已分配的内存块内部未被充分利用的部分,即分配给进程的内存大于实际需要。
      产生原因:内存以固定大小的分区(或页框)分配,进程实际需求与分区大小不完全匹配,导致块内空间浪费。
  • 外部碎片(External Fragmentation):
    • 未分配的空闲内存被分散成多个小块,虽然空闲总量足够,但无法满足一个连续分配请求。
      产生原因:进程不断装入、撤出,造成内存中空闲区间分散、不连续。
2)若应用程序要执行的指令不在内存中,操作系统将如何处理?(2分)
  1. 产生缺页(或缺段)中断,CPU转入内核态;
  1. 操作系统根据中断信息查找该页(或段)在外存中的位置;
  1. 从外存(通常是磁盘)调入所需页(或段)到内存;
  1. 更新页表或段表,标记该页已在内存;
  1. 恢复进程并重新执行被中断的指令。
3)设页目录表的地址为0x0,采用二级页表(不确定有没有这句),详细阐述将线性地址0x0800214C转换为物理地址的过程。
(所给数据:0x80-0x83 27 20 FF 00,0x00FF2008-00B 25 90 FC 00,如果我没做错的话这些数据就够用了)
0000 1000 0000 0000 0010 0001 0100 1100
0000 1000 00|00 0000 0010| 0001 0100 1100
32 × 4 = 128 = 0x80 + 0x00 = 0x80
00 FF 2|0 27
2 × 4 = 8 = 0x08 + 0x00FF2000 = 0x00FF2008
00 FC 9|0 25 物理地址:0x00 FC 9C 00

2020春

四、关于内存管理回答下面的问题。(8分)
1)什么是虚拟内存?操作系统为什么要引入虚拟内存?(2分)
  • 虚拟内存(Virtual Memory):
    • 是一种让每个进程拥有连续、独立的逻辑地址空间的技术,它将进程的地址空间与实际物理内存空间分离,通过在需要时才将部分程序或数据装入内存来实现“假象的大内存”。
  • 引入原因:
      1. 允许程序比物理内存更大,提高内存利用率;
      1. 支持多道程序并发运行;
      1. 提供地址空间隔离,增强系统安全与稳定性。
2)对于分页内存管理,每个页表4k,相比于单级页表,请举例说明采用二级页表管理的优势是什么?(3分)
3)如果要访问的程序地址不在内存中,请简述操作系统是如何进行处理的。(3分)

2014

四.内存管理
1)什么是逻辑地址和物理地址。
2)进程在内存中地址是什么地址,什么是地址变换。
3)以实例说明多级分页的优势。
4)段和页式管理方式磁盘,地址变换过程分几步,每一步都做什么。
Loading...