0%

虚拟内存

传统存储管理方式的特征

  • 一次性:作业必须一次性全部装入内存后才能开始运行
  • 驻留性:作业被装入内存后会一直驻留在内存中

前者导致:
1、作业很大时不能全部装入内存
2、大量作业运行无法全部装入,并发度下降

后者导致运行时只需访问作业一小部分,所以大部分被浪费了

局部性原理

  • 时间局部性:由于循环等程序特征,导致指令短时间内多次循环
  • 空间局部性:由于很多数据在内存中是连续存放的,指令也是连续存放,所以程序访问存储单元后,很可能附近储存单元也会被访问

虚拟内存的定义和特征

在程序装入时,程序将很快会用到的部分装入内存,暂时用不到的部分留在外存
在程序执行时,所访问信息不在内存时,由操作系统负责将所需信息从外存调入内存
在内存不够时,操作系统负责将用不到的信息调出外存
这样一个看起来很大的内存,就是虚拟内存

特征:
1、多次性:被允许分成多次调入
2、对换性:被允许在作业允许过程中将作业换入换出
3、虚拟性:内存容量看起来比原来的大很大

实现虚拟内存技术

建立在离散分配的内存管理方式基础上

实现:
1、请求分页存储管理
2、请求分段存储管理
3、请求段页式存储管理

与传统非连续分配存储管理的主要区别:
1、所访问信息不存在时,操作系统负责将信息从外存调入(请求调页/调段)
2、内存空间不够时操作系统负责将不用的信息调出(页面置换/段置换)

请求分页管理方式

缺页中断

缺页中断(属于内中断):当前执行的指令未调入内存时发生。

一条指令可能发生多次中断 e.g:copy A to B


//和普通内存调用的区别以后再补//


页面置换算法

越好的算法应该追求更少的缺页率

最佳置换算法(OPT)

每次选择淘汰的页面将是以后永不使用,或者在最长时间内不再被访问的页面

缺页时未必发生页面置换,若还有可用的空闲内存块,则不需进行页面置换是一个无法实现的理想算法

先进先出置换算法(FIFO)

每次选择淘汰的页面是最早进入内存的页面

Belady异常:当为进程分配的物理块数增大时,缺页次数不减反增的异常现象

只有FIFO会发生这个异常,算法性能最差,因为有可能先进的页面很受欢迎

最近最久未使用置换算法(LRU)

每次淘汰的页面是最近最久未使用的页面
实现方法:对应页表项中,用访问字段记录该页面自上次被访问以来所经历的时间t
特点:算法性能好,实现困难,开销大

时钟置换算法(CLOCK)/最近未用算法(NRU)

折中算法

简单CLOCK算法实现方法

为每个页面设置一个访问位,将内存中的页面用指针连接成循环队列。设置两个指针,一个是扫描指针,用来在循环的队列中循环扫描;一个是访问指针,用来指向待访问的页面串。每次访问指针变动时,检测队列中页面,相应页面访问位置1,若访问指针指向队列中不存在的页面,也就是当到需要选择页面替换的时候,移动扫描指针知道遇到访问位为0的块对应页,将其替换,若扫描指针指到访问位为1,则置0(复活甲)

最多进行两轮扫描

改进CLOCK算法

相对前者多考虑了一个未被修改页面不需要写回外存的设定,即只有被淘汰的页面被修改过的,才需要写回外存

具体规则简单来说分四大优先级:
* 第一优先——最近没访问,且没修改的页面(0,0)
* 第二优先——最近没访问,但修改过的页面(0,1)且改访问位为0
* 第三优先——最近访问过,但没修改的页面(0,0)
* 第四优先——最近访问过,且修改过的页面(0,1)

助记:00,01,10(改访问位之前),11

页面分配策略

驻留集

指请求分页存储管理中给进程分配的物理块的集合

我更喜欢另一种解释:进程已装入内存的页面的集合

其实就是作业里操作系统给进程分配的固定块数量

从操作系统角度,可以分为固定分配可变分配两种 从进程本身角度,可以分为局部置换全局置换两种 顾名思义,固定分配肯定和全局置换(可以置换其他空闲物理块或别的进程的物理块)相矛盾

 固定分配可变分配
局部置换
全局置换×

所以页面分配策略能分为以下三种

页面分配/置换策略

固定分配局部置换

物理块在分配期间不变,且发生缺页时切换都发生在给自己分配的页面中进行

缺点:物理块的分配难以测定,不知道分多少合适

可变分配全局置换

物理块分配可以改变,发生缺页时,操作系统从空闲物理块队列中取出一块分配给该进程,当没有空闲物理块时,选择一个未锁定的页面换出外存,再分配给进程

未锁定:不能置换出外存的页面,如一些内核数据等

优点:发生缺页时必定获得新物理块

缺点:被分出物理块的进程缺页率增加

可变分配局部置换

根据缺页率来分配,刚开始物理块不变,若缺页率较高则分配物理块,若较低则分出物理块

调入页面的时机

  • 预调页策略:根据局部性原理提前调入多个相邻页面,主要用于进程的首次调入,成功率低(50%)

    运行前

  • 请求调页策略:运行期间发生缺页时才将所缺页面调入内存,需要频繁使用I/O操作

    运行时

抖动/颠簸

症状:频繁的页面调入调出

发生原因:进程频繁访问的页面数量高于物理块数(其实就是物理块分配不够)

物理块分配少,抖动发生频繁,物理块分配多,造成系统整体并发度降低

所以"工作集"概念被提出

工作集

指在某段时间间隔内,进程实际访问页面的集合

例如(某窗口尺寸下):

1 3 5 6 3 5 3 5

工作集为1 3 5 6

驻留集回顾:给进程分配的物理块的集合

驻留集大小不能小于工作集大小,否则容易频繁缺页

所以说在实际应用中,根据工作集给出页面置换算法是是比较科学的选择,如上例子给出4个以上内存块就能满足运行需要