内存空间扩容
思考:GTA游戏60GB,讲道理运行前应该把60GB数据放入内存,然而我的电脑只有4GB,但是为什么游戏可以正常运行?
1.覆盖技术(单个进程)
-
覆盖技术的思想:将程序分为多个段(多个模块)。 常用的段常驻内存,不常用的段在需要时调入内存。
-
一个固定区
存放最活跃的程序段
分配在固定区的程序段,在运行过程中就不会调入调出(内存<->外存)
-
若干个覆盖区
层级相同的模块程序代码共享一个覆盖区
在运行过程中根据需要调入调出
-
必须由程序员声明覆盖结构,操作系统完成自动覆盖。
-
缺点:对用户不透明,增加了用户编程负担,现在的程序代码很难分层
注意:覆盖是在同一个程序或者说同一个进程发生的
2.交换技术(不同进程)
-
交换(对换)技术的设计思想:内存空间紧张时,系统将内存中某些进程暂时换出外存,把外存中 某些已具备运行条件的进程换入内存(进程在内存与磁盘间动态调度)
-
中级调度(内存调度),就是要决定将哪个处于挂起状态的进程重新调入内存。
-
几个需要解决的问题
- 应该在外存(磁盘)的什么位置保存被换出的进程?
具有对换功能的操作系统中,通常把磁盘空间分为文件区和对换区两部分。
文件区主要用于存放文件,主要追求存储空间的利用率,因此对文件区空间的管理采 用离散分配方式;
对换区空间只占磁盘空间的小部分,被换出的进程数据就存放在对换区。
- 什么时候应该交换?
交换通常在许多进程运行且内存吃紧时进行,而系统负荷降低就暂停。例如:在发现许多进程运行时经常发生缺页,就说明内存紧张,此时可以换出一些进程; 如果缺页率明显下降,就可以暂停换出。
- 应该换出哪些进程?
可优先换出阻塞进程;可换出优先级低的进程;为了防止优先级低的进程在被调 入内存后很快又被换出,有的系统还会考虑进程在内存的驻留时间
-
交换是在不同进程或者说不同作业之间发生的
注意:PCB 会常驻内存,不会被换出外存
3.虚拟技术(最复杂)
3.1.虚拟内存的基本概念
下面只针对请求分页存储管理展开
3.2.请求分页管理方式
- 页表机制
- 在基本分页的基础上增加了几个表项
- 状态位,表示页表是否已经在内存中
- 访问字段,记录最近被访问的次数,或者记录上次访问的时间,是给置换算法选择换出页面做参考
- 修改位,表示页面调入内存后,(代码)有没有被修改过,只有修改过的页面才会在置换的时候写回外存
- 外存地址,页面在外存中存放的位置
- 缺页中断机构
- 当找到页表项后,根据状态位判断页面是否在内存,若不在内存中,则产生缺页中断
- 缺页中断处理后,目标页面会被调入到内存,若当前内存分配的已满,则需要换出老页面
- 缺页中断属于内中断,属于内中断里的故障,就是会被系统修复的异常,此时缺页的进程阻塞,放入阻塞队列,调页完成后再将其唤醒,放回就绪队列。
- 一条指令在执行过程中,可能会产生多次缺页中断
- 地址变换机构
- 找到页表项(页表会记录所有页面分配情况),检查页面是否在内存中
- 若页面不再内存中,需要请求调页
- 若内存空间不够,需要换出老页面(页面置换算法,下面补充)
- 页面调入内存后,记得修改相应的页表项
3.3.页面置换算法
-
背景
请求分页存储管理与基本分页存储管理的主要区别: 在程序执行过程中,当所访问的信息不在内存时,由操作系统负责将所需信息从外存调入内存,然后继续执行程序。 若内存空间不够,由操作系统负责将内存中暂时用不到的信息换出到外存。
-
最佳置换算法OPT(optimal)
- 优先置换最长时间内不会被访问的页面
- 缺页率最小,性能最好,但是无法预判后面访问的页面也就无法实现
-
先进先出置换算法FIFO(first input first output)
- 优先淘汰最先进入内存的页面
- 实现简单,但是性能很差,往往最先进入的页面需要多次访问
- 可能出现Belady异常
- Belady 异常——当为进程分配的物理块数增大时,缺页次数不减反增的异常现象。
-
最近最久未使用置换算法LRU(least recently)
- 前提:内存块已经塞满页面,页表记录有最近访问时间戳
- 优先淘汰最久没有访问页面(页表有最近访问时间戳)
- 性能很好,但是需要硬件支持,算法开销大
-
时钟置换算法clock
- 前提:内存块塞满了页面,并且此时页面访问位都是=1
- 循环扫描每个页面
- 第一轮先找到访问位=0的页面,置换新页面,并将扫描过的页面改成访问位=0,若第一轮没有选中,则进行第二轮扫描(第二轮扫中一定会有访问位为0的页面)
- 实现简单,算法开销小,但是没有考虑页面有没有被修改
-
改进型的时钟置换算法
-
{访问位,修改位},访问的页面比修改的页面更值得留下
-
前提:内存块塞满了页面,并且此时页面访问位都是=1,修改位未知
第一优先级,最近没访问,最近没修改
第二优先级,最近没访问,最近有修改
第三优先级,最近有访问,最近没修改
第四优先级,最近有访问,最近有修改
算法开销小,性能也还不错
3.4.页面分配策略
背景:我们已经知道请求分页管理方式,页面置换算法,那怎么知道进程需要分配多少物理块呢?
-
概念
- 驻留集
- 指请求分页存储管理中给进程分配的物理块的集合。
- 驻留集大小一般小于进程的总大小
- 若驻留集太小,会导致缺页频繁,系统要花大量的时间来处理缺页,实际用于进程推进的时间很少; 驻留集太大,又会导致多道程序并发度下降,资源利用率降低
- 固定分配
操作系统为每个进程分配一组固定数目的物理块,在进程运行期间不再改变。即,驻留集 大小不变
- 可变分配
先为每个进程分配一定数目的物理块,在进程运行期间,可根据情况做适当的增加或减少。 即,驻留集大小可变
- 局部置换
发生缺页时只能选进程自己的物理块进行置换。
- 全局置换
可以将操作系统保留的空闲物理块分配给缺页进程,也可以将别的进程持有的物理块置换 到外存,再分配给缺页进程。
-
页面分配、置换策略
- 固定分配局部置换
进程运行前就分配一定数量物理块,缺页的时候只能换出进程自己的某一页
- 可变分配全局置换
只要缺页就分配新的物理块,可能来自空闲物理块,也可能需要换出其他进程的页面
- 可变分配局部置换
频繁缺页的进程,多分配一些物理块;缺页率很低的进程,回收一些物理块,直到缺页率合适
-
调入页面的时机
- 预调页策略,一般用于进程运行前
- 请求调页策略,进程运行时,发现缺页再调页
-
从何处调页(外存->内存)
- 对换区,采用连续连续,文件区,采用离散存储方式
- 对换区足够大,运行将数据从文件区复制到对换区,之后所有页面调入和调出都是内存与对换区之间进行
- 对换区不够大,不会被修改的文件,直接从文件区取出;会修改的文件先放到调换区,有需要时再从对换区调入
- UNIX方式,第一次使用的页面都是从文件区调入;调出的页面都需要写回对换区,再次使用时从对接区调入
-
抖动现象
页面频繁换入换出,主要原因是分配给进程的物理块不够
-
工作集
在某段时间间隔内,进程实际访问页面的集合,驻留集一般不能小于工作集大小