覆盖与交换

 

1. 覆盖与交换

覆盖, 交换, 虚拟存储技术常用于实现内存空间的扩充

 

1.1 覆盖技术

覆盖技术的思想:将程序分为多个段,常用的段常驻内存,不常用的段在需要的时候调入内存

内存中分为一个"固定区" 和若干个"覆盖区",常用的段放在固定区,不常用的段放在覆盖区

缺点:必须由程序员声明覆盖结构, 对用户不透明, 增加了用户的编程负担,覆盖技术只用于早期的操作系统中。

lua内存增长 内存增加技术_缺页中断

1.2 交换技术

交换技术的思想:内存空间紧张时, 系统将内存中某些进程暂时换出外存,把外存中某些已具备运行条件的进程换入内存(即进程在内存与磁盘间动态调度)

1、应该在外存(磁盘)的什么位置保存被换出的进程?

2、什么时候应该交换?

3、应该换出哪些进程?

 

1.具有对换功能的操作系统中,通常把磁盘空间分为文件区和对换区两部分。文件区主要用于存放文件,主要追求存储空间的利用率,因此对文件区空间的管理采用离散分配方式;对换区空间只占磁盘空间的小部分,被换出的进程数据就存放在对换区。由于对换的速度直接影响到系统的整体速度,因此对换区空间的管理主要追求换入换出速度,因此通常对换区采用连续分配方式。总之,对换区的I/o速度比文件区的更快。

2.交换通常在许多进程运行且内存吃紧时进行,而系统负荷降低就暂停。例如:在发现许多进程运行时经常发生缺页,就说明内存紧张,此时可以换出一些进程;如果缺页率明显下降,就可以暂停换出。

3.可优先换出阻塞进程;可换出优先级低的进程;为了防止优先级低的进程在被调入内存后很快又被换出,有的系统还会考虑进程在内存的驻留时。

lua内存增长 内存增加技术_缺页中断_02

  

2. 虚拟内存

虚拟内存的目的是为了让物理内存扩充成更大的逻辑内存,从而让程序获得更多的可用内存。

 

2.1 传统存储管理方式的特征、缺点

1、一次性:作业必须一次性全部装入内存后才能开始运行

  • 作业很大时,无法装入导致大作业无法运行
  • 大量作业要求运行时内存无法容纳所有作业,导致多道程序并发度下降

2、驻留性:一旦作业被装入内存,就会一直驻留在内存中,直到作业运行结束,这样会导致内存中驻留大量的,暂时用不到的数据,浪费内存资源。

2.2 高速缓冲技术的思想

将近期会频繁访问到的数据放到更高速的存储器中,暂时用不到的数据放在更低速存储器中。

 

2.3 虚拟内存的定义和特征

  • 在程序装入时,将程序中很快会用到的部分装入内存,暂时用不到的部分留在外存,就可以让程序开始执行。
  • 在程序执行过程中,当所访问的信息不在内存时,由操作系统负责将所需信息由外存调入内存,然后继续执行程序。请求调页/段
  • 内存空间不够时, 操作系统负责将内存中暂时用不到的信息换出到外存。页面置换
  • 在用户看来,就有一个比实际内存大很多的内存,这就叫虚拟内存。

虚拟内存的最大容量是由计算机的地址结构(CPU的寻址范围)确定的

虚拟内存的实际容量 = min(内存容量+外存容量,CPU寻址范围)

特征

多次性:无需在作业运行时一次性全部装入内存,而是允许被分成多次调入内存。

对换性:在作业运行时无需一直常驻内存,而是允许在作业运行过程中,将作业换入、换出。

虚拟性:从逻辑上扩充了内存的容量,使用户看到的内存容量远大于实际容量。

 

 

2.4 虚拟内存的实现

请求分页存储管理

页表机制

lua内存增长 内存增加技术_lua内存增长_03

缺页中断机构

在请求分页操作系统中,每当要访问的页面不在内存时,便产生一个缺页中断, 然后由操作系统的缺页中断处理程序处理中断。

此时缺页的进程阻塞,放入阻塞队列,调页完成后再将其唤醒, 放回就绪队列。

  • 如果内存中有空闲块,则为进程分配一个空闲块,将所缺页面装入该块,并修改页表中相应的页表项
  • 如果内存中没有空闲块,则由页面置换算法选择一个页面淘汰,若该页面在内存期间被修改过,则要将其写回外存,未修改过的页面不用写回外存。

缺页中断是因为当前执行的指令想要访问目标页面未调入内存而产生的,因此属于内中断(故障) 。

 

页面置换算法

 

1. 最佳置换(Optimal, OPT)

1.1 基本思想

置换以后不再被访问,或者在将来最迟才回被访问的页面,缺页中断率最低。但是该算法需要依据以后各业的使用情况,而当一个进程还未运行完成是,很难估计哪一个页面是以后不再使用或在最长时间以后才会用到的页面。所以该算法是不能实现的。但该算法仍然有意义,作为很亮其他算法优劣的一个标准。

1.2 算例

采用固定分配局部置换的策略,嘉定系统为某进程在内存中分配了3个物理块,页面访问顺序为2、3、2、1、5、2、4、5、3、2、5、2。假定系统未采用预调页策略,即未事先调入任何页面。

因为它在以后不会在使用了;第5次缺页中断时,淘汰页面2,因为它在5、3、2三个页面中,是在将来最迟才会被页面访问的页面。

      以此类推:   

    注意:第4次中断时将最后不会访问的1剔除,将最后才访问的3放入最下面的内存块中,以后的调度过程中,最后不会访问或最后才被访问的页面总是放在最下面的内存块中。内存块从上到下依次存放最先访问的页面。   

    中断次数为6,缺页中断率为6/12*100% = 50%。

lua内存增长 内存增加技术_缺页_04

 

 

2. 先进先出置换算法(First In First Out, FIFO)

2.1 基本思想

置换最先调入内存的页面,即置换在内存中驻留时间最久的页面。按照进入内存的先后次序排列成队列,从队尾进入,从队首删除。但是该算法会淘汰经常访问的页面,不适应进程实际运行的规律,目前已经很少使用。

2.2 算例

仍然以OPT算例为例子。   

  中断次数为6,缺页中断率为9/12*100% = 75%。

lua内存增长 内存增加技术_lua内存增长_05

2.3 Belady异常

  一般来说,分配给进程的物理块越多,运行时的缺页次数应该越少,使用FIFO时,可能存在相反情况,分配4个物理块的缺页竟然比3个物理块的缺页次数还多!   

  例如:进程访问顺序为0、2、1、3、0、2、4、0、2、1、3、4。   M=3时,缺页中断9次。

  缺页中断率9/12*100% = 75%。

lua内存增长 内存增加技术_换出_06

M=4时,缺页中断10次。缺页中断率10/12*100% = 83.3%。

lua内存增长 内存增加技术_换出_07

 

3 最近最久未使用置换算法(Least Recently Used, LRU)

3.1 基本思想

置换最近一段时间以来最长时间未访问过的页面。根据程序局部性原理,刚被访问的页面,可能马上又要被访问;而较长时间内没有被访问的页面,可能最近不会被访问。   

  LRU算法普偏地适用于各种类型的程序,但是系统要时时刻刻对各页的访问历史情况加以记录和更新,开销太大,因此LRU算法必须要有硬件的支持。

3.2 算例

仍然以OPT算例为例子。   

   中断次数为6,缺页中断率为7/12*100% = 58.3%。

lua内存增长 内存增加技术_缺页中断_08

堆栈实现LRU:   

  系统使用特殊的堆栈来存放内存中每一个页面的页号。每当访问一页时就调整一次,即把被访问页面的页号从栈中移出再压入栈顶。因此,栈顶始终是最新被访问页面的页号,栈底始终是最近最久未被访问的页号。当发生缺页中断时,总是淘汰栈底页号所对应的页面。

 

 

4. 时钟置换算法 CLOCK / 最近未用算法 NRU

同一种算法。

循环扫描各页面,第一轮淘汰访问位 = 0 的,并将扫描过的页面访问位改为1。若第一轮没选中,则进行第二轮扫描。

实现简单,算法开销小;但未考虑页面是否被修改过。

简单的时钟置换算法仅考虑到了一个页面最近是否被访问过,但是事实上,如果被淘汰的页面没有被修改过,就不需要执行I/O操作写回外存。只有被淘汰的页面被修改过时,才需要写回外存。

因此, 除了考虑一个页面最近有没有被访问过之外,操作系统还应该考虑页面有没有被修改过。

在其他条件都相同时,应该优先淘汰没有修改过的页面, 避免I/O操作,这就是改进型的时钟置换算法的思想。

 

 

5. 改进型的时钟置换算法

利用(访问位,修改位) 的形式表示各页面状态

lua内存增长 内存增加技术_换出_09

算法开销小,性能也不错。

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

 


页面分配、置换策略

驻留集

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

【系统给进程分配了n各物理块的另一种表述:驻留集大小为n】

在采用虚拟存储技术的系统中, 驻留集的大小一般小于进程的总大小

  • 如果驻留集太小,会导致缺页频繁,系统要花大量的时间来处理缺页,实际用于进程推进的时间很少。
  • 如果驻留集太大,会导致多道程序并发度下降,资源利用率降低。

 

策略

固定分配:操作系统为每个进程分配一组固定数目的物理块,在进程运行期间不再改变。即,驻留集大小不变。
可变分配:先为每个进程分配一定数目的物理块,在进程运行期间,可根据情况做适当的增加或减少。即,驻留集大小可变。

局部置换:发生缺页时只能选进程自己的物理块进行置换。
全局置换:可以将操作系统保留的空闲物理块分配给缺页进程,也可以将别的进程持有的物理块置换到外存,再分配给缺页进程。

 

可变分配全局置换:只要缺页就给分配新物理块。

可变分配局部置换:要根据发生缺页的频率来动态地增加或减少进程的物理块。

 

 

抖动现象

  刚刚换出的页面马上又要换入内存,刚刚换入的页面马上又要换出外存,这种频繁的页面调度行为称为抖动,或颠簸。

产生抖动的主要原因是进程频繁访问的页面数目高于可用的物理块数( 分配给进程的物理块不够)。

 

工作集

工作集:指在某段时间间隔里,进程实际访问页面的集合。

驻留集:指请求分页存储管理中给进程分配的内存块的集合。

 

  • 一般来说,驻留集大小不能小于工作集大小,否则进程运行过程中将频繁缺页。