4 虚拟内存
概述
- 起因:应用程序对内存的容量的需求大于内存容量的增长速度
- 解决办法:
- 起初,OS的内存管理能力较弱,程序员可以采取手动覆盖(overlay)的方法,自己编写程序,只将需要的程序和数据留在内存中,不需要的放硬盘(代表:DOS系统)
- 后期,当程序太多,超出内存容量时,可采用自动的交换(swapping)技术,将暂时不使用的程序送到外存
- 现在,如果想要在有限的内存中,以更小的页粒度放入更多、更大的程序,可以采用自动的虚拟存储技术
覆盖技术(Overlay)
-
按照程序自身逻辑结构,对程序功能模块进行拆分,对不会同时执行的模块,按时间先后加载到内存中去
- 程序必要模块(常用功能)的代码和数据常驻内存,同时负责该程序的内存调度
- 对于可选功能(不常用功能),平时存放在外存中,只在被调用时才加载到内存中去
- 对于不存在相互调用关系的模块,在不同时间段加载到同一块内存分区,可以相互覆盖
-
缺点:
- 程序员需要对程序的功能模块进行拆分,考虑程序的覆盖顺序,增加了程序员的设计开销
- 覆盖模块从外存加载到内存,IO增加了时间开销
交换技术(Swapping)
- 通过将暂时不运行的程序存放到外存中,以腾出空闲内存空间
- Swap in:OS从外存中某个进程的地址空间读入内存
- Swap out:当内存空间不够时,OS在MMU的帮助下,将内存中一个进程的整个地址空间的内容存放到外存中
- 换入换出的大小为整个程序的地址空间
- 交换过程由OS管理,对程序员透明
- 问题
- 何时交换? 交换时间开销较大, 只有当内存空间不足或有不足的风险时换出
- 交换区大小:必须足够大,以存放所有用户进程的所有内存映像的拷贝
- 程序换入时的重定位:换出后再换入的内存位置一定要在原来的位置上吗?- 最好采用动态地址映射的方法
- 覆盖 vs 交换
- 覆盖需要程序员给出程序的逻辑覆盖结构,交换则完全由OS负责
- 交换发生在程序与程序之间,覆盖发生在程序内部的模块之间
虚拟内存技术
-
原理: 将内存中暂时不运行的程序、数据存放到外存中去
-
与覆盖和交换技术的对比
- 虚存技术和覆盖技术都是只加载程序的一部分到内存中去,但覆盖技术需要由程序员手动给出程序的逻辑覆盖结构,而虚存技术则是由OS进行管理
- 虚存技术和交换技术都会将内存中暂时不用的程序、数据存放到外存中去,但交换技术是将内存中整个进程的代码和数据swap out到外存中,而虚存技术只是将程序部分代码、数据存放到外存
-
如何实现OS自动管理? → 程序局部性原理
- 时间局部性:一条指令的一次执行和下次执行,一个数据的一次访问和下次访问都集中在一个较短的时期内
- 空间局部性:一条指令和邻近的几条指令,当前访问的数据和邻近的几个数据都集中在一个较小区域内
- 程序局部性表明,从理论上说,虚存技术是能够实现的,而且实现以后应该是能够得到一个满意的效果的
-
可以在页式或段式内存管理的基础上实现
- 在装入程序时,不必将整个程序装入内存,只需将当前需要执行的部分页或段装入内存,即可让程序运行
- 在程序执行中,如果需要执行的指令或访问的数据尚未在内存中(缺页或缺段异常),则由处理器通知OS将相应页/段调入内存,然后继续执行程序
- 当内存不足时,OS将内存中暂时不使用的页 / 段保存到外存上,从而腾出更多空闲空间存放将要装入的程序及将要调入的页 / 段
-
基本特征:
- 大的用户空间:通过将物理内存和外存相结合,使得提供给用户的虚拟内存空间大于实际的物理内存,即实现二者的分离
- 部分交换:与交换技术相比,虚存技术的调入调出是对部分虚拟空间进行的
- 不连续性:物理内存分配不连续;虚拟地址空间也是不连续的(不连续的物理内存swap out导致)
-
虚拟页式存储管理
-
大部分虚拟存储系统均采用虚拟页式存储管理技术,即在页式存储管理的基础上,增加请求调页和页面置换功能
-
基本原理
- 当一个用户程序要调入内存时,不是将程序的所有页面都装入内存,而是只装入部分页面,就可启动程序运行
- 运行过程中,如果发现要运行的程序或访问的数据不在物理内存中,则CPU向OS发出缺页中断请求。系统处理该中断时,将外存相应页面调入内存,使该程序能够继续运行(内存已满时,采用页面置换算法)。
-
页表表项 -- 增加了部分标识位flags
- 驻留位(resident bit):表示该页是否在物理内存中。1表示存在于内存中,该页表项有效;0表示该页还在外存中,若访问该页将导致缺页中断。
- 保护位:表示允许对该页做何种类型的访问(如只读、可读写、可执行等)
- 修改位(dirty bit):表示该页在内存中是否被修改过,当系统回收该物理页面时,根据该位决定是否将该页写到外存。若未修改过,可直接释放内存。
- 访问位(access bit):表示该页在内存中是否被访问过。如果该页被频繁访问,则页面置换时不应将其换到外存中;反之,说明该页不常被访问,可置换到外存中
-
缺页中断处理过程:
- 如果内存中有空闲的物理页面,则分配一物理页帧,然后转步骤4,否则转2
- 采用某种页面置换算法,选取一将被置换的物理页帧f,其对应的逻辑页号为q。若页帧f在内存中被修改过,则将其写回外存
- 修改q对应的页表项,驻留位置为0
- 将需要访问的页p装入物理页面f中
- 修改p对应的页表项的内容,将驻留位置1,物理页帧号置f
- 重新允许被中断的指令
-
后备存储(Backing Store)--> 二级存储
- 一个虚拟地址空间的页面可以被映射到一个文件(在二级存储中)中的某个位置
- 代码段:映射到可执行二进制文件,需要执行相应的指令时才被加载到内存中去
- 动态加载的共享库程序段:映射到动态调用的库文件
- 其他段:可能被映射到交换文件
-
虚拟内存性能 -- 衡量分页开销
-
通过有效存储器访问时间EAT(Effective memory Access Time)衡量
-
EAT = 访存时间 x 页表命中率 + 缺页中断处理时间 x 缺页中断几率
-
例子:
- 访存时间:10 ns - 磁盘访问时间:5 ms - 参数p -- page fault(缺页中断)几率 - 参数q -- dirty page几率 (内存修改位为1,需要Swap Out) - EAT = 10(1 - p) + 5,000,000p(1 + q)
-
-
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南