无标题
前言

虚拟内存基本概念

传统存储方式的缺点
①一次性:作业必须一次性全部转入内存后才能运行。
- 作业很大塞不进内存
- 大作业塞进去,小作业塞不进去,无法并发。
② 驻留性:作业被转入内存,就会一直驻留在内存中,(无论部分数据是否用得到),直到作业运行结束。

局部性原理
时间局部性,空间局部性。
虚拟内存
基于局部性原理。
在用户看来,似乎容量比实际容量大得多。
特征:
- 多次性:无需在作业运行时一次性装入内存。
- 对换性:作业运行时无需常驻内存。
- 虚拟性:逻辑上扩充了内存容量。
如何实现虚拟内存
虚拟内存需要建立在离散分配(而不是连续分配)的内存管理方式上。
- 请求分页存储管理
- 请求分段存储管理
- 请求段页式存储管理
额外的功能:
- 请求调页/段:当访问信息不在内存时,os负责将信息从外存调入内存。
- 页面/段置换:内存空间不够时,os将内存中暂时用不到的信息调出到外存。
回顾

请求分页管理方式
需要额外实现的功能:请求调页,页面置换。

页表的变化
页表新增的几个部分:状态位,访问字段,修改位,外存地址。

缺页中断机构
新增。


地址变换机构



回顾

页面置换算法
页面置换算法,决定应该换出哪一个页面。
追求更少的缺页率,减少io开销。

最佳置换算法OPT(optimal)
选择最长时间用不到的页面,换出。
缺页中断并不一定发生页面置换,比如还有可用内存块的时候。
但是实际上os并不能直到之后要访问的是哪一个页面,所以OPT是无法实现的。

先进先出置换算法(FIFO)
每次淘汰的是最早进入内存的页面。
(这个排队的队列存在最大长度,取决于系统为进程分配了多少个内存块。)
会产生belady异常,FIFO算法性能差。

最近最久未使用置换算法(LRU)
记录自上次被访问,到现在经历的时间t。
性能好。但是需要硬件支持,开销大。

时钟置换算法(CLOCK)
性能和开销平衡的算法。又叫最近未用算法(NRU)
- 简单时钟算法
- 改进时钟算法
新增一个访问位(表示最近是否被访问过)
选择淘汰界面最多会经历两轮扫描。(when第一列访问位全1,需进行第二轮,且先全置0)

改进时钟算法
只有淘汰的页面被修改过,才需要io操作写回外存。
所以优先淘汰没有修改过的页面,可以减少io操作。
新增一个修改位。

回顾

页面分配策略

驻留集:
请求分页存储管理中,给进程分配的物理块的集合。
固定分配:os为每个进程分配一定数目的物理块,在进程运行期间不再改变。
可变分配:先为进程分配一定数目的物理块,在进程运行期间,根据情况适当加减。
局部置换:发生缺页时只能选择自己的物理块进行置换。
全局置换:可以将os空闲的物理块分配给缺页进程。也可以将别的进程持有的物理块置换到外存,再分配给缺页进程。【这会造成别的进程物理块减少,缺页率增加】
搭配得到三种分配置换策略:

①固定分配+局部置换:不容易确定应该为每个进程分配多少个物理块。
②可变分配+全局置换: 会出现 – 只要进程发生缺页,就会获得新的物理块。
③可变分配+局部置换: 综合。
when调入页面
1.预调页策略:主要用于进程的首次调入。根据局部性原理,一次性调入多个相邻的页面而不是单一个。
2.请求调页策略:运行时发现缺页,才调入。
where调入页面
1.系统有足够的对换区空间
2.系统没有足够的对换区空间
3.unix方式

抖动/颠簸
刚换出的页面又得换回来了,或刚换入的页面又得换出外存了。
产生原因是:分配给进程的物理块数不够。(驻留集大小<工作集大小)
工作集
在某段时间间隔里,进程实际访问页面 的集合。
工作集大小可能小于窗口尺寸。

回顾

内存映射文件
传统访问方式

内存映射文件

内存映射文件还可以实现文件共享

回顾

