
(以下内容全部出自上述课程)
目录
- 虚拟内存
-
- [1. 传统缺点](#1. 传统缺点)
- [2. 局部性原理](#2. 局部性原理)
- [3. 定义和特征](#3. 定义和特征)
- [4. 如何实现?](#4. 如何实现?)
- [5. 小结](#5. 小结)
- 请求分页管理方式
-
- [1. 页表机制](#1. 页表机制)
- [2. 缺页中断机构](#2. 缺页中断机构)
- [3. 地址变换机构](#3. 地址变换机构)
- [4. 地址转换](#4. 地址转换)
- [5. 注意点](#5. 注意点)
- [6. 小结](#6. 小结)
- 页面置换算法
-
- [1. 最佳置换算法(OPT)](#1. 最佳置换算法(OPT))
- [2. 先进先出置换算法(FIFO)](#2. 先进先出置换算法(FIFO))
- [3. 最近最久未使用置换算法(LRU)](#3. 最近最久未使用置换算法(LRU))
- [4. 时钟置换算法(CLOCK)](#4. 时钟置换算法(CLOCK))
- [5. 改进型的时钟置换算法](#5. 改进型的时钟置换算法)
- [6. 小结](#6. 小结)
- 页面分配策略
-
- [1. 驻留集](#1. 驻留集)
- [2. 页面分配、置换策略](#2. 页面分配、置换策略)
- [3. 何时调入页面](#3. 何时调入页面)
- [4. 从何处调入页面](#4. 从何处调入页面)
- [5. 抖动现象](#5. 抖动现象)
- [6. 工作集(了解)](#6. 工作集(了解))
- [7. 小结](#7. 小结)
- 内存映射文件
-
- [1. 传统文件访问](#1. 传统文件访问)
- [2. 内存映射文件](#2. 内存映射文件)
- [3. 小结](#3. 小结)
虚拟内存


1. 传统缺点
- 一次性:比如你只有8G的运行内存,但是你想玩一个64G的游戏,传统存储管理就必须把这64G全部调入内存之后才可以运行。传统来看根本没办法把64G放到8G中,所以用传统存储就出现了这样的局限性。
- 驻留性:这64G被装入内存之后,就必须等你关闭游戏之后才能把这64G全部从内存中搞出去。
- 问题来了 :玩这个游戏的时候,根本用不到全部的64G,你玩什么板块就只需要这个板块的内存,所以我们就可以通过虚拟存储技术 来实现,我们玩哪个板块就调进哪个板块的内存,从逻辑上扩大内存的大小(就是物理上还是8G,但是因为调入内存的大小不同,可以实现玩更大内存的游戏等)

2. 局部性原理
之前也提到过,就是什么时间调入什么板块的内存都是不确定的。

3. 定义和特征
有限空间-->不停调入需要用到的内存、踢掉不需要的内存-->实现8G运行64G的效果-->虚拟(就是假的)无限空间
打个比方:一家店你想买一个架子的苹果,你边往筐里放,店主边往架子上放苹果,你根本没注意到,就以为这个架子上有无数个苹果。
ps:很像Cache,毕竟都是有限空间不断调入调出。

- 多次性:对标传统的一次性,通过改进可以多次调入需要的内存。
- 对换性:对标传统的驻留性,可以多次换入换出正在运行的作业。
- 虚拟性 :因为看起来像是无限的内存,但实际上(物理上)并没有改变什么,所以是虚拟的。

4. 如何实现?
虚拟内存技术是建立在传统分页、分段、段页存储的基础上进一步改进得到的。
从名字对比上也可以看出来,操作系统需要提供请求调页 和页面置换 的功能。

5. 小结

请求分页管理方式
可以和基本分页存储对比:基本分页存储管理

1. 页表机制
- 基本页表:页号+内存块号
- 请求页表 :页号+内存块号+状态位+访问字段+修改位+外存地址

2. 缺页中断机构
与传统相比,就是多了一个快表(相当于工具),请求页表变得更复杂了而已。
- 快表命中-->直接查到
- 快表未命中-->查请求页表-->无就缺页中断

- 想访问的页面不在内存:缺货
- 缺页中断:缺货就不会再卖这个货了
- 进程堵塞-->放入阻塞队列:暂时下架
- 调页完成:补货
- 唤醒-->放回就绪队列:重新上架
这个时候重新上架可能出现两种情况:
- 内存有空闲块:自己的货架还有位置
- 内存没有空闲块:没位置还想上架这个,就只能把别的货撤掉咯


3. 地址变换机构
新增步骤:请求调页-->页面置换-->修改新增表项

4. 地址转换

- 快表:存入的页面必须在内存中,有改变就删除,必须保持正确率。
- 请求页表:在页表中的必是在内存中的,没有的就现调入。

5. 注意点


6. 小结

页面置换算法
这部分很像Cache,可以参考:Cache替换算法

1. 最佳置换算法(OPT)
需要替换页面的时候-->向后查找-->查找到最后出现的页号-->替换最后出现的页号的页面
- 缺页中断:见红色数字,最开始没存入页表的就算缺页中断
- 页面置换:除了最开始装入页表的,其余发生缺页中断都需要页面置换
- 页面置换次数=缺页中断次数-内存块数

因为实际上根本不可能预知需要什么页号,所以纯理想状态,无法实现。

2. 先进先出置换算法(FIFO)
需要替换页面-->查找最先进入内存的页面-->替换最先进入的

当我们换成四个内存块的时候,可以看出缺页中断的次数变得更高了,这就是Belady异常。
因为局部原理性,刚踢出去的页面也可能马上用到,所以这个算法最差了。

3. 最近最久未使用置换算法(LRU)
需要替换页面-->算上当前需要的页面往前数三格(刚好四个内存块,没被数到的就是最久没用的)-->换掉最久没用的页面

4. 时钟置换算法(CLOCK)
最久未用算法的变种。
规则 :扫描一次-->访问位置为0
目的 :找到访问位为0的,然后踢出去

5. 改进型的时钟置换算法
- 规则:扫描一次-->访问位置为0
- 目的 :优先(0,0),其次(0,1)


6. 小结

页面分配策略

1. 驻留集
就是分配给的内存块数(的总数)

2. 页面分配、置换策略
- 固定分配:由名字可见,怎样都不变
- 可变分配:灵活,运行期间可以看情况增减
- 局部置换:只能用分配给自己的
- 全局置换:就是大家谁有多余的,互相借一借
- 注意:固定分配只能用自己得到的,所以没有固定全局置换 之说




3. 何时调入页面

4. 从何处调入页面
优先对换区

其次文件区


5. 抖动现象

6. 工作集(了解)

7. 小结

内存映射文件


1. 传统文件访问
传统:如果要修改文件,需要先找到文件的位置,然后还需要调用函数。

2. 内存映射文件
映射:将在内存中的文件映射到虚拟地址(只是映射,还没存入,所以会有缺页中断)


3. 小结
