操作系统复习总结3

操作系统复习总结,仅供笔者复习使用,参考教材:

  • 《操作系统原理》 - 何静媛编著. 西安电子科技大学出版社
  • 《操作系统考研复习指导》2024年 - 王道论坛组编. 电子工业出版社

本文主要内容为:内存管理;

计算机系统概述 部分见 操作系统复习总结1
进程与线程 部分见 操作系统复习总结2
内存管理 部分见 操作系统复习总结3
文件管理 部分见 操作系统复习总结4
输入输出管理 部分见 操作系统复习总结5

1. 内存管理

1.1 内存管理概念

内存管理指的是操作系统对内存的划分和动态分配,主要包括内存空间的分配与回收、地址转换、内存共享、存储保护等。下面介绍内存管理中常用的一些概念:

1.1.1 程序的链接和装入

创建进程首先需要将程序和数据装入内存。将用户源程序变为可在内存中执行的程序需要经过编译、链接和装入三个步骤:
(1)编译:由编译程序将用户源代码编译成若干目标模块;
(2)链接:由链接程序将编译后形成的一组目标模块及它们所需的库函数链接在一起,形成一个完整的装入模块;
(3)装入:由装入程序将装入模块装入内存运行;
在这里插入图片描述

  • 程序的链接方式:
    • 静态链接:程序运行之前先将各目标模块及它们所需的库函数链接成一个完整的装配模块,以后不再拆开。静态链接将几个目标模块装配成一个装入模块时,需要解决两个问题:修改相对地址,编译后的所有目标模块都是从 0 开始的相对地址,当链接成一个装入模块时要修改相对地址;变换外部调用符号,将每个模块中所用的外部调用符号也都变换为相对地址;
    • 装入时动态链接:将用户源程序编译后所得到的一组目标模块,在装入内存时,采用边装入边链接的方式。其优点是便于修改和更新,便于实现对目标模块的共享;
    • 运行时动态链接:对某些目标模块的链接,是在程序执行中需要该目标模块时才进行的。凡在执行过程中未被用到的目标模块,都不会被调入内存和被链接到装入模块上。运行时动态链接能加快程序的装入过程,还可节省大量的内存空间;
  • 程序的装入方式:
    • 绝对装入:绝对装入方式只适用于单道程序环境,若编译时知道程序将驻留在内存的某个位置,则编译程序将产生绝对地址的目标代码。绝对装入程序按照装入模块中的地址,将程序和数据装入内存。由于程序中的逻辑地址与实际内存地址完全相同,因此不需对程序和数据的地址进行修改。通常情况下在程序中采用的是符号地址,编译或汇编时再转换为绝对地址;
    • 可重定位装入:在多道程序环境下,多个目标模块的起始地址通常都从 0 开始,程序中的其他地址都是相对于起始地址的,此时应采用可重定位装入方式。根据内存的当前情况,将装入模块装入内存的适当位置。在装入时对目标程序中指令和数据地址的修改过程称为重定位,又因为地址变换通常是在进程装入时一次完成的,故称为 静态重定位。当一个作业装入内存时,必须给它分配要求的全部内存空间,若没有足够的内存,则无法装入。此外,作业一旦进入内存,整个运行期间就不能在内存中移动,也不能再申请内存空间;
    • 动态运行时装入:程序在内存中若发生移动,则需要采用动态的装入方式,也称 动态重定位。装入程序把装入模块装入内存后,并不立即把装入模块中的相对地址转换为绝对地址,而是把这种地址转换推迟到程序真正要执行时才进行。因此,装入内存后的所有地址均为相对地址,需要一个 重定位寄存器 的支持。动态重定位的优点如下:可以将程序分配到不连续的存储区;在程序运行之前可以只装入部分代码即可投入运行,然后在程序运行期间,根据需要动态申请分配内存;便于程序段的共享;
      在这里插入图片描述

1.1.2 逻辑地址和物理地址

CPU 执行指令时产生的地址是逻辑地址,通过内存管理部件 MMU 的地址转换机制将逻辑地址映射为对应的物理地址,最终才能访问实际的存储单元。

  • 逻辑地址:程序编译后,每个目标模块都从 0 号单元开始编址,这称为该目标模块的 相对地址逻辑地址。当链接程序将各个模块链接成一个完整的可执行目标程序时,链接程序顺序依次按各个模块的相对地址构成统一的从 0 号单元开始编址的逻辑地址空间(或虚拟地址空间)。进程在运行时,看到和使用的地址都是逻辑地址,用户程序和程序员也只需知道逻辑地址,内存管理的具体机制则是完全透明的。不同进程可以有相同的逻辑地址,因为这些相同的逻辑地址可以映射到主存的不同位置;
  • 物理地址:内存中真实的物理地址,是地址转换的最终地址,进程在运行时执行指令和访问数据,最后都要通过物理地址从主存中存取。当装入程序将可执行代码装入内存时,必须通过地址转换将逻辑地址转换成物理地址,这个过程称为地址重定位。逻辑地址通过页表映射到物理内存,页表由操作系统维护并被处理器引用;

1.1.3 进程的内存映像

当一个程序调入内存运行时,就构成了进程的内存映像。一个进程的内存映像一般有几个要素:

  • 代码段:程序的二进制代码,代码段是只读的,可以被多个进程共享;
  • 数据段:程序运行时加工处理的对象,包括全局变量和静态变量;
  • 进程控制块(PCB):存放在系统区,操作系统通过 PCB 来控制和管理进程;
  • 堆:用来存放动态分配的变量,通过调用 malloc 函数动态地向高地址分配空间;
  • 栈:用来实现函数调用,从用户空间的高地址往低地址方向增长;

其中代码段和数据段在程序调入内存时就指定了大小,而堆和栈可以伸缩。其中只读代码段内的程序是可以被不同进程共享的。当调用 malloc 和 free 函数时,堆可以在运行时动态地扩展和收缩。用户栈在程序运行期间也可以动态地扩展和收缩,每次调用一个函数,栈就会增长;从一个函数返回时,栈就会收缩。
在这里插入图片描述

1.1.4 内存保护

为了确保每个进程都有一个单独的内存空间,内存分配前需要保护操作系统不受用户进程的影响,同时保护用户进程不受其他用户进程的影响。内存保护可采取两种方法:

  • 上、下限寄存器:在 CPU 中设置一对上、下限寄存器,存放用户作业在主存中的下限和上限地址,每当 CPU要访问一个地址时,分别和两个寄存器的值相比,判断有无越界;
  • 重定位寄存器和界地址寄存器:采用重定位寄存器(又称基地址寄存器)和界地址寄存器(又称限长寄存器)来实现这种保护。重定位寄存器最小的物理地址值界地址寄存器逻辑地址的最大值。内存管理机构动态地将逻辑地址与界地址寄存器进行比较,若未发生地址越界,则加上重定位寄存器的值后映射成物理地址,再送交内存单元:
    在这里插入图片描述
    加载重定位寄存器和界地址寄存器时必须使用特权指令,只有操作系统内核才可以加载这两个存储器进行读写,不允许用户程序修改;

1.1.5 内存分配与回收

存储管理方式随着操作系统的发展而发展,在操作系统由单道向多道发展时,存储管理方式便由 单一连续分配 发展为 固定分区分配。为了能更好地适应不同大小的程序要求,又从固定分区分配发展到 动态分区分配。为了更好地提高内存的利用率,进而从 连续分配方式 发展到 离散分配方式 —— 页式存储管理。引入分段存储管理的目的,主要是为了满足用户在编程和使用方面的要求,其中某些要求是其他几种存储管理方式难以满足的。

1.2 内存扩充

覆盖与交换技术是在多道程序环境下用来扩充内存的两种方法。交换技术主要在不同进程(或作业)之间进行,而覆盖则用于同一个程序或进程中。对于主存无法存放用户程序的矛盾,现代操作系统是通过虚拟内存技术来解决的,覆盖技术则已成为历史,而交换技术在现代操作系统中仍具有较强的生命力。

1.2.1 覆盖

早期的计算机系统中,主存容量小到仅存放一道用户进程都可能放不下,因此需要使用覆盖技术。覆盖的基本思想如下:由于程序运行时并非任何时候都要访问程序及数据的各个部分,因此可把用户空间分成一个 固定区 和若干 覆盖区。将经常活跃的部分放在固定区,其余部分按调用关系分段。首先将那些即将要访问的段放入覆盖区,其他段放在外存中,在需要调用前,系统再将其调入覆盖区,替换覆盖区中原有的段。
在这里插入图片描述

覆盖技术的特点是,打破了必须将一个进程的全部信息装入主存后才能运行的限制,但当同时运行程序的代码量大于主存时仍不能运行;此外,内存中能够更新的地方只有覆盖区的段,不在覆盖区中的段会常驻内存。覆盖技术对用户和程序员不透明。

1.2.2 交换

交换的基本思想是:把处于等待状态(或在 CPU 调度原则下被剥夺运行权利)的程序从内存移到辅存,把内存空间腾出来,这一过程又称 换出;把准备好竞争 CPU 运行的程序从辅存移到内存,这一过程又称 换入

1.3 连续分配管理

连续分配方式是指为一个用户程序分配一个连续的内存空间,譬如某用户需要 100MB 的内存空间,连续分配方式就在内存空间中为用户分配一块连续的 100MB 空间。连续分配方式主要包括单一连续分配、固定分区分配和动态分区分配。

虽然现在的通用计算和大多数现代操作系统使用的都是分页存储管理技术,但连续分配管理方式并没有被完全取代,一些嵌入式系统、实时操作系统和特定的硬件配置仍然使用连续分配方案,因为它们更简单、更确定。

1.3.1 单一连续分配

单一连续分配方式适用于单道程序环境,内存在此方式下分为系统区和用户区,系统区仅供操作系统使用,通常在低地址部分;在用户区内存中,仅有一道用户程序,即整个内存的用户空间由该程序独占。

这种方式的优点是简单、无外部碎片,无须进行内存保护,因为内存中永远只有一道程序;缺点是只能用于单用户、单任务的操作系统中,有内部碎片,存储器的利用率极低。

1.3.2 固定分区分配

固定分区分配是最简单的一种多道程序存储管理方式,它将用户内存空间划分为若干固定大小的区域,每个分区只装入一道作业。当有空闲分区时,便可再从外存的后备作业队列中选择适当大小的作业装入该分区,如此循环。在划分分区时有两种不同的方法:

  • 分区大小相等:程序太小会造成浪费,程序太大又无法装入,缺乏灵活性;
  • 分区大小不等:划分为多个较小的分区、适量的中等分区和少量大分区;

为了便于分配,固定分区分配法会建立一张分区使用表,通常按分区大小排队,各表项包括每个分区的起始地址、大小及分配状态。分配内存时,便检索该表,以找到一个能满足要求且尚未分配的分区分配给装入程序,并将对应表项的状态置为 “已分配”;若找不到这样的分区,则拒绝分配。回收内存时,只需将对应表项的状态置为 “未分配” 即可:
在这里插入图片描述

这种方式存在两个问题:一是程序可能太大而放不进任何一个分区,这时就需要采用覆盖技术来使用内存空间;二是当程序小于固定分区大小时,也要占用一个完整的内存分区,这样分区内部就存在空间浪费,这种现象称为 内部碎片。固定分区是可用于多道程序设计的最简单的存储分配,无外部碎片,但不能实现多进程共享一个主存区,所以存储空间利用率低。

1.3.3 动态分区分配

动态分区分配又称 可变分区分配,它是在进程装入内存时,根据进程的实际需要,动态地为之分配内存,并使分区的大小正好适合进程的需要。因此,系统中分区的大小和数目是可变的。如图展示了系统先后为不同进程分配内存空间的过程:
在这里插入图片描述

动态分区在开始时是非常有效的,但随着时间的推移,内存中会产生越来越多小的内存块,内存的利用率也随之下降。这些小的内存块称为 外部碎片,它存在于所有分区的外部,这与固定分区中的内部碎片正好相对。克服外部碎片可以通过 紧凑技术 来解决,即操作系统不时地对进程进行移动和整理。但这需要动态重定位寄存器的支持,且相对费时。紧凑的过程实际上类似于Windows系统中的磁盘碎片整理程序,只不过后者是对外存空间的紧凑。

在进程装入主存时,若内存中有多个足够大的空闲块,操作系统需要使用一定的分配策略确定分配的内存块供进程使用:

  • 首次适应 (First Fit) 算法:空闲分区以地址递增的次序链接。分配内存时,从链首开始顺序查找,找到大小能满足要求的第一个空闲分区分配给作业;
  • 邻近适应 (Next Fit) 算法:又称循环首次适应算法,由首次适应算法演变而成。不同之处是,分配内存时从上次查找结束的位置开始继续查找;
  • 最佳适应 (Best Fit) 算法:空闲分区按容量递增的次序形成空闲分区链,找到第一个能满足要求且最小的空闲分区分配给作业,避免 “大材小用”;
  • 最坏适应 (Worst Fit) 算法:空闲分区以容量递减的次序链接,找到第一个能满足要求的,即最大的分区,从中分割一部分存储空间给作业;

1.4 基本分页存储管理

固定分区分配会产生内部碎片,动态分区分配会产生外部碎片,这两种技术对内存的利用率都比较低。为了尽量避免碎片的产生,引入了 分页 的思想:把主存空间划分为大小相等且固定的 。块相对较小,是主存的基本单位,每个进程也以块为单位进行划分,进程在执行时,以块为单位逐个申请主存中的块空间。

  分页存储管理从形式上看,像分区相等的固定分区技术,分页管理不会产生外部碎片。但它又有本质的不同点:块的大小相对分区要小很多,而且进程也按照块进行划分,进程运行时按块申请主存可用空间并执行。这样,进程只会在为最后一个不完整的块申请一个主存块空间时,才产生主存碎片,所以尽管会产生内部碎片,但这种碎片相对于进程来说也是很小的,每个进程平均只产生半个块大小的内部碎片(也称 页内碎片)。

1.4.1 页和页表

  • 页:在分页存储管理系统中,进程以块为单位进行划分。进程中的块称为 页面(Page),内存中的块称为 页框页帧(Page Frame),外存中的块称为 盘块(Block)。进程在执行时需要申请主存空间,即要为每个页面分配主存中的可用页框,这就产生了页和页框的一一对应;
  • 页表:系统为方便在内存中找到进程的每个页面所对应的物理块而为每个进程建立了一张页表,页表记录 每个页面在内存中对应的物理块号,页表一般存放在内存中。进程执行时,通过查找页表找到每页在内存中的物理块号:
    在这里插入图片描述

1.4.2 页地址

  • 逻辑地址结构:内存中的页面使用的是逻辑地址,前一部分为页号 P,后一部分为页内偏移量 W,地址长度为 32 位;
    在这里插入图片描述

  • 页表寄存器(PTR):系统中通常设置一个页表寄存器来存放页表在内存的起始地址 F 和页表长度 M。进程未执行时,页表的始址地址和页表长度存放在本进程的 PCB 中;当进程被调度执行时,才将页表始址和页表长度装入页表寄存器中;

  • 基础地址变换机构:分页存储管理系统中,使用地址变换机构借助页表将逻辑地址转换为内存中的物理地址;
    在这里插入图片描述

  设页面大小 L 为 1KB,页号 2 对应的物理块为 b=8,计算逻辑地址 A=2500 的物理地址 E 的过程如下:
页号 P=2500/1K=2,
页内偏移量 W=2500%1K =452,
查找页表得到页号 2 对应的物理块的块号为 8,
物理地址 E=8×1K+452=8644。

1.4.3 具有快表的地址变换机构

根据前面介绍的分页存储管理系统的地址变换过程可知,若页表全部放在内存中,则存取一个数据或一条指令至少要访问两次内存:第一次是访问页表,第二次是根据该地址存取数据或指令。显然,这种方法比通常执行指令的速度慢了一半。为此,在地址变换机构中增设一个具有并行查找能力的高速缓冲存储器——快表,又称 相联存储器 (TLB),用来存放当前访问的若干页表项,以加速地址变换的过程。与此对应,主存中的页表常称为慢表:
在这里插入图片描述
有些处理机设计为快表和慢表同时查找,若在快表中查找成功则终止慢表的查找;更常见的是先查找快表,若都未匹配再查找慢表。

1.4.4 两级页表

为了进一步提高内存利用率,将页表的空间也进行了地址映射,得到了二级分页的层次结构页表。两级页表实际上是在原有页表结构上再加上一层页表:一级页表一般只能有 1 个页面,每个条目指向一个二级页表的块;二级页表中的条目则存储了内存中页号到外存中块号的映射,多个二级页表的地址可以不连续,并且不用将所有的页表都调入内存。其逻辑地址格式和二级页表结构如下:
在这里插入图片描述

1.5 基本分段存储管理

分页管理方式是从计算机的角度考虑设计的,通过硬件机制实现,对用户完全透明,目的是提高内存的利用率,提升计算机的性能。分段管理方式的提出则考虑了用户和程序员,以满足方便编程、信息保护和共享、动态增长及动态链接等多方面的需要。

1.5.1 段和段表

  • 段:段式管理方式按照用户进程中的 自然段划 分逻辑空间,例如:用户进程由主程序段、两个子程序段、栈段和数据段组成,于是可以把这个用户进程划分为 5 段,每段从 0 开始编址,并分配一段连续的地址空间(段内要求连续,段间不要求连续,因此整个作业的地址空间是二维的);
  • 段表:每个进程都有一张逻辑空间与内存空间映射的段表,其中每个段表项对应进程的一段,段表项记录该段在内存中的始址和长度;
    在这里插入图片描述
    图中不同段之间地址不连续;

1.5.2 段地址

  • 逻辑地址结构:内存中的页面使用的是逻辑地址,其逻辑地址由段号 S 与段内偏移量 W 两部分组成。与页式管理系统中逻辑地址的页号和页内偏移量对用户透明的不同,在段式系统中,段号和段内偏移量必须由用户 显式提供,在高级程序设计语言中,这个工作由编译程序完成;
    在这里插入图片描述

  • 段表寄存器:系统中通常设置一个段表寄存器来存放段表在内存的起始地址 F 和段表长度 M;

  • 基础地址变换机构:分段存储管理系统中,使用地址变换机构借助段表将逻辑地址转换为内存中的物理地址;
    在这里插入图片描述

1.5.3 段的共享与保护

  • 可重入代码:又称为 “纯代码”,是一种允许多个进程访问的代码(不属于临界资源),不允许任何进程对它进行修改。如果想要修改可重入代码,访问纯代码的进程需要把执行中可能改变的部分拷贝到该数据区,然后对该数据区中的内容进行修改,这样不会改变共享的代码;
  • 段的共享:在分段系统中,段的共享是通过 两个作业的段表中相应表项指向被共享的段的同一个物理副本 来实现的。当一个作业正从共享段中读取数据时,必须防止另一个作业修改此共享段中的数据。纯代码和不能修改的数据可以共享,而可修改的代码和数据不能共享;
  • 段的保护:分段管理的保护方法主要有两种:一种是 存取控制保护,另一种是 地址越界保护。地址越界保护将段表寄存器中的段表长度与逻辑地址中的段号比较,若段号大于段表长度,则产生越界中断;再将段表项中的段长和逻辑地址中的段内偏移进行比较,若段内偏移大于段长,也会产生越界中断;

  与页式管理不同,段式管理不能通过给出一个整数便确定对应的物理地址,因为每段的长度是不固定的,无法通过整数除法得出段号,无法通过求余得出段内偏移,所以段号和段内偏移一定要显式给出(段号,段内偏移),因此分段管理的地址空间是二维的。

1.6 段页式管理

分页存储管理能有效地提高内存利用率,分段存储管理能反映程序的逻辑结构并有利于段的共享和保护。将这两种存储管理方法结合起来,便形成了段页式存储管理方式。

  • 段页式系统:在段页式系统中,作业的地址空间首先被分成若干逻辑段,每段都有自己的段号,然后将每段分成若干大小固定的页。对内存空间的管理仍然和分页存储管理一样,将其分成若干和页面大小相同的存储块,对内存的分配以存储块为单位;

  • 逻辑地址结构:在段页式系统中,作业的逻辑地址分为段号、页号和页内偏移量三部分;
    在这里插入图片描述

  • 基础地址变换机构:为了实现地址变换,系统为 每个进程建立一张段表每个分段有一张页表。段表表项中至少包括段号、页表长度和页表始址,页表表项中至少包括页号和块号。此外,系统中还应有一个段表寄存器,指出作业的段表始址和段表长度;
    在这里插入图片描述
    在段页式系统中,一个进程中的段表只有一个,而页表可能有多个;

2. 虚拟内存管理

前面讨论的各种内存管理策略都是为了同时将多个进程保存在内存中,以便允许进行多道程序设计。但它们都具有 一次性驻留性 两个特征,即作业必须一次性全部装入内存后才能开始运行,且作业被装入内存后就一直驻留在内存中直至作业运行结束。因此,许多在程序运行中暂时不用的程序或数据占据了大量的内存空间,导致一些需要运行的作业无法装入运行,浪费了宝贵的内存资源。

2.1 虚拟内存管理概念

  • 局部性原理:在程序执行过程中,数据和指令往往会在相对较短的时间内多次访问相同的内存位置或者附近的内存位置,即时间局部性和空间局部性:
    • 时间局部性:程序中的某条指令一旦执行,不久后该指令可能再次执行;某数据被访问过,不久后该数据可能再次被访问。产生的原因是程序中存在着大量的循环操作;
    • 空间局部性:一旦程序访问了某个存储单元,不久后其附近的存储单元也将被访问。因为指令通常是顺序存放、顺序执行的,数据也一般是以向量、数组、表等形式簇聚存储的;

  时间局部性通过将近来使用的指令和数据保存到高速缓存中,并使用高速缓存的层次结构实现。空间局部性通常使用较大的高速缓存,并将预取机制集成到高速缓存控制逻辑中实现。虚拟内存技术实际上建立了“内存-外存”的两级存储器结构,利用局部性原理实现高速缓存。

  • 虚拟存储器:基于局部性原理,在程序装入时,仅须将程序当前要运行的少数页面或段先装入内存,而将其余部分暂留在外存,便可启动程序执行。在程序执行过程中,当所访问的信息不在内存时,操作系统将内存中暂时不使用的内容换出到外存上以腾出空间,然后将所需要的部分调入内存,继续执行程序。这样,系统好像为用户提供了一个比实际内存容量大得多的存储器,称为虚拟存储器。虚拟存储器的特征如下:

    • 多次性:作业运行时只需将当前要运行的那部分程序和数据装入内存即可开始运行,以后每当要运行到尚未调入的那部分程序时,再将它调入;
    • 对换性:无须在作业运行时一直常驻内存,在进程运行期间,允许将那些暂不使用的程序和数据从内存调至外存的对换区(即换出),待以后需要时再将它们从外存调至内存(即换入);
    • 虚拟性:从逻辑上扩充内存的容量,使用户所看到的内存容量远大于实际的内存容量;
  • 虚拟内存技术的实现:建立在 离散分配 的内存管理方式的基础上,有 请求分页存储管理请求分段存储管理请求段页式存储管理 三种方式,并且需要一些硬件支持:一定容量的内存和外存、页表机制(或段表机制)、中断机构和地址变换机构。下面介绍的内存管理方式都以请求分页管理方式展开;

2.2 请求分页管理方式

请求分页管理方式建立在基本分页系统基础之上,为了支持虚拟存储器功能而增加了 请求调页 功能和 页面置换 功能。在作业执行过程中,当所要访问的页面不在内存中时,再通过调页功能将其调入,同时还可通过置换功能将暂时不用的页面换出到外存上,以便腾出内存空间。为了实现请求分页,除了需要一定容量的内存及外存的计算机系统,系统必须提供一定的硬件支持:页表机制、缺页中断机构和地址变换机构。

  • 页表机制:为了解决要访问的页面不在内存中的情况,在请求页表项中增加了4个字段如下:
    在这里插入图片描述
    • 状态位 P:供程序访问时指示该页是否已调入内存;
    • 访问字段 A:用于记录本页在一段时间内被访问的次数,或记录本页最近已有多长时间未被访问,供置换算法换出页面时参考;
    • 修改位 M:标识该页在调入内存后是否被修改过,以确定页面置换时是否写回外存;
    • 外存地址:用于指出该页在外存上的地址,通常是物理块号,供调入该页时参考;
  • 缺页中断机构:在请求分页系统中,每当所要访问的页面不在内存中时,便产生一个缺页中断,请求操作系统将所缺的页调入内存。此时缺页的进程被阻塞(调页完成后唤醒),若内存中有空闲块,则分配一个块将要调入的页装入该块,并修改页表中的相应页表项;若内存中没有空闲块,则要淘汰某页(若被淘汰页在内存期间被修改过,则要将其写回外存);
  • 地址变换机构:为了实现虚拟内存,在分页系统地址变换机构的基础上增加缺页中断、页面置换等功能;
    在这里插入图片描述

2.3 页框分配

内存中的块称为页框。对于分页式的虚拟内存,在进程准备执行时,不需要也不可能把一个进程的所有页都读入主存,因此操作系统必须决定读取多少页,即给特定的进程分配多少个页框。

  • 驻留集:给一个进程分配的物理页框的集合就是这个进程的驻留集;
  • 内存分配策略:在请求分页系统中,可采取两种内存分配策略,即固定和可变分配策略;在进行置换时,也可采取两种策略,即全局置换和局部置换。于是可组合出以下三种策略:
    • 固定分配局部置换:为每个进程分配一定数目的物理块,在进程运行期间都不改变。如果进程在运行中发生缺页,则只能从分配给该进程在内存的页面中选出一页换出,然后再调入一页,以保证分配给该进程的内存空间不变;
    • 可变分配全局置换:先为每个进程分配一定数目的物理块,在进程运行期间可根据情况适当地增加或减少。如果进程在运行中发生缺页,系统从空闲物理块队列中取出一块分配给该进程,并将所缺页调入;
    • 可变分配局部置换:为每个进程分配一定数目的物理块,当某进程发生缺页时,先从该进程在内存的页面中选出一页换出,因此不会影响其他进程的运行。若进程在运行中频繁地发生缺页中断,则系统再为该进程分配若干物理块,直至该进程的缺页率趋于适当程度;反之,若进程在运行中的缺页率特别低,则可适当减少分配给该进程的物理块,但不能引起其缺页率的明显增加;

2.4 页面置换算法

在请求分页系统中,若进程运行时访问的页面不在内存中而需将其调入,但内存已无空闲空间时,就需要从内存中调出一页程序或数据,送入磁盘的对换区。选择调出页面的算法称为页面置换算法,好的页面置换算法应有较低的页面更换频率。常见的页面置换算法如下:

  • 最佳 (OPT) 置换算法:选择以后永不使用或在最长时间内不再被访问的页面作为被淘汰页面,以便保证获得最低的缺页率。该算法是理想情况下的,无法实现,因为系统无法预知进程在内存下的若干页面中哪个是未来最长时间内不再被访问的。但可利用该算法去评价其他算法;

在这里插入图片描述
需要注意的是,最佳置换算法判断的依据是最长时间不被访问,不是以后被访问的次数最小。

  • 先进先出 (FIFO) 页面置换算法:优先淘汰最早进入内存的页面,即淘汰在内存中驻留时间最久的页面。该算法实现简单,但没有考虑页面的实际被访问频次;

  FIFO 算法会产生所分配的物理块数增大而页故障数不减反增的异常现象,称为 Belady 异常。只有 FIFO 算法可能出现 Belady 异常,LRU 和 OPT 算法永远不会出现 Belady 异常。
在这里插入图片描述

  • 最近最久未使用 (LRU) 置换算法:选择最近最长时间未访问过的页面予以淘汰。该算法为每个页面设置一个访问字段,用来记录页面自上次被访问以来所经历的时间,淘汰页面时选择现有页面中值最大的予以淘汰;

  LRU是堆栈类的算法,性能较好,但需要寄存器和栈的硬件支持。

  • 时钟 (Clock) 置换算法:为每个页框设置访问位 A 和修改位 W,在选择页面换出时,优先级如下:

    • 1类:A=0, M=0,最近未被访问且未被修改,是最佳淘汰页;
    • 2类:A=0, M=1,最近未被访问但已被修改,不是很好的淘汰页;
    • 3类:A=1, M=0,最近已被访问但未被修改,可能再被访问;
    • 4类:A=1, M=1,最近已被访问且已被修改,很可能再被访问;

    内存中的每页必定都是这四类页面之一,将内存中的所有页面视为一个循环队列,并有一个 替换指针 与之相关联,当某一页被替换时,该指针被设置指向被替换页面的下一页。在进行页面置换时,从指针的当前位置开始,扫描循环队列,将遇到的第一个 1 类页面作为选中的淘汰页,在第一次扫描期间不改变访问位 A;若上一步失败,则进行第二轮扫描,将遇到的第一个 2 类页面作为淘汰页,并且第二轮扫描期间将所有扫描过的页面的访问位都置 0;若上一步仍失败,则将指针返回到开始的位置,并将所有帧的访问位复 0,并重复上面的操作,一定能找到被淘汰的页;

2.5 抖动和工作集

抖动是进程运行时出现的严重问题,必须采取相应的措施解决它。由于抖动的发生与系统为进程分配物理块的多少有关,于是又提出了关于进程工作集的概念。

  • 抖动:在页面置换过程中,一种最糟糕的情形是,刚刚换出的页面马上又要换入主存,刚刚换入的页面马上又要换出主存,这种频繁的页面调度行为称为抖动或颠簸;

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

  • 工作集:在某段时间间隔内进程要访问的页面集合称为工作集,工作集 W 可由时间 t 和工作集窗口大小 Δ \Delta Δ 来确定。工作集反映了进程在接下来的一段时间内很有可能会频繁访问的页面集合,因此一般分配给进程的物理块数(即驻留集大小)要大于工作集大小;

在这里插入图片描述
  工作集模型的原理是,让操作系统跟踪每个进程的工作集,并为进程分配大于其工作集的物理块。落在工作集内的页面需要调入驻留集中,而落在工作集外的页面可从驻留集中换出。若还有空闲物理块,则可再调一个进程到内存。若所有进程的工作集之和超过了可用物理块总数,则操作系统会暂停一个进程,将其页面调出并将物理块分配给其他进程,防止出现抖动现象。

2.6 虚拟存储器性能影响因素

  • 页面的大小:页面较大会导致缺页率较低,但会使页内碎片增大;页面较小则缺页率较高,且页表过长导致占用大量内存,但可以减少内存碎片,提高内存利用率;
  • 驻留集大小:分配给进程的物理块数越多,缺页率就越低,但是当物理块超过某个数目时,再为进程增加一个物理块对缺页率的改善是不明显的。因此只要保证活跃页面在内存中,保持缺页率在一个很低的范围即可;
  • 置换算法:好的页面置换算法可使进程在运行过程中具有较低的缺页率。选择 LRU、CLOCK 等置换算法,将未来有可能访问的页面尽量保留在内存中,从而提高页面的访问速度;
  • 写回磁盘的频率:换出已修改过的页面时,应当写回磁盘,如果每当一个页面被换出时就将它写回磁盘,那么每换出一个页面就需要启动一次磁盘,效率极低。为此可以在系统中建立一个已修改换出页面的链表,对每个已修改的要被换出的页面,可以暂不将它们写回磁盘,而将它们挂在该链表上,仅当被换出页面数达到给定值时,才将它们一起写回磁盘,这样就可显著减少磁盘 I/O 的次数,减少己修改页面换出的开销;

2.7 地址翻译

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值