第五章虚拟存储器

目录

第五章虚拟存储器

二,虚拟存储器基础

1)虚拟存储器概述

➢前面介绍的各种存储器管理方式,要求将一个作业全部装入内存后方才能运行。

于是出现了两种情况:

  • 有的作业很大,所要求的内存空间超过内存总容量,作业不能被全部装入内存,致使该作业无法运行。
  • 大量作业要求运行,但内存容量不足以容纳所有作业,只能将少数作业装入内存使其运行,其他大量作业留在外存上等待。

➢解决方法

  • 从物理上增加内容容量
  • 从逻辑上扩充内存容量

2)常规存储器管理方式

➢常规存储器管理方式的特征

  • 一次性:作业在运行前一次性地全部装入内存
  • 驻留性:作业装入内存后,便一直驻留在内存中,直至作业运行结束

➢问题:

  1. 一次性及驻留性在程序运行时是否是必须的?

  2. 程序运行过程中能否将宝贵的内存资源合理的利⽤起来?

3)虚拟存储器的定义和特征

虚拟存储器Def:
是指具有请求调入功能和置换功能,能从逻辑上对内存容量加以扩充的一种存储器系统。其逻辑容量内存容量外存容量之和所决定,其运行速度接近于内存速度,而每位的成本却接近于外存

虚拟存储器的特征

  • 多次性:多次往内存中调

    多次性是虚拟存储器最重要的特征

  • 对换性:内存⾥面可以把它置换进去,需要的时候再置换出来

  • 虚拟性:最终实现了虚拟性,也就是好像内存增大了

4)虚拟存储器的实现方法

虚拟存储器的实现都是建立在离散分配的存储管理方式的基础上。

1. 请求分页系统

  • 在分页系统的基础上,增加了请求调页功能和页面置换功能所形成的页式虚拟存储系统

    它允许只装入部分页面的程序(及数据),便启动运行。

    以后再通过调页功能及页面置换功能,陆续将即将要运行的页面调入内存,同时把暂不运行的页面换出到外存上。置换时以页面为单位。

  • 为实现请求调页和置换功能,系统必须提供必要的支持:
    ✓硬件支持:请求分页的页表机制;缺页中断机构;地址变换机构
    ✓软件支持:实现请求调页的软件;实现页面置换的软件

2. 请求分段系统

  • 在分段系统的基础上,增加了请求调段功能分段置换功能所形成的段式虚拟存储系统。它允许只装入若干段的程序(及数据),便启动运行。以后再通过调段功能及段的置换功能,把暂不运行的段调出,同时调入即将要运行的段。置换时以段为单位。
  • 为实现请求调段和置换功能,系统必须提供必要的支持:
    ✓硬件支持:①请求分段的段表机制②缺段中断机构③地址变换机构
    ✓软件支持:①实现请求调段的软件②实现段的置换的软件

三,请求分页存储管理方式

分页存储管理的类别

  • 基本分页式存储管理

    所有页面全部进内存(第四章也就是本章中的都是把所有的都装入内存)

  • 请求分页式存储管理

    把部分页面装入内存,需要的时候万一没在,再请求调入内存,万一内存空间有限没有空间允许将内存中的已有页面置换出去,让新的页面进入内存,(于第五章虚拟内存讲解)

1)请求分页中的硬件支持

1. 页表机制

  • 在请求分页系统中所需要的主要数据结构是页表。基本作用仍是将用户地址空间中的逻辑地址变换为内存空间中的物理地址。由于只将程序的一部分装入内存,还有一部分在外存中,因此须在页表中增加若干项,供程序或数据在换进、换出时参考。

  • 请求分页系统中的页表项:

    5-1

    1. 状态位P:0:未在内存,把它调进来,去外存地址找
      1:在内存,直接去合成物理地址即可
    2. 访问字段A:记录此页面被访问的⼀些信息,⽐如什么时间什么时间点被访问过,以做换出的⼀些参考
    3. 修改位M:如果⼀个页面掉入内存光执行不改还好,万⼀这个页面被修改了但外存中的副本还没有被修改过,0表示没有被修改过,1表示修改过⼀旦被修改过应该把⾥面的页面给拷⻉出去
  • 基本分页式存储管理系统中的页表项:

    5-2

2. 缺页中断机构

缺页中断作为中断,同样需要经历诸如保护CPU环境、分析中断原因、转入缺页中断处理程序进行处理、恢复CPU环境等几个步骤。但缺页中断是一种特殊的中断,与一般中断有明显区别:
✓在指令执行期间产生和处理中断信号。
✓一条指令在执行期间,可能产生多次缺页中断

5-3

3. 地址变换机构

请求分页系统中的地址变换机构,是在分页系统地址变换机构的基础上,再为实现虚拟存储器而增加了某些功能而形成的,如产生缺页中断处理缺页中断,以及从内存中换出一页的功能等等。

5-23

2)请求分页中的内存分配

1. 为进程分配内存时,涉及三个问题:

1.1 最小物理块数的确定

最小物理块数,指能保证进程正常运行所需的最小物理块数。与机器类型有关

1.2 物理块的分配策略

在请求分页系统中,可以采取两种内存分配策略,即固定和可变分配策略。在进行置换时,也可以采取两种策略,即全局置换和局部置换。

内存分配策略:

  1. 固定分配策略
  2. 可变分配策略

置换策略:

  1. 全局置换
  2. 局部置换

2X2=4种,但只有三种是有意义的,如下:

1.固定分配局部置换

这是指基于进程的类型(交互型或批处理型等),或根据程序员、程序管理员的建议,为每个进程分配一定数目的物理块,在整个运行期间都不再改变。采用该策略时,如果进程在运行中发现缺页,则只能从该进程在内存的n个页面中选出一个页换出,然后再调入一页,以保证分配给该进程的内存空间不变

实现相对简单,不影响他人,但如果进程若获得的内存过少,则会出现频繁置换的情况

2.可变分配全局置换

在采用这种策略时,先为系统中的每个进程分配一定数目的物理块,而OS自身也保持一个空闲物理块队列。当某进程发现缺页时,由系统从空闲物理块队列中取出一个物理块分配给该进程,并将欲调入的(缺)页装入其中。这样,凡产生缺页(中断)的进程,都将获得新的物理块。仅当空闲物理块队列中的物理块用完时,OS才能从内存中选择一页调出,该页可能是系统中任一进程的页。

3.可变分配局部置换

这同样是基于进程的类型或根据程序员的要求,为每个进程分配一定数目的物理块,但当某进程发现缺页时,只允许从该进程在内存的页面中选出一页换出这样就不会影响其它进程的运行。如果进程在运行中频繁地发生缺页中断,则系统须再为该进程分配若干附加的物理块直至该进程的缺页率减少到适当程度为止;反之,若一个进程在运行过程中的缺页率特别低,则此时可适当减少分配给该进程的物理块数,但不应引起其缺页率的明显增加。

1.3 物理块的分配算法

在采用固定分配策略时,如何将系统中可供分配的物理块分配给各个进程。

  • 平均分配算法

  • 按比例分配算法

  • 考虑优先权的分配算法

3)页面调入策略

缺页,中断,内存够直接调入,内存不够按相应的置换算法选⼀个页面换出去再把页面调进来

1. 调入页面的时机

  1. 预调页策略

  2. 请求调页策略

2.从何处调入页面

请求分页系统中的外存分为两部分用于存放文件的文件区和用于存放对换页面的对换区。通常,由于对换区是采用连续分配方式,而文件区是采用离散分配方,故对换区的磁盘I/O速度比文件区的高。这样,每当发生缺页请求时,系统应从何处将缺页调入内存,可分成如下三种情况:

(1) 系统拥有足够的对换区空间,这时可以全部从对换区调入所需页面,以提高调页速度。

(2) 系统缺少足够的对换区空间,这时凡是不会被修改的文件,都直接从文件区调入;而当换出这些页面时,由于它们未被修改,则不必再将它们重写到磁盘(换出)以后再调入时,仍从文件区直接调入。但对于那些可能被修改的部分,在将它们换出时便须调到对换区,以后需要时再从对换区调入

(3) UNIX方式。未运行的都从文件区调入,曾经运行(调看页表记录)过被换出的页面从对换区。

3.调入页面过程

每当程序所要访问的页面未在内存时(存在位为“0”),便向CPU发出一缺页中断,中断处理程序首先保留CPU环境,分析中断原因后转入缺页中断处理程序。

4.缺页率

假设一个进程的逻辑空间为n页,系统为其分配的内存物理块数为m(m≤n)。如果在进程的运行过程中,访问页面成功(即所访问页面在内存中)的次数为S,访问页面失败(即所访问页面不在内存中,需要从外存调入)的次数为F,则该进程总的页面访问次数为A = S + F,那么该进程在其运行过程中的缺页率即为:

\[\Large f=F/A \]

缺页次数/总次数

F:fail

S:successful

A:all

A=S+F

5-24

四,页面置换算法

➢在进程运行过程中,若其访问的页面不在内存而需将其调入,但内存已无空闲空间时,需从内存中调出一页程序或数据,送入磁盘的对换区。

但应将哪个页面调出,需根据一定的算法来确定。把选择换出页面的算法称为页面置换算法,其好坏直接影响系统的性能。

+++

➢设作业执行中访问页面的总次数为A,其中有F次访问的页面尚未装入主存,故产生了F次缺页中断。

现定义缺页中断率为:

\[\Large f=F/A \]

1)最佳置换算法(OPT,拥有最好的性能)

➢ 其所选择的被淘汰页面,将是以后永不再用的,或许是在最长(未来)时间内不再被访问的页面。

  • 优点:保证获得最低的缺页率
  • 缺点:无法预知一个进程在内存的若干个页面,哪个在未来最长时间内不再被访问
    ➢算法无法实现,但可评价其他算法。

设作业分配3个物理块,开始3页不算缺页(后面算法同)。则:

5-5

2)先进先出置换算法(FIFO,最坏性能)

➢算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰。

➢算法与进程的实际运行规律不相适应,因为进程中的某些页面经常被访问,但先进先出置换算法不能保证这些页面不被淘汰。

5-7

3)最近最久未使用(LRU)算法

➢算法根据页面调入内存后的使用情况进行决策。由于无法预测各页面将来的使用情况,只能利用“最近的过去”作为“最近的将来”的近似,因此,LRU置换算法是选择最近最久未使用的页面予以淘汰。

比FIFO好些

5-8

LRU置换算法的硬件支持(实现)

1. 寄存器
  • 为每个在内存中的页面配置一个移位寄存器,用来记录某进程在内存中各页的使用情况。移位寄存器表示为R=Rn-1Rn-2Rn-3…R2R1R0

  • 当进程访问某物理块时,要将相应寄存器的Rn-1位置成1。此时,定时信号将每隔一定时间将寄存器右移一位。如果把n位寄存器的数看作一个整数,那么具有最小数值的寄存器所对应的页面,就是最近最久未使用的页面。

5-9

2. 栈

利用一个特殊的栈来保存当前使用的各个页面的页面号。每当进程访问某页面时,便将该页面的页面号从栈中移出,将它压入栈顶。因此,栈顶始终是最新被访问页面的编号,而栈底则是最近最久未使用页面的页面号。

5-10

4)Clock置换算法

又称最近未使用算法(NRU, Not Recently Used),LRU和FIFO的折衷。

原理:每页有一个使用标志位(use bit),若该页被访问则置user bit=1。 置换时采用一个指针,从当前指针位置开始按地址先后检查各页,寻找use bit=0的页面作为被置换页。 指针经过的user bit=1的页都修改user bit=0,最后指针停留在被置换页的下一个页。

被访问:user bit=1

未被访问:user bit=0

5-11

⼀个持续环形的过程,像⼀个钟⼀样的⾛,所以也被称为Clock

5-12

5-13

1. 简单的Clock置换算法

当采用简单Clock算法时,只需为每页设置一位访问位,再将内存中的所有页面都通过链接指针链接成一个循环队列。当某页被访问时,其访问位被置1。置换算法在选择一页淘汰时,只需检查页的访问位。如果是0,就选择该页换出;若为1,则重新将它置0,暂不换出,而给该页第二次驻留内存的机会,再按照FIFO算法检查下一个页面。当检查到队列中的最后一个页面时,若其访问位仍为1,则再返回到队首去检查第一个页面。由于该算法是循环地检查各页面的使用情况,故称为Clock算法。但因该算法只有一位访问位,只能用它表示该页是否已经使用过,而置换时是将未使用过的页面换出去,故又把该算法称为最近未用算法NRU(Not Recently Used)。

2. 改进型Clock置换算法

在将一个页面换出时,如果该页已被修改过,便须将该页重新写回到磁盘上;但如果该页未被修改过,则不必将它拷回磁盘。在改进型Clock算法中,除须考虑页面的使用情况外,还须再增加一个因素,即置换代价,这样,选择页面换出时,既要是未使用过的页面,又要是未被修改过的页面。把同时满足这两个条件的页面作为首选淘汰的页面。由访问位A和修改位M可以组合成下面四种类型的页面:

1类(A=0,M=0):表示该页最近既未被访问,又未被修改,是最佳淘汰页。

2类(A=0,M=1):表示该页最近未被访问,但已被修改,并不是很好的淘汰页。

3类(A=1,M=0):表示该页最近已被访问,但未被修改,该页有可能再被访问。

4类(A=1,M=1):表示该页最近已被访问且被修改,该页可能再被访问。

A:Acess

M:Modify

在内存中的每个页必定是这四类页面之一,在进行页面置换时,可采用与简单Clock算法相类似的算法,其差别在于该算法须同时检查访问位与修改位,以确定该页是四类页面中的哪一种。其执行过程可分成以下三步:

(1) 从指针所指示的当前位置开始,扫描循环队列,寻找A=0且M=0的第一类页面,将所遇到的第一个页面作为所选中的淘汰页。在第一次扫描期间不改变访问位A

(2) 如果第一步失败,即查找一周后未遇到第一类页面,则开始第二轮扫描,寻找A=0且M=1的第二类页面,将所遇到的第一个这类页面作为淘汰页。在第二轮扫描期间,将所有扫描过的页面的访问位都置0。

(3) 如果第二步也失败,亦即未找到第二类页面,则将指针返回到开始的位置,并将所有的访问位复0。然后重复第一步,如果仍失败,必要时再重复第二步,此时就一定能找到被淘汰的页。

5)页面缓冲算法

➢是对FIFO算法的发展,通过被置换页面的缓冲,有机会找回刚被置换的页面;该算法在页面分配时,采用可变分配和局部置换的方式。

➢被置换页面的选择和处理:用FIFO算法选择被置换页,把被置换的页面放入两个链表之一。

  • 如果页面未被修改,就将其归入到空闲页面链表的末尾
  • 否则将其归入到已修改页面链表。

1. 影响页面换进换出效率的若干因素

  1. 页面置换算法
  2. 写回磁盘的频率。(已修改待换出页面链表)
  3. 读入内存的频率

2.页面缓冲算法PBA

PBA算法的主要特点是:
显著地降低了页面换进、换出的频率,使磁盘I/O的操作次数大为减少,因而减少了页面换进、换出的开销
正是由于换入换出的开销大幅度减小,才能使其采用一种较简单的置换策略,如先进先出(FIFO)算法,它不需要特殊硬件的支持,实现起来非常简单
1)空闲页面链表
2)修改页面链表

6)被访问内存的有效时间

5-25

7)总结

OPT:性能好,但实现不了

FIFO:性能好,但实现不了

LRU:还行,对硬件的要求⽐较⾼

CLOCK:还行,需要替换指针

8)习题

缺页率:缺页次数/总次数

5-16

5-17

5-18

5-20

5-19

五,抖动与工作集

由于请求分页式虚拟存储器系统的性能优越,在正常运行情况下,它能有效地减少内存碎片,提高处理机的利用率和吞吐量,故是目前最常用的一种系统。但如果在系统中运行的进程太多,进程在运行中会频繁地发生缺页情况,这又会对系统的性能产生很大的影响.

1)多道程序度与“抖动”

1. 多道程序度与处理机的利用率

5-26

2. 产生“抖动”的原因

发生“抖动”的根本原因是,同时在系统中运行的进程太多,由此分配给每一个进程的物理块太少不能满足进程正常运行的基本要求,致使每个进程在运行时,频繁地出现缺页,必须请求系统将所缺之页调入内存。这会使得在系统中排队等待页面调进/调出的进程数目增加

对磁盘的访问时间也随之急剧增加,造成每个进程的大部分时间都用于页面的换进/换出,而几乎不能再去做任何有效的工作,从而导致发生处理机的利用率急剧下降并趋于0的情况。我们称此时的进程是处于“抖动”状态。

同时因为cpu利⽤率低,还会唤醒很多挂起的进程,企图提⾼cpu的利⽤率,进⼀步恶化!

2)工作集

1.工作集的基本概念

进程发生缺页率的时间间隔进程所获得的物理块数有关。图5-10示出了缺页率与物理块数之间的关系。

5-27

2.工作集的定义

所谓工作集,是指在某段时间间隔\(Δ\)里,进程实际所要访问页面的集合。虽然程序只需要少量的几页在内存便可运行,但为了较少地产生缺页,应尽量将程序的全部工作集装入内存中。

5-28

窗口⾥⾯的页数可以小于窗口大小

3)“抖动”的预防方法

  • 采取局部置换策略
  • 把工作集算法融入到处理机调度中
  • 利用“L=S”准则调节缺页率
  • 选择暂停的进程

Denning于1980年提出了“L=S”的准则来调节多道程序度,其中L是缺页之间的平均时间,S是平均缺页服务时间,即用于置换一个页面所需的时间。如果是L远比S大,说明很少发生缺页,磁盘的能力尚未得到充分的利用;反之,如果是L比S小,则说明频繁发生缺页,缺页的速度已超过磁盘的处理能力。只有当L与S接近时,磁盘和处理机都可达到它们的最大利用率。理论和实践都已证明,利用“L=S”准则,对于调节缺页率是十分有效的。

六,请求分段存储管理方式(现实中很少用到自己看一下即可)

1)请求分段中的硬件支持

➢段表机制

  • 请求分段系统中的段表项:

5-21

(1) 存取方式 :用于标识本分段的存取属性。

(2) 访问字段A :用于记录本段被访问的频繁程度。

(3) 修改位M :表示该段在调入内存后是否被修改过。

(4) 存在位(状态位)P :指示该段是否已调入内存。

(5) 增补位 :用于表示该段在运行中是否做过动态增长。

(6) 外存地址:用于指出该段在外存上的起始地址(盘块号)。

分页中页的大小是固定的,分段的话是逻辑上的意义,段可以进行逻辑上的增长

➢段表机制

➢缺段中断机构

➢地址变换机构

类似请求分页存储管理方式

2)分段的共享和保护

➢共享段表

  • 为了实现共享,可在内存中配置一张共享段表,所有各共享段都在共享段表中占有一表项。
    ✓共享计数count
    ✓存取控制字段
    ✓段号

5-22

3)共享段的分享与回收

➢共享段的分配

  • 对第一个请求使用该共享段的进程,由系统为该共享段分配一物理区,再把共享段调入该区,同时将该区的始址填入请求进程的段表的相应项中,还须在共享段表中增加一表项,填写有关数据,把count置为1;当又有其他进程需要调用该共享段时,无需再为该段分配内存,只需在调用进程的段表中,增加一表项,填写该共享段的物理地址;在共享段的段表中,填上调用进程的进程名、存取控制等,再执行count:=count+1操作。

➢共享段的回收

  • 当共享该段的进程不再需要该段时,应将该段释放,包括撤消在该进程段表中共享段所对应的表项,以及执行count:=count-1操作。如果结果为0,则需由系统回收该共享段的物理内存,以及取消在共享段表中该段所对应的表项,否则只取消调用者进程在共享段表中的有关记录。

4)分段保护

➢越界检查

  • 段表寄存器存放了段表长度;段表中存放了每个段的段长。在进行存储访问时,将段号与段表长度比较,段内地址与段长比较。

➢存取控制检查

  • 段表中的每个表项都设置了“存取控制”字段,用于规定该段的访问方式: 只读; 只执行; 读/写

➢环保护机构

  • 规定:低编号的环具有高优先权

  • 遵循的原则:

✓ 一个程序可以访问驻留在相同环或较低特权环中的数据。

✓ 一个程序可以调用驻留在相同环或较高特权环中的服务。

posted @ 2021-03-29 14:18  TR_Goldfish  阅读(269)  评论(0编辑  收藏  举报