虚拟内存
解决主存容量不足
1、如果程序太大,超过了内存的容量,可以采用手动的覆盖技术,只把需要的指令和数据保存在内存中
2、如果是程序太多,超过了内存的容量,可以采用自动的交换技术,把暂时不能执行的程序送到外存中
3、如果想在有限容量的内存中,以更小的页粒度为单位装入更多更大的程序,可以采用自动的虚拟存储技术
覆盖技术
1、目标:在较小的可用内存中运行较大的程序。常用于多道程序系统,与分区存储管理配合使用
2、原理:把程序按照其自身逻辑结构,划分为若干个功能上相对独立的程序模块,那些不会同时执行的模块共享同一块内存区域,按时间先后来运行
(1)必要部分(常用功能)的代码和数据常驻内存
(2)可选部分(不常用功能)在其它程序模块中实现,平时存放在外存中,在需要时才装入内存
(3)不存在调用关系的模块不必同时装入内存,从而可以相互覆盖,即这些模块共用一个分区
3、缺点
(1)由程序员来把一个大的程序划分为若干个小的功能模块,并确定各个模块之间的覆盖关系,费时费力,增加了编程的复杂度
(2)覆盖模块从外存装入内存,是以时间换空间
交换技术
1、目标:多道程序在内存中时,让正在运行的程序或需要运行的程序获得更多的内存资源
2、原理:可将暂时不能运行的程序送到外存,从而获得空闲内存空间
(1)OS 把一个进程的整个地址空间的内容,保存到外存中(换出:swap out)
(2)OS 将外存中的某个进程的地址空间读入到内存中(换入:swap in)
(3)换入换出内容大小为整个程序的地址空间
3、存在的问题
(1)交换时机的确定:只有当内存空间不够或有不够的危险时换出,因为交换需要很大的时间开销,需要尽量少交换
(2)交换区的大小:必须足够大以存放所有用户进程的所有内存映像的拷贝,必须能对这些内存映像进行直接存取
(3)程序换入时的重定位:因为换出换入后的内存位置不一定相同,所以最好采用动态地址映射的方法
覆盖技术、交换技术
1、位置
(1)覆盖发生在运行程序的内部
(2)交换发生在内存中,程序与管理程序或操作系统之间
2、要求
(1)覆盖只能发生在没有调用关系的程序模块之间,因此程序员必须给出程序内的各个模块之间的逻辑覆盖结构
(2)交换技术是以在内存中的程序大小为单位来进行,它不需要程序员给出各个模块之间的逻辑覆盖结构
3、缺点
(1)覆盖需要程序员自己把整个程序划分为若干个小的功能模块,并确定各个模块之间的覆盖关系,增加了程序员的负担
(2)交换以进程作为交换的单位,需要把进程的整个地址空间都换进换出,增加了处理器的开销
虚拟内存管理技术
1、目标
(1)如覆盖技术,不是把程序的所有内容都放在内存中,因而能够运行比当前的空闲内存空间还要大的程序,但做得更好,能由操作系统自动完成,无需程序员介入
(2)如交换技术,能够实现进程在内存和外存之间的交换,因而获得更多的空闲内存空间,但能做得更好,只对进程的部分内容在内存和外存之间进行交换
2、程序的局部性原理
(1)指程序在执行过程中的一个较短时间,所执行的指令地址、指令的操作数地址分别局限于一定区域
(2)时间局部性:一条指令的一次执行和下次执行,一个数据的一次访问和下次访问都集中在一个较短的时间里
(3)空间局部性:当前指令和领近的几条指令,当前访问的数据和领近的几个数据都集中在一个较小区域内
(4)程序的局部性原理表明,从理论上来说,虚拟存储技术是能够实现的,而且在实现了以后应该能够取得一个满意的效果的
3、基本概念
(1)可以在页式或段式内存管理的基础上实现
(2)在装入程序时,不必将其全部装入到内存,而只将当前需要执行的部分页面或段装入到内存,就可让程序开始执行
(3)在程序执行过程中,如果需执行的指令或访向的数据尚未在内存(称为缺页 / 缺段),则由处理器通知 OS 将相应的页面或段调入到内存,然后继续执行程序
(4)另一方面,OS 将内存中暂时不使用的页面或段调出保存在外存上,从而腾出更多空闲空间存放将要装入的程序以及将要调入的页面或段
4、基本特征
(1)大的用户空间:通过把物理内存与外存相结合,提供给用户的虚拟内存空间通常大于实际的物理内存,即实现了这两者的分离
(2)部分交换:与交换技术相比较,虚拟存储的调入和调出是对部分虚拟地址空间进行的
(3)不连续性:物理内存分配的不连续,虛拟地址空间使用的不连续
5、虚拟页式内存管理
(1)大部分虚拟存储系统都采用虚拟页式存储管理技术,即在负式存储管理的基础上,增加请求调页和页面置换功能
(2)基本思路:
(3)当一个用户程序要调入内存运行时,不是将该程序的所有页面都装入内存,而是只装入部分的页面,就可启动程序运行
(4)在运行的过程中,如果发现要运行的程序,或要访问数据不在内存,则由系统发出缺页中断请求,系统在处理这个中断时,将外存中相应的页面调入内存,使得该程序能够继续运行
6、页表表项
(1)逻辑页号
(2)访问位:如果该页面被访问过(包括读操作或写操作),则设置此位用于页面置换算法,若该页被访问过,该位被置为 1;若该页未被访问过,该位被置为 0
(3)修改位:表明此页在内存中是否被修改过(只包括写操作),当系统回收该物理页面时,根据此位来决定是否把它的内容写回外存,提高置换效率,若该页被写过,该位被置为 1;若该页未被写过,该位被置为 0
(4)保护位:表示允许对该页做何种类型的访问,如只读、可读写、可执行等
(5)驻留位:表示该页是在内存还是在外存,如果该位等于 1,表示该页位于内存当中,即该页表项是有效的,可以使用;如果该位等于 0,表示该页当前还在外存当中,如果访问该页表项,将导致缺页中断
(6)物理页帧号
7、缺页中断处理过程
(1)如果在内存中有空闲的物理页面,则分配物理页帧 f,然后转(4),否则转(2)
(2)采用某种页面置换算法,选择一个将被替换的物理页帧 f,它所对应的逻辑页为 q,如果该页在内存期间被修改过,则需把它写回内存;否则直接释放
(3)对 q 所对应的页表项进行修改,把驻留位置为 0
(4)将需要访问的页 p 装入到物理页面 f 当中
(5)修改 p 所对应的页表项的内容,把驻留位置为 1,把物理页帧号置为 f
(6)重新运行被中断的指令
8、虚拟内存性能
(1)为了便于理解分页的开销,使用有效存储器访问时间(EAT / effective memory access time)
(2)EAT = 访问内存时间 * 页表命中机率 + 页缺失处理时间(即访问外存时间)* 页缺失机率
(3)例:访问内存时间:10ns,访问磁盘时间 5ms,参数 p = 缺页机率,参数 q = 脏页机率(即换出操作)
(4)EAT = 10 * (1 - p) + 5,000,000 * p * (1 + q)
后备存储
1、保存未被映射的页
(1)能够简单地识别在二级存储器中的页
(2)交换空间(磁盘 / 文件):特殊格式,用于存储未被映射的页面
2、位置
(1)数据文件:一个虚拟地址空间的页面可以被映射到一个文件(在二级存储中)中的某个位置
(2)代码段:映射到可执行二进制文件
(3)动态加载的共享库程序段:映射到动态调用的库文件
(4)其它段:可能被映射到交换文件(swap file)运行产生的数据
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战