操作系统11:虚拟存储器

目录

1、虚拟存储器概述

(1)常规存储管理方式的特征和局部性原理

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

1.2 - 局部性原理

1.3 - 虚拟存储器的基本工作情况

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

2.1 - 虚拟存储器的定义

2.2 - 虚拟存储器的特征

2.3 - 虚拟存储器的实现方法

2、请求分页存储管理方式

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

1.1 - 请求页表机制

1.2 - 缺页中断机构

1.3 - 地址变换机构

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

2.1 - 最小物理块数的确定

2.2 - 内存分配策略

2.3 - 物理块分配算法

(3)页面调入策略

3.1 - 系统应在何时调入所需页面?

3.2 - 系统应从何处调入这些页面?

3.3 - 页面调入过程

3.4 - 缺页率

(4)页面置换算法

4.1 - 最佳 (Optimal) 置换算法

4.2 - 先进先出 (FIFO) 页面置换算法

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

4.4 - 最少使用 (Least Frequently Used,LFU) 置换算法

4.5 - 简单的 Clock 置换算法

4.6 - 改进型 Clock 置换算法

(5)页面缓冲算法 (Page Buffering Algorithm,PBA)

5.1 - 影响页面换进换出效率的若干因素

5.2 - 页面缓冲算法 PBA

3、抖动与工作集

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

1.1 - 多道程序度与处理机的利用率

1.2 - 产生“抖动”的原因

(2)工作集

2.1 - 工作集的基本概念

2.2 - 工作集的定义

(3)“抖动”的预防

3.1 - 局部置换策略

3.2 - 把工作集算法融入到处理机调度中

3.3 - 利用“L=S”准则调节缺页率

3.4 - 选择暂停的进程

4、请求分段存储管理方式

(1)请求分段中的硬件支持——请求段表机制

(2)分段的享与保护

2.1 - 共享段表

2.2 - 共享段的分配与回收

2.3 - 分段保护


1、虚拟存储器概述

(1)常规存储管理方式的特征和局部性原理

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

        传统存储器管理方式,具有如下两个共同的特征:

  • 一次性,是指作业必须一次性地全部装入内存后方能开始运行。
  • 驻留性,是指作业被装入内存后,整个作业都一直驻留在内存中,其中任何部分都不会被换出,直至作业运行结束。

        由此可以看出,上述的一次性及驻留性特征使得许多在程序运行中不用或暂时不用的程序占据了大量的内存空间,而一些需要运行的作业又无法装入运行,显然,这是在浪费宝贵的内存资源。

1.2 - 局部性原理

        程序在执行时将呈现出局部性规律,即在一较短的时间内,程序的执行仅局限于某个部分,相应地,它所访问的存储空间也局限于某个区域。

        原因:首先,程序在大多数情况下是顺序执行的,而且过程调用的深度一般都不超过 5,其次程序中存在许多循环结构,对许多数据结构的处理也都局限于很小的范围内。//补充:过程调用会转移程序的执行区域,程序循环和数据结构往往都只是一个很小的范围

        局限性又表现在下述两个方面:

  • 时间局限性。如果程序中的某条指令被执行,则不久以后该指令可能再次执行;如果某数据被访问过,则不久以后该数据可能再次被访问。产生时间局限性的典型原因是在程序中存在着大量的循环操作
  • 空间局限性。一旦程序访问了某个存储单元,在不久之后,其附近的存储单元也将被访问,即程序在一段时间内所访问的地址可能集中在一定的范围之内,其典型情况便是程序的顺序执行

1.3 - 虚拟存储器的基本工作情况

        基于局部性原理可知,应用程序在运行之前没有必要将之全部装入内存,而仅须将那些当前要运行的少数页面或段先装入内存便可运行,其余部分暂留在盘上。//部分装入内存

        程序在运行时,如果它所要访问的页已调入内存,便可继续执行下去;但如果程序所要访问的页尚未调入内存(称为缺页缺段),便发出缺页中断请求,此时 OS 将利用请求调页功能将它们调入内存,以使进程能继续执行下去。如果此时内存已满,无法再装入新的页,OS 还须再利用页的置换功能,将内存中暂时不用的页调至盘上,腾出足够的内存空间后,再将要访问的页调入内存,使程序继续执行下去。//缺页 -> 缺页中断 -> 内存满 -> 页面置换

        这样,便可使一个大的用户程序在较小的内存空间中运行,也可在内存中同时装入更多的进程,使它们并发执行。

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

2.1 - 虚拟存储器的定义

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

2.2 - 虚拟存储器的特征

        与传统的存储器管理方式比较,虚拟存储器具有以下三个重要特征:

  • 程序允许被分成多次调入内存运行。(多次性)
  • 允许一个作业中的程序和数据,在作业的运行过程中进行换入和换出。(对换性)
  • 用户所看到的内存容量远大于实际内存容量。(虚拟性)

        虚拟性以多次性和对换性为基础,仅当系统允许将作业分多次调入内存,并能将内存中暂时不运行的程序和数据换至盘上时,才有可能实现虚拟存储器;而多次性和对换性又必须建立在离散分配的基础上// 离散分配 -> 多次性和对换性 -> 虚拟性

2.3 - 虚拟存储器的实现方法

        (1)分页请求系统

        分页请求系统是在分页系统的基础上增加了请求调页功能页面置换功能所形成的页式虚拟存储系统。它允许用户程序只装入少数页面的程序即可启动运行。以后,再通过调页功能及页面置换功能陆续地把即将运行的页面调入内存,同时把暂不运行的页面换出到外存上。

        置换时以页面为单位。为了能实现请求调页和页面置换功能,系统必须提供必要的硬件支持和实现请求分页的软件。

  • 硬件支持:请求分页的页表机制、缺页中断机构、地址变换机构。
  • 软件支持:用于实现请求调页的软件和实现页面置换的软件。它们在硬件的支持下,将程序正在运行时所需的页面调入内存,再将内存中暂时不用的页面从内存置换到磁盘上。// 也就是算法

        (2)请求分段系统

        请求分段系统是在分段系统的基础上,增加了请求调段分段置换功能后所形成的段式虚拟存储系统。

  • 硬件支持:请求分段的段表机制、缺段中断机构、地址变换机构。
  • 软件支持:用于实现请求调段的软件和实现段置换的软件。

2、请求分页存储管理方式

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

        为了实现请求分页,系统必须提供一定的硬件支持。计算机系统除了要求一定容量的内存和外存外,还需要有请求页表机制、缺页中断机构以及地址变换机构。

1.1 - 请求页表机制

        在请求分页系统中需要的主要数据结构是请求页表,其基本作用仍然是将用户地址空间中的逻辑地址映射为内存空间中的物理地址。为了满足页面换进换出的需要,在请求页表中又增加了四个字段。这样,在请求分页系统中的每个页表应含以下诸项:

        现对其中各字段说明如下:

  • 状态位(存在位) P:由于在请求分页系统中,只将应用程序的一部分调入内存,还有一部分仍在外存磁盘上,故须在页表中增加一个存在位字段。由于该字段仅有一位,故又称位字。它用于指示该页是否已调入内存,供程序访问时参考。
  • 访问字段 A:用于记录本页在一段时间内被访问的次数,或记录本页最近已有多长时间未被访问,提供给置换算法在选择换出页面时参考。
  • 修改位 M:标识该页在调入内存后是否被修改过。由于内存中的每一页都在外存上保留一份副本,因此,在置换该页时,若未被修改,就不需再将该页写回到外存上,以减少系统的开销和启动磁盘的次数;若已被修改,则必须将该页重写到外存上,以保证外存中所保留的副本始终是最新的。简而言之,M 位供置换页面时参考。
  • 外存地址:用于指出该页在外存上的地址,通常是物理块号,供调入该页时参考。// 这项跟第二项物理块号有重复,暂这样

1.2 - 缺页中断机构

        缺页中断作为中断,它们同样需要经历诸如保护CPU环境、分析中断原因、转入缺页中断处理程序进行处理,以及在中断处理完成后再恢复 CPU 环境等几个步骤。// 在此,不做过多描述,仅知道是一种中断硬件即可

1.3 - 地址变换机构

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

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

        在为进程分配内存时,将涉及到三个问题:

  • 第一,为保证进程能正常运行,所需要的最小物理块数的确定。//分配数量
  • 第二,在为每个进程分配物理块时,应采取什么样的分配策略,即所分配的物理块是固定的,还是可变的。//分配方式
  • 第三,为不同进程所分配的物理块数,是采取平均分配算法,还是根据进程的大小按比例分配。//分配公平性

2.1 - 最小物理块数的确定

        随着为每个进程所分配的物理块的减少,将使进程在执行中的缺页率上升,从而会降低进程的执行速度。所以为使进程能有效地工作,应为它分配合理数目的物理块。

        最小物理块数是指能保证进程正常运行所需的最小物理块数当系统为进程分配的物理块数少于此值时,进程将无法运行。至于进程应获得的最少物理块数,与计算机的硬件结构有关,取决于指令的格式、功能和寻址方式。// 跟具体计算机有关,不做深入描述

2.2 - 内存分配策略

        在请求分页系统中,可采取两种内存分配策略,即固定和可变分配策略。在进行置换时,也可采取两种策略,即全局置换和局部置换。于是可组合出以下三种适用的策略:

        (1)固定分配局部置换(Fixed Allocation,LocalReplacement)

        所谓固定分配,是指为每个进程分配一组固定数目的物理块,在进程运行期间不再改变。所谓局部置换,是指如果进程在运行中发现缺页,则只能从分配给该进程的 n 个页面中选出一页换出,然后再调入一页,以保证分配给该进程的内存空间不变。

        实现这种策略的困难在于:应为每个进程分配多少个物理块难以确定。若太少,会频繁地出现缺页中断,降低了系统的吞吐量。若太多,又必然使内存中驻留的进程数目减少,进而可能造成 CPU 空闲或其它资源空闲的情况,而且在实现进程对换时,会花费更多的时间。//难以实现,或者实现后性能不稳定

        (2)可变分配全局置换(VariableAllocation,GlobalReplacement)

        所谓可变分配,是指先为每个进程分配一定数目的物理块,在进程运行期间,可根据情况做适当的增加或减少。所谓全局置换,是指如果进程在运行中发现缺页,则将 OS 所保留的空闲物理块取出一块分配给该进程,或者以所有进程的全部物理块为标的,选择一块换出,然后将所缺之页调入。这样,分配给该进程的内存空间就随之增加。

        可变分配全局置换是最易于实现的一种物理块分配和置换策略,已用于若干个 OS 中。在采用这种策略时,凡产生缺页的进程,都将获得新的物理块,仅当空闲物理块队列中的物理块用完时,OS 才能从内存中选择一页调出。被选择调出的页可能是系统中任何一个进程中的页,因此这个被选中的进程拥有的物理块会减少,这将导致其缺页率增加。//缺点是会影响其他程序

        (3)可变分配局部置换(VariableAllocation,LocalReplacement)

        该策略基于进程的类型或根据程序员的要求,为每个进程分配一定数目的物理块,但当某进程发现缺页时,只允许从该进程在内存的页面中选择一页换出,这样就不会影响其它进程的运行

        如果进程在运行中频繁地发生缺页中断,则系统须再为该进程分配若干附加的物理块,直至该进程的缺页率减少到适当程度为止。反之,若一个进程在运行过程中的缺页率特别低,则此时可适当减少分配给该进程的物理块数,但不应引起其缺页率的明显增加。//不会影响其他程序

2.3 - 物理块分配算法

        在采用固定分配策略时,如何将系统中可供分配的所有物理块分配给各个进程,可采用下述几种算法:

  • 平均分配算法,即将系统中所有可供分配的物理块平均分配给各个进程。
  • 按比例分配算法,即根据进程的大小按比例分配物理块。
  • 按优先权分配算法。在实际应用中,为了照顾到重要的、紧迫的作业能尽快地完成,应为它分配较多的内存空间。通常采取的方法是把内存中可供分配的所有物理块分成两部分:一部分按比例地分配给各进程;另一部分则根据各进程的优先权进行分配,为高优先进程适当地增加其相应份额。

(3)页面调入策略

        为了使进程能够正常运行,必须事先将要执行的那部分程序和数据所在的页面调入内存,现在的问题是:

  • 系统应在何时调入所需页面?
  • 系统应从何处调入这些页面?
  • 页面是如何进行调入的?

3.1 - 系统应在何时调入所需页面?

        预调页策略:采用一种以预测为基础的预调页策略,将那些预计在不久之后便会被访问的页面预先调入内存。// 预先判断,缺点是预测率不高

        预调页策略的使用:首先,在第一次将进程调入内存时,将程序中指出的页先调入内存。然后,在采用工作集的系统中,每个进程都具有一张表,表中记录有运行时的工作集,每当程序被调度运行时,将工作集中的所有页调入内存。// 使用了工作集的概念

        请求调页策略:当进程在运行中需要访问某部分程序和数据时,若发现其所在的页面不在内存,便立即提出请求,由 OS 将其所需页面调入内存。//用到采取调用,缺点是I/O频率高

        由请求调页策略所确定调入的页是一定会被访问的,再加之请求调页策略比较易于实现,故在目前的虚拟存储器中,大多采用此策略。但这种策略每次仅调入一页,故须花费较大的系统开销,增加了磁盘 I/O 的启动频率。

3.2 - 系统应从何处调入这些页面?

        将请求分页系统中的外存分为两部分:用于存放文件的文件区和用于存放对换页面的对换区

        通常,由于对换区是采用连续分配方式,而文件区是采用离散分配方式,所以对换区的数据存取(磁盘I/O)速度比文件区的高。这样,每当发生缺页请求时,系统应从何处将缺页调入内存,可分成如下三种情况进行:

  • 对换区空间足够:全部从对换区调入所需页面,以提高调页速度。为此,在进程运行前,便须将与该进程有关的文件从文件区拷贝到对换区。//全部从对换区调入
  • 对换区空间不足:不会被修改的文件,直接从文件区调入;当换出这些页面时,由于它们未被修改,则不必再将它们重写到磁盘,以后再调入时,仍从文件区直接调入。对于可能被修改的部分,在将它们换出时便须调到对换区,以后需要时再从对换区调入。//区分不修改和修改
  • UNIX 方式:由于与进程有关的文件都放在文件区,故凡是未运行过的页面,都应从文件区调入。而对于曾经运行过但又被换出的页面,由于是被放在对换区,因此在下次调入时应从对换区调入。由于 UNIX 系统允许页面共享,因此,某进程所请求的页面有可能已被其它进程调入内存,此时也就无需再从对换区调入。//区分运行过还是未运行过

3.3 - 页面调入过程

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

        该程序通过查找页表得到该页在外存的物理块后,如果此时内存能容纳新页,则启动磁盘 I/O,将所缺之页调入内存,然后修改页表。如果内存已满,则须先按照某种置换算法,从内存中选出一页准备换出。//调入或置换

        如果该页未被修改过(修改位为 “0”),可不必将该页写回磁盘;但如果此页已被修改(修改位为 “1”),则必须将它写回磁盘,然后再把所缺的页调入内存,并修改页表中的相应表项,置其存在位为 “1”,并将此页表项写入快表中。//处理修改数据

        在缺页调入内存后,利用修改后的页表形成所要访问数据的物理地址,再去访问内存数据。

        整个页面的调入过程对用户是透明的。

3.4 - 缺页率

        如果在进程的运行过程中,访问页面成功(即所访问页面在内存中)的次数为 S,访问页面失败(即所访问页面不在内存中,需要从外存调入)的次数为 F,则该进程总的页面访问次数为 A = S + F,那么该进程在其运行过程中的缺页率即为://页面不在内存中即为缺页

        通常,缺页率受到以下几个因素的影响:

  • 页面大小。页面划分较大,则缺页率较低;反之,缺页率较高。
  • 进程所分配物理块的数目。所分配的物理块数目越多,缺页率越低;反之则越高
  • 页面置换算法。算法的优劣决定了进程执行过程中缺页中断的次数,因此缺页率是衡量页面置换算法的重要指标。
  • 程序固有特性。程序本身的编制方法对缺页中断次数有影响,根据程序执行的局部性原理,程序编制的局部化程度越高,相应执行时的缺页程度越低。

        事实上,在缺页中断处理时,当由于空间不足,需要置换部分页面到外存时,选择被置换页面还需要考虑到置换的代价,如页面是否被修改过。没有修改过的页面可以直接放弃,而修改过的页面则必须进行保存。

(4)页面置换算法

        不适当的算法可能会导致进程发生“抖动”(Thrashing),即刚被换出的页很快又要被访问,需要将它重新调入,此时又需要再选一页调出;而此刚被调出的页很快又被访问,又需将它调入,如此频繁地更换页面,以致一个进程在运行中把大部分时间都花费在页面置换工作上,我们称该进程发生了“抖动”

4.1 - 最佳 (Optimal) 置换算法

        最佳置换算法所选择的被淘汰页面将是以后永不使用的,在未来不再被访问的页面

        采用最佳置换算法通常可保证获得最低的缺页率。但是,该算法是一种理想化的算法,它具有最好的性能,但实际上是无法实现的。通常使用最佳置换算法作为标准,来评价其它算法的优劣。//无法实现,仅作为评价标准

4.2 - 先进先出 (FIFO) 页面置换算法

        FIFO 算法是最早出现的置换算法。该算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰。

        该算法实现简单,只需把一个进程已调入内存的页面按先后次序链接成一个队列,并设置一个指针,称为替换指针,使它总是指向最老的页面。但该算法与进程实际运行的规律不相适应,因为在进程中,有些页面经常被访问,比如含有全局变量、常用函数、例程等的页面,FIFO 算法并不能保证这些页面不被淘汰。

//由于与通常页面的使用规律不符,可能是性能最差的算法,实际应用极少。

//页面调入的先后并不能反映页面的使用情况

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

        最近最久未使用(LRU)的页面置换算法,根据页面调入内存后的使用情况进行决策,LRU 置换算法选择最近最久未使用的页面予以淘汰。

        该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间 t。当需淘汰一个页面时,选择现有页面中 t 值最大的页面予以淘汰。// 需记录访问时间

4.4 - 最少使用 (Least Frequently Used,LFU) 置换算法

        在采用 LFU 算法时,应为在内存中的每个页面设置一个移位寄存器,用来记录该页面被访问的频率

        该置换算法选择在最近时期使用最少的页面作为淘汰页。由于存储器具有较高的访问速度,例如 100ns,在 1s 时间内可能对某页面连续访问成千上万次,因此,直接利用计数器来记录某页被访问的次数是不现实的,只能采用较大的时间间隔来记录对存储器某页的访问。在最少使用置换算法中采用了移位寄存器方式。// 使用移位寄存器的原因

        每次访问某页时,便将该移位寄存器的最高位置 1,再每隔一定时间右移一次。//定时移位

        这种算法并不能真正反映出页面的使用情况,因为在每一时间间隔内,只是用寄存器的一位来记录页的使用情况,因此,在该时间间隔内,对某页访问一次和访问 1000 次是完全等效的。

4.5 - 简单的 Clock 置换算法

        虽然LRU 是一种较好的算法,但由于它要求有较多的硬件支持,使得其实现所需的成本较高,故在实际应用中,大多采用 LRU 的近似算法。Clock 算法就是用得较多的一种 LRU 近似算法。

        Clock 算法为每页设置一位访问位,再将内存中的所有页面都通过链接指针链接成一个循环队列。当某页被访问时,其访问位被置 1。//使用访问位进行记录

        置换算法在选择一页淘汰时,只需检查页的访问位。如果是 0,就选择该页换出;若为 1,则重新将它置 0,暂不换出,给予该页第二次驻留内存的机会,再按照 FIFO 算法检查下一个页面。当检查到队列中的最后一个页面时,若其访问位仍为 1,则再返回到队首去检查第一个页面。//循环减到最后,一定有一个页面的访问位为 0

        由于该算法是循环地检查各页面的使用情况,故称为 Clock 算法。但因该算法只有一位访问位,只能用它表示该页是否已经使用过,而置换时是将未使用过的页面换出去,故又把该算法称为最近未用算法或 NRU(Not Recently Used)算法。

4.6 - 改进型 Clock 置换算法

        在将一个页面换出时,如果该页已被修改过,便须将该页重新写回到磁盘上;但如果该页未被修改过,则不必将它拷回磁盘。换而言之,对于修改过的页面,在换出时所付出的开销比未修改过的页面大(置换代价大)。

        在改进型 CIock 算法中,除须考虑页面的使用情况外,还须再增加一个因素一一置换代价。这样,选择页面换出时,既要是未使用过的页面,又要是未被修改过的页面。把同时满足这两个条件的页面作为首选淘汰的页面。// 增加置换代价的考虑

        该算法与简单 Clock 算法比较,可减少磁盘的 I/O 操作次数。但为了找到一个可置换的页,可能须经过几轮扫描。换言之,实现该算法本身的开销将有所增加。//增加算法的开销

(5)页面缓冲算法 (Page Buffering Algorithm,PBA)

5.1 - 影响页面换进换出效率的若干因素

  • 页面置换算法。一个好的页面置换算法,可使进程在运行过程中具有较低的缺页率,从而可以减少页面换进换出的开销。//缺页率
  • 写回磁盘的频率。对于已经被修改过的页面,在将其换出时,应当写回磁盘,这意味着每换出一个页面,便需要启动一次磁盘。但如果在系统中已建立了一个已修改换出页面的链表,则对每一个要被换出的页面(已修改),系统暂不把它们写回磁盘,而是将它们挂在已修改换出页面的链表上,仅当被换出页面数目达到一定值时,例如 64个页面,再将它们一起写回到磁盘上,这样就显著地减少了磁盘 I/O 的操作次数。//暂缓写入+批量写回
  • 读入内存的频率。在设置了已修改换出页面链表后,在该链表上就暂时有一批装有数据的页面,如果有进程在这批数据还未写回磁盘时需要再次访问这些页面时,就不需从外存上调入,而直接从已修改换出页面链表中获取,这样也可以减少将页面从磁盘读入内存的频率,减少页面换进的开销。

5.2 - 页面缓冲算法 PBA

        PBA 算法的主要特点是:

  • 显著地降低了页面换进、换出的频率,使磁盘 IO的操作次数大为减少,因而减少了页面换进、换出的开销。
  • 由于换入换出的开销大幅度减小,才能使其采用一种较简单的置换策略,如先进先出(FIFO)算法,它不需要特殊硬件的支持,实现起来非常简单。//实现简单

        为了能显著地降低页面换进、换出的频率,在内存中设置了如下两个链表:

        (1)空闲页面链表

        实际上该链表是一个空闲物理块链表,是系统掌握的空闲物理块,用于分配给频繁发生缺页的进程,以降低该进程的缺页率。当这样的进程需要读入一个页面时,便可利用空闲物理块链表中的第一个物理块来装入该页。当有一个未被修改的页要换出时,实际上并不将它换出到外存,而是把它们所在的物理块挂在空闲链表的末尾。应当注意,这些挂在空闲链表上的未被修改的页面中是有数据的,如果以后某进程需要这些页面中的数据时,便可从空闲链表上将它们取下,免除了从磁盘读入数据的操作,减少了页面换进的开销。//未修改页面不换出

        (2)修改页面链表

        它是由已修改的页面所形成的链表。设置该链表的目的是为了减少已修改页面换出的次数。当进程需要将一个已修改的页面换出时,系统并不立即把它换出到外存上,而是将它所在的物理块挂在修改页面链表的末尾。这样做的目的是:降低将已修该页面写回磁盘的频率,降低将磁盘内容读入内存的频率。//修改页面暂不换出,或者一定时间间隔后批量换出

3、抖动与工作集

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

1.1 - 多道程序度与处理机的利用率

        由于虚拟存储器系统能从逻辑上扩大内存,这时,只需装入一个进程的部分程序和数据便可开始运行,故人们希望在系统中能运行更多的进程,即增加多道程序度,以提高处理机的利用率。但处理机的实际利用率却下图中的实线所示。// 缺页率 -> 抖动

       其中横轴表示多道程序的数量,纵轴表示相应的处理机的利用率。在横轴的开始部分,随着进程数目的增加,处理机的利用率急剧增加;但到达 N1 时,其增速就明显地减慢了,当到达 N(max) 时,处理机的利用率达到最大,以后先开始缓慢下降,当到达 N2 点时,若再继续增加进程数,利用率将加速下降而趋于 0,见图中的 N3 点,之所以会发生在后面阶段利用率趋于 0 的情况是因为在系统中已发生了 “抖动”//抖动会使处理机的利用率显著下降

1.2 - 产生“抖动”的原因

        发生“抖动”的根本原因是,同时在系统中运行的进程太多,由此分配给每一个进程的物理块太少,不能满足进程正常运行的基本要求,致使每个进程在运行时,频繁地出现缺页,必须请求系统将所缺之页调入内存。这会使得在系统中排队等待页面调进/调出的进程数目增加。显然,对磁盘的有效访问时间也随之急剧增加,造成每个进程的大部分时间都用于页面的换进/换出,而几乎不能再去做任何有效的工作,从而导致发生处理机的利用率急剧下降并趋于 0 的情况。我们称此时的进程是处于“抖动”状态

(2)工作集

2.1 - 工作集的基本概念

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

        从图中可以看出,缺页率随着所分配物理块数的增加明显地减少,当物理块数超过某个数目时,再为进程增加一物理块,对缺页率的改善已不明显。可见,此时已无必要再为它分配更多的物理块。反之,当为某进程所分配的物理块数低于某个数目时,每减少一块,对缺页率的影响都变得十分明显,此时又应为该进程分配更多的物理块。// 缺页率和物理块有关系

        基于程序运行时的局部性原理得知,程序在运行期间,对页面的访问是不均匀的,在一段时间内仅局限于较少的页面,在另一段时间内,又可能仅局限于对另一些较少的页面进行访问。这些页面被称为活跃页面。如果能够预知程序在某段时间间隔内要访问哪些页面,并将它们调入内存,将会大大降低缺页率,从而可显著地提高处理机的利用率。//工作集理论出现的背景

2.2 - 工作集的定义

        所谓工作集,是指在某段时间间隔里,进程实际所要访问页面的集合

        虽然程序只需要少量的几页在内存便可运行,但为了较少地产生缺页,应将程序的全部工作集装入内存中。然而我们无法事先预知程序在不同时刻将访问哪些页面,故仍只有像置换算法那样,用程序的过去某段时间内的行为作为程序在将来某段时间内行为的近似。//工作集只是一个对过去行为预估的页面集合,并不一定能准确的反应将来的情况

(3)“抖动”的预防

        为了保证系统具有较大的吞吐量,必须防止“抖动”的发生。//少抖动 -> 高吞吐量

3.1 - 局部置换策略

        在页面分配和置换策略中,如果采取的是可变分配方式,则为了预防发生“抖动”可采取局部置换策略。根据这种策略,当某进程发生缺页时,只能在分配给自己的内存空间内进行置换,不允许从其它进程去获得新的物理块。这样,即使该进程发生了“抖动”也不会对其它进程产生影响,于是可把该进程“抖动”所造成的影响限制在较小的范围内//把抖动限制在单个进程内

        该方法虽然简单易行,但效果不是很好,因为在某进程发生“抖动”后,它还会长期处在磁盘 I/O 的等待队列中,使队列的长度增加,这会延长其它进程缺页中断的处理时间,也就是延长了其它进程对磁盘的访问时间。//实际效果不好,还是会影响整体性能

3.2 - 把工作集算法融入到处理机调度中

        当调度程序发现处理机利用率低下时,它将试图从外存调入一个新作业进入内存,来改善处理机的利用率。如果在调度中融入了工作集算法,则在调度程序从外存调入作业之前,必须先检查每个进程在内存的驻留页面是否足够多。如果都已足够多,此时便可以从外存调入新的作业,不会因新作业的调入而导致缺页率的增加;反之,如果有些进程的内存页面不足,则应首先为那些缺页率居高的作业增加新的物理块,此时将不再调入新的作业。//通过页面数量判断是否怎加作业数

3.3 - 利用“L=S”准则调节缺页率

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

3.4 - 选择暂停的进程

        当多道程序度偏高时,已影响到处理机的利用率,为了防止发生“抖动”,系统必须减少多道程序的数目。此时应基于某种原则选择暂停某些当前活动的进程,将它们调出到磁盘上,以便把腾出的内存空间分配给缺页率发生偏高的进程。系统通常都是采取与调度程序一致的策略,即首先选择暂停优先级最低的进程,若需要,再选择优先级较低的进程。当内存还显拥挤时,还可进一步选择暂停一个并不十分重要、但却较大的进程,以便能释放出较多的物理块,或者暂停剩余执行时间最多的进程等。//减少进程数

//一个系统的进程数是有限的,不可能无限量的增加,进程间切换会增加系统开销,进程数量过多也会造成系统抖动,但是抖动应该由系统层去解决

4、请求分段存储管理方式

        在分页基础上建立的请求分页式虚拟存储器系统,是以页面为单位进行换入、换出的。而在分段基础上所建立的请求分段式虚拟存储器系统,则是以分段为单位进行换入、换出的。它们在实现原理以及所需要的硬件支持上都是十分相似的。在请求分段系统中,程序运行之前,只需先调入少数几个分段便可启动运行。当所访问的段不在内存中时,可请求 OS 将所缺的段调入内存。

(1)请求分段中的硬件支持——请求段表机制

        在请求分段式管理中所需的主要数据结构是请求段表。在该表中除了具有请求分页机制中有的访问字段 A修改位 M存在位 P 外存始址四个字段外,还增加了存取方式字段增补位。这些字段供程序在调进、调出时参考。

        在段表项中,除了段名(号)、段长、段在内存中的起始地址(段基址)外,还增加了以下字段:

  • 存取方式:由于应用程序中的段是信息的逻辑单位,可根据该信息的属性对它实施保护,故在段表中增加存取方式字段,如果该字段为两位,则存取属性是只执行、只读和允许读/写//读写方式
  • 访问字段 A:其含义与请求分页的相应字段相同,用于记录该段被访问的频繁程度。提供给置换算法选择换出页面时参考。
  • 修改位 M:该字段用于表示该页在进入内存后是否已被修改过,供置换页面时参考。
  • 存在位 P:该字段用于指示本段是否已调入内存,供程序访问时参考。
  • 增补位:这是请求分段式管理中所特有的字段,用于表示本段在运行过程中是否做过动态增长
  • 外存始址:指示本段在外存中的起始地址,即起始盘块号。

// 缺段中断机构,以及地址变换机构等硬件的支持不再做赘述

(2)分段的享与保护

        分段存储管理方式的优点是便于实现分段的共享与保护

2.1 - 共享段表

        为了实现分段共享,可在系统中配置一张共享段表,所有各共享段都在共享段表中占有一表项。在表项的上面记录了共享段的段号段长内存始址状态(存在)位外存始址以及共享计数等信息,接下去就是记录了共享此分段的每个进程的情况。共享段表如下图所示:

        其中各项说明如下:

  • 共享进程计数 count:非共享段仅为一个进程所需要。当进程不再需要该段时,可立即释放该段,并由系统回收该段所占用的空间。而共享段是为多个进程所需要的,为记录有多少进程正在共享该分段,须设置共享进程计数 count。当某进程不再需要而释放它时,系统并不立即回收该段所占内存区,而是检查 count 是否为 0,若不是 0,则表示还有进程需要它,仅当所有共享该段的进程全都不再需要它时,此时 count 为 0,才由系统回收该段所占内存区。
  • 存取控制字段:对于一个共享段,应为不同的进程赋予不同的存取权限。例如对于文件主,通常允许他读和写;而对其它进程,则可能只允许读,甚至只允许执行。
  • 段号:对于一个共享段,在不同的进程中可以具有不同的段号,每个进程可用自已进程的段号去访问该共享段。

2.2 - 共享段的分配与回收

        (1)共享段的分配

        由于共享段是供多个进程所共享的,因此,对共享段的内存分配方法,与非共享段的内存分配方法有所不同。

        在为共享段分配内存时,对第一个请求使用该共享段的进程,由系统为该共享段分配一物理区,再把共享段调入该区,同时将该区的始址填入请求进程的段表的相应项中,还须在共享段表中增加一表项,填写请求使用该共享段的进程名、段号和存取控制等有关数据,把 count 置为 1。

        当又有其它进程需要调用该共享段时,由于该共享段已被调入内存,故此时无须再为该段分配内存,而只需在调用进程的段表中增加一表项,填写该共享段的物理地址。在共享段的段表中增加一个表项,填上调用进程的进程名、该共享段在本进程中的段号、存取控制等,再执行 count = count + 1 操作,以表明有两个进程共享该段。//在段表中加记录

        以后,凡有进程需要访问此共享段的,都按上述方式在共享段的段表中增加一个表项

        (2)共享段的回收

        当共享此段的某进程不再需要该段时,应将该段释放,包括撤消在该进程段表中共享段所对应的表项,以及执行 count = count - 1 操作。若结果为 0,则须由系统回收该共享段的物理内存,以及取消在共享段表中该段所对应的表项,表明此时已没有进程使用该段;否则(减1结果不为0),只是取消调用者进程在共享段表中的有关记录//在段表中减记录

2.3 - 分段保护

        在分段系统中,由于每个分段在逻辑上是相对独立的,因而比较容易实现信息保护目前,常采用以下几种措施来确保信息的安全。

        (1)越界检查

        越界检查是利用地址变换机构来完成的。为此,在地址变换机构中设置了段表寄存器用于存放段表始址和段表长度信息。在进行地址变换时,首先将逻辑地址空间的段号与段表长度进行比较,如果段号等于或大于段表长度,将发出地址越界中断信号。此外,还在段表中为每个段设置有段长字段,在进行地址变换时,还要检查段内地址是否等于或大于段长,若大于段长,将产生地址越界中断信号,从而保证了每个进程只能在自己的地址空间内运行。

        (2)存取控制检查

        存取控制检查是以段为基本单位进行的。为此,在段表的每个表项中都设置了一个“存取控制”字段,用于规定对该段的访问方式。通常的访问方式有:

  • 只读,即只允许进程对该段中的程序或数据进行读访问。
  • 只执行,即只允许进程调用该段去执行,但不准读该段的内容,更不允许对该段执行写操作。
  • 读/写,即允许进程对该段进行读/写访问。

        对于共享段而言,存取控制就显得尤为重要,因而对不同的进程应赋予不同的读写权限。这时,既要保证信息的安全性,又要满足运行需要。例如,对于一个企业的财务账目,应该只允许会计人员进行读或写,允许领导及有关人员去读。而对于一般人员,则既不准读,更不能写。值得一提的是,这里所介绍的存取控制检查是基于硬件实现的,它能较好地保证信息的安全,因为攻击者很难对存取控制字段进行修改//企业应用程序中也可用软件的方式

        (3)环保护机构

        这是一种功能较完善的保护机制。在该机制中规定:低编号的环具有高优先权。OS 核心处于 0 号环内;某些重要的实用程序和操作系统服务占居中间环,而一般的应用程序,则被安排在外环上。//用户态和内核态

        在环系统中,程序的访问和调用应遵循以下规则

  • 一个程序可以访问驻留在相同环或较低特权环(外环)中的数据
  • 一个程序可以调用驻留在相同环或较高特权环(内环)中的服务

        至此,虚拟存储器的介绍到此结束。

猜你喜欢

转载自blog.csdn.net/swadian2008/article/details/131569097