7 虚拟内存
type
status
date
slug
summary
tags
category
icon
password
7.1 虚拟内存的定义
- 早期,整个程序装入内存执行,内存不够不能运行
- 后来,内存不足时以进程为单位在内外存之间交换
- 对内存采用分页/分段管理后:
- 进程中所有内存访问都是逻辑地址,运行时动态转换为物理地址,使重定位成为可能。
- 进程被划分成许多块(页或段),不需要连续地位于内存中。
- 进程不需要所有的页/段都在内存中(局部性原理)
- 时间局部性:某条指令被执行后,不久可能被再次执行,某数据被访问后,不久之后可能再次访问 (Cache)
- 空间局部性:一段时间内所访问的地址集中在一定范围内(虚存)
- 在页/段表项中,加入一个标志位,使处理器知悉该页/段是否在内存中。
- 调页时机:预调页(×);请求调页(√)
- 处理器需要访问一个不在内存中的逻辑地址时,会产生缺页中断。
- 进程被阻塞,操作系统发出磁盘I/O请求。
- 当块被载入内存后,修改页表,并通过I/O中断,唤醒该进程。
- 如果内存已满,先进行置换,置换是在缺页中断期间发生的。
- 在一条指令的执行过程中,可能多次发生缺页中断。
- 给一个进程分配的物理页框的集合被称之为驻留集。
待解决的问题:驻留集分配策略、内存置换策略、从何处调入
虚拟内存带来的效果:
- 支持更有效的系统并发度:在内存中保留更多的进程
- 解除用户与内存之间没必要的紧密约束:进程可以比内存全部空间都大
虚存的最大容量由计算机地址机构决定
手段:(段)页管理 + 部分加载 + 请求调页 + 换入换出
7.2 支持虚拟内存地硬件和控制结构
隐患:系统抖动(内存几乎所有空间都被各个进程占据时,当操作系统读取一块时,必须把另一块换出。如果此块正好在将要用时被换出,操作系统不得不很快将其取回。处理器大部分时间用于交换块,而不是执行指令)
解决方法:基于局部性原理推断将来最可能用到的块
众多操作系统的经验已经证明了虚存的可行性,基于分页的、分页和分段的虚拟内存已经成为当代操作系统的一个基本构件
虚拟内存通常与使用分页的系统联系在一起,每个进程都有自己的页表
分页存储管理
单级页表


页表也可能占据很大的内存空间
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,但通常进程不需要全部空间,因此二级页表显著节省内存。
多级页表



一级/多级页表的大小与虚拟地址空间成正比
替代方案:倒排页表
倒排页表
用“物理页框号”为索引的页表,每项记录该页属于哪个进程、对应哪个虚拟页。

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

高速缓存 Cache
页表项可能在TLB、内存或磁盘中
被访问的数据可能在Cache、内存或磁盘中


这两张图片来自《计算机组成原理》课程
分段存储管理



段页式存储管理



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

7.3 支持虚拟内存的操作系统机制
驻留集分配策略
驻留集(工作集)是给进程分配的物理内存空间,其一般是动态变化的。
操作系统决定给特定的进程分配多大的主存空间:
- 分配给一个进程的物理内存越小,驻留在主存中的进程数就越多,从而可以提高处理器的利用率
- 如果一个进程分配的物理内存(页框)过少,尽管有局部性原理,页错误率仍然会相对较高
- 如驻留集较大,由于局部性原理,当给特定进程分配更多的主存空间时,对进程的缺页错误率没有明显的影响。
两种分配方式:
- 固定分配(fixed-allocation):驻留集大小固定,可以:
- 各进程平均分配;
- 根据程序大小按比例分配;
- 按优先权分配。
- 可变分配(variable-allocation):驻留集大小可动态变化,
- 按照缺页率动态调整(高或低→增大或减小常驻集)
- 性能较好,增加算法运行的开销。
页面置换策略
- 全局置换:
- 从所有进程的页面中选择需要置换的页面;
- 当内存紧张且多个进程频繁缺页时,系统会选择未被频繁访问的页面进行置换。
- 局部置换:
- 在该进程的驻留集内部进行置换。
- 能减少进程间干扰,简化页面分配策略
- 最优算法(理想化模型)、先进先出算法(FIFO)、最近最久未使用算法(LRU)、CLOCK算法
置换算法


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

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

B

B

D

C

C

ABCD

0000 0000 0000 0000 0110 1111 0001 0010
0000 0000 00|00 0000 0110| 1111 0001 0010




页表项大小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

期末真题
2024秋
三、关于内存管理,回答下列问题。(8分)
1)阐述什么是内部碎片和外部碎片,并说明其产生原因。(2分)
- 内部碎片(Internal Fragmentation):
已分配的内存块内部未被充分利用的部分,即分配给进程的内存大于实际需要。
产生原因:内存以固定大小的分区(或页框)分配,进程实际需求与分区大小不完全匹配,导致块内空间浪费。
- 外部碎片(External Fragmentation):
未分配的空闲内存被分散成多个小块,虽然空闲总量足够,但无法满足一个连续分配请求。
产生原因:进程不断装入、撤出,造成内存中空闲区间分散、不连续。
2)若应用程序要执行的指令不在内存中,操作系统将如何处理?(2分)
- 产生缺页(或缺段)中断,CPU转入内核态;
- 操作系统根据中断信息查找该页(或段)在外存中的位置;
- 从外存(通常是磁盘)调入所需页(或段)到内存;
- 更新页表或段表,标记该页已在内存;
- 恢复进程并重新执行被中断的指令。
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):
是一种让每个进程拥有连续、独立的逻辑地址空间的技术,它将进程的地址空间与实际物理内存空间分离,通过在需要时才将部分程序或数据装入内存来实现“假象的大内存”。
- 引入原因:
- 允许程序比物理内存更大,提高内存利用率;
- 支持多道程序并发运行;
- 提供地址空间隔离,增强系统安全与稳定性。
2)对于分页内存管理,每个页表4k,相比于单级页表,请举例说明采用二级页表管理的优势是什么?(3分)
3)如果要访问的程序地址不在内存中,请简述操作系统是如何进行处理的。(3分)
2014
四.内存管理
1)什么是逻辑地址和物理地址。
2)进程在内存中地址是什么地址,什么是地址变换。
3)以实例说明多级分页的优势。
4)段和页式管理方式磁盘,地址变换过程分几步,每一步都做什么。
Loading...