操作系统考研——内存管理

内存管理

  • 一、内存管理概念
    • 1.内存管理的基本原理和要求
      • a.内存管理的功能
      • b.程序的装入和链接
      • c.逻辑地址空间与物理地址空间
      • d.内存保护
    • 2.*覆盖与交换
      • a.覆盖
      • b.交换
    • 3.连续分配管理方式
      • a.单一连续分配
      • b.固定分区分配
      • c.动态分区分配
    • 4.非连续分配管理方式
      • a.基本分页存储管理方式
        • (1)分页存储的基本概念
        • (2)基本地址变换机构
        • (3)具有快表的地址变换机构
        • (4)两级页表
      • b.基本分段存储管理方式
        • (1)管理目的
        • (2)分段及段表
        • (3)地址变换机构
        • (4)段的共享和保护
        • (5)分段与分页的优缺点
        • (6)分段与分页的区别
      • c.段页式管理方式
        • (1)提出目的
        • (2)管理思想
  • 二、虚拟内存管理
    • 1.虚拟内存的概念
      • a.传统存储管理理方式的特征
      • b.局部性原理
      • c.虚拟存储器的定义和特征
      • d.虚拟内存技术的实现
    • 2.请求分页管理方式
      • a.页表机制
      • b.缺页中断机构
      • c.地址变换机构
    • 3.页面置换算法
      • a.最佳置换算法(OPT)
      • b.先进先出页面置换算法(FIFO)
      • c.最近最久未使用置换算法(LRU)
      • d.时钟置换算法(CLOCK)
      • e.改进型时钟置换算法
    • 4.页面分配策略
      • a.驻留集大小
      • b.调入页面的时机
      • c.从何处调入页面
    • 5.抖动与工作集
      • a.抖动
      • b.工作集


一、内存管理概念

1.内存管理的基本原理和要求

    操作系统对内存的划分和动态分配就是内存管理的概念。

a.内存管理的功能

    (1)内存空间的分配与回收。由操作系统完成主存储器空间的分配和管理,使程序员摆脱存储分配的麻烦,提高编程效率。如:连续分配方式和非连续分配方式。
    (2)地址转换。在多道程序环境下,程序 中的逻辑地址与内存中的物理地址不可能一致,因此存储管理必须提供地址变换的功能,把逻辑地址转换为相应的物理地址。
    (3)内存空间的扩充。利用虚拟存储技术活自动覆盖技术,从逻辑上扩充内存。如:覆盖技术、交换技术和虚拟存储技术。
    (4)存储保护。保证各道作业在各自的存储空间内运行,互不干扰。

b.程序的装入和链接

    创建进程首先要将程序和数据装入内存。将用户源程序变为可在内存中执行的程序,通常需要以下几个步骤:
    (1)编译。由编译程序将用户源代码变异成若干目标模块。
    (2)链接。由链接程序将编译后形成的一组目标模块及所需的库函数链接在一起,形成一个完成的装入模块。
    (3)装入。由装入程序将装入模块装入内存中运行。
    程序的链接有以下三种方式:
    (1)静态链接。在程序运行之前,先将各目标模块及它们所需的库函数链接成一个完整的可执行程序,以后不再拆开
    
(2)装入时动态链接。将用户源程序编译后所得到的一组目标模块,再装入内存时,采用边装入边链接的方式。
    
(3)运行时动态链接
。对某些目标模块的链接,是在程序运行中需要该目标模块时才进行的。其优点是便于修改和更新,便于实现对目标模块的共享。
    内存的装入模块在装入内存时,同样有以下三种方式:
    (1)绝对装入。装入时按照实际的内存地址,将程序和数据装入内存,不需要对程序和数据的地址进行修改,但是只适用于单道程序环境。
    (2)可重定位装入(静态重定位)。此时才用的是模块与模块的相对地址,然后将程序和数据装入内存,装入时对目标程序中的指令和数据的修改过程称为重定位。
    静态重定位的特点是:一个作业装入内存时,必须给它分配要求的全部内存空间,若没有足够的内存,则不能装入该作业,此外,作业一旦进入内存,整个运行期间就不能在内存中移动,也不能再申请内存空间
    (3)动态运行时装入。也称动态重定位。装入程序把装入模块装入内存后,并不立即把装入模块中的相对地址转换为绝对地址,当程序真正执行时才进行转换。
    动态重定位特点:需要重定位寄存器,可以将程序分配到不连续的存储区中,便于程序段的共享,可以向用户提供更大的地址空间(地址空间大于存储空间)。

c.逻辑地址空间与物理地址空间

    逻辑地址空间:即相对地址,链接程序依次按照各个模块的相对地址构成统一的从0号单元开始编址的逻辑地址空间。
    物理地址空间:内存中物理单元的集合,是地址转换的最终地址,进程在运行时执行指令和访问数据,最后都要通过物理地址从主存中存取。
    地址重定位:将逻辑地址转换成物理地址的过程。

d.内存保护

    在CPU中设置一对上、下限寄存器,存放用户作业在主存中的下限和上限地址,每当CPU要访间一个地址时,分别和两个寄存器的数据比较,判断是否越界。
    重定位寄存器(基址寄存器)和界地址寄存器(限长寄存器)、重定位寄存器中包含最小物理地址值,界地址寄存器包含逻辑地址的最大值 。每个逻辑地址值必须小于界地址寄存器。
    地址转换过程:逻辑地址>界地址寄存器>重定位寄存器>物理地址

2.*覆盖与交换

    覆盖与交换技术是在多道程序环境下用来扩充内存的两种方法。

a.覆盖

    思想:将用户空间分为一个固定区和若干覆盖区,活跃部分放在固定区,即将访问的段放在覆盖区,将程序分为多个(多个模块),常用的段常驻内存,不常用的段在需要时调入内存。特点:打破了必须将一个进程的全部信息装入主存后才能运行的限制,内存中能够更新的地方只有覆盖区的段,不在覆盖区的段会常驻内存。

b.交换

    交换思想:内存空间紧张时,系统将内存中某些进程暂时换出外存,把外存中某些已具备运行条件的进程换入内存(进程在内存与磁盘间动态调度)
    换出:将处于等待状态的程序从内存中转移到辅存。换入:把准备好竞争CPU运行的程序从辅存转移到内存。
    交换技术主要在不同进程(作业)之间进行,而覆盖则用于同一个程序或进程中,由于覆盖技术要求给出程序段之间的覆盖结构,使得其对用户和程序员不透明。因此对于主存无法存放用户程序的矛盾,现代操作系统是通过虚拟内存技术解决的,覆盖技术已经成为历史,交换技术在现代操作系统中仍然有较强的生命力

3.连续分配管理方式

    连续分配方式是指为一个用户程序分配一个连续的内存空间,连续分配方式主要包括单一连续分配、固定分区分配和动态分区分配。

a.单一连续分配

    单一连续分配方式:内存分为系统区和用户区,系统区仅供操作系统使用,通常在低地址部分,用户区为用户提供的、除系统区之外的内存空间。
    单一连续分配方式的优点是简单、无外部碎片,可以采用覆盖技术,不需要额外的技术支持。缺点是只能用于单用户、单任务的操作系统中,有内部碎片,存储器的利用率低。

b.固定分区分配

    固定分区分配:将用户内存空间划分为若干固定大小区域,每个分区只装入一道作业,当有空闲分区时,便可再从外存的后备作业队列中选择适当大小的作业装入该分区,如此循环。
    固定分区分配在划分分区时有两种不同的方法:
    分区大小相等。用一台计算机去控制多个相同对象的场合,缺乏灵活性。
    分区大小不等。划分为多个较小的分区,适量的中等分区和少量大分区。
    固定分区分配方式的优点:适用于多道程序的存储,无外部碎片。缺点:一是程序可能太大而不能放进任何一个分区中,这时用户不得不使用覆盖技术来使用内存空间;二是主存利用率低,当程序小于固定分区大小时,也占用了一个完整的内存分区资源,这种现象称为内部碎片。

c.动态分区分配

    动态分区分配又称可变分区分配,是一种动态划分内存的分区方法,这种分区方法不预先划分内存,二是在进程装入内存时,根据进程的大小动态地建立分区,并使分区的大小正好适合进程的需要。因此系统中分区的大小和数目都是可变的。
    动态分区在开始分配时是很好的,但慢慢会产生越来越多的内存碎片,这些小的内存碎片称为外部碎片。克服外部碎片可以通过紧凑技术来解决。而紧凑技术的实现又需要动态重定位寄存器的支持,且相对费时。
    在进程装入或者换入主存时,若内存中有多个足够大的空闲块,责任操作系统就必须确定分配哪个内存块给进程使用。动态分配算法:
    (1)首次适用算法:空闲分区以地址递增的次序链接,分配内存时顺序查找,找到大小能满足要求的第一个空闲分区。
    (2)最佳适应算法:空闲分区按照容量递增的方式形成分区链,找到第一个能满足容量要求的空闲分区,即挑选最小的分区。
    (3)最坏适应算法:空闲分区以容量递减的方次序链接,找到第一个能满足要求的空闲分区,即挑选最大的分区。
    (4)邻近适应算法:又称循环首次适应算法,由首次适应算法演变而来,不同之处在于分配内存时从上次查找结束的位置开始继续查找。

4.非连续分配管理方式

    非连续分配允许一个程序分散地装入不相邻的内存分区。非连续分配的管理方式根据分区的大小是否固定,分为分页存储管理方式和分段存储管理方式。在分页存储管理方式中,又根据运行作业是否要把作业的所有页面都装入内存才能运行分为基本分页存储管理方式和请求分页存储管理方式

a.基本分页存储管理方式

    分页的思想:将主存空间划分为大小相等且固定的块,块相对较小作为主存的基本单位,每个进程以块为单位进行划分,进程执行时,以块为单位逐个申请主存中的块空间。
    分页存储与固定分区技术很像,但是其分页相对于分区又很小,分页管理不会产生外部碎片,产生的内部碎片也非常的小

(1)分页存储的基本概念

    页面和页面大小:进程中的块称为页,内存中的块称为页框(或页帧)。外存也以同样的单位进行划分,直接称为块。进程在执行时需要申请主存空间,即要为每个页面都分配主存中可用页框,这就产生了页与页框的一一对应。
    地址结构:页号(有多少页的编号)+页内偏移(页内存了多少东西)
    **页表:**为了便于在内存中找到进程的每个页面所对应的物理块,系统为每个进程建立一张页表,记录页面在内存中对应的物理块号,页表一般放在内存中。
页表项:页号+物理内存中的块号
页表项的物理内存块号+地址结构中的页内偏移= 物理地址

(2)基本地址变换机构

    地址变换机构的任务是将逻辑地址转换为内存中的物理地址。
    在系统中通常设置一个页表寄存器,用来存放页表在内存的起始地址F和页表长度M。进程未执行时,页表的始址和长度存放在进程控制块中,当进程执行时,才将页表始址和长度存放在页表寄存器。
    设页面大小为L,逻辑地址A到物理地址E的变换过程如下:
    (1)计算页号P(P=A/L)和页内偏移量W(W=A%L)
    (2)比较页号P和页表长度M,若P>=M则产生越界中断,否则继续执行
    (3)页表中页号P对应的页表项地址=页表始址F+页号P页表项长度,取出该页表项内容b,即为物理块号。页表长度的值是指一共多少页,页表项长度是指页地址占多大存储空间。
    (4)计算 E=b
L+W,用得到的物理地址E去访问内存。操作系统考研——内存管理_第1张图片
    页表项大小的设计应当尽量一页正好能装下所有的页表项。
    分页管理存在的问题:1.地址变换过程必须足够快,否则访存速率会降低。2.页表不能太大,否则会降低内存利用率。
    可优化方向:如果页表放在内存中,取地址访问一次内存,按照地址取出数据访问一次内存,共需要两次访问内存。

(3)具有快表的地址变换机构

    在地址变换机构中增加一个具有并行查找能力的高速缓冲寄存器(快表),又称为相联存储器。与此对应主存中的页表经常称为慢表。相联存储器既可以按照地址查找,也可以按照内容查找。
    访问一个逻辑地址的访存次数,如果快表命中,则只需要一次访存,快表未命中,需要两次访存
    在具有快表的分页机制中,地址的变换过程如下:
    1.CPU给出逻辑地址后,由硬件进行地址转换,将也好送入高速缓冲寄存器,并将此页号与快表中所有页号进行比较。
    2.若找到匹配的页号,说明所要访问的页表项在快表中,则直接从中取出该页对应的页框号,与页内偏移量拼接形成物理地址。
    3.若未找到匹配的页号,则需要访问主存中的页表,在读出页表项后应当同时将其存入快表,以便后面可能的再次访问。若快表已满,则按照一定的算法对旧的页表项进行替换。
操作系统考研——内存管理_第2张图片

(4)两级页表

    如果页数过多,就会导致页表也过多,那么我们可以考虑设置一个用来存储页表的页表(套娃)。
    逻辑地址空间格式= 一级页号 + 二级页号 + 页内偏移
    设计多级页表时一定要保证顶级页表一定只有一个,建立多级页表的目的在于建立索引,不需要浪费主存空间去存储无用的页表项,也不需要盲目式地查询页表项。

b.基本分段存储管理方式

(1)管理目的

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

(2)分段及段表

    分段是按照用户进程中的自然段划分逻辑空间的。每个进程中都由一张逻辑空间与内存空间映射的段白,这个段表项对应进程的一段,段表项记录的是该段在内存中的始址和长度。
    段表内容= 段号 + 段长 + 本段在内存中的地址
    地址结构= 段号S + 段内偏移量W
    页式系统中,页号和页内偏移量都对用户透明,但在段式系统中段号和段内偏移量必须由用户提供。

(3)地址变换机构

    (1)逻辑地址A中取出段号S和段内偏移量W
    (2)比较段号S和段表长度M,若S>=M则产生越界中断,否则继续执行
    (3)段号对应的段表项=段表始址F+段号S*段表项长度
    (4)取出段表项中该段的始址b,计算E=b+W,用得到的物理地址E去访问内存

(4)段的共享和保护

    共享是通过两个作业的段表中响应表项指向被共享段的同一个物理副本实现的。纯代码或者可重入代码以及不可修改的数据可以被共享。段的保护机制分为存取控制保护和地址越界保护。

(5)分段与分页的优缺点

    分页管理优点:内存空间利用率高,不会产生外部碎片,只会有少量的页内碎片。缺点:不方便按照逻辑模块实现信息的共享和保护
    分段管理优点:很方便的能够按照逻辑模块实现信息的共享和保护。缺点:如果段长过大,为其分配很大的连续空间会很不方便,段式管理还会产生外部碎片。

(6)分段与分页的区别

    分页管理对用户不可见,分段管理对用户可见,分页的地址空间是一维的,而分段管理的地址空间是二维的,分页、分段访问一个逻辑地址都需要两次访存,分段存储更容易实现信息的共享和保护。

c.段页式管理方式

(1)提出目的

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

(2)管理思想

    作业的地址空间首先被分成了若干逻辑段,每段都有自己的段号,每个段分成若干大小固定的页,对内存空间的管理仍然和分页存储管理一样。
    地址结构=段号S+页号P+页内偏移量W
    为了实现地址变换,系统为每个进程都建立了一张段表,每个分段有一个页表,一个进程中段表只能有一个,而页表可以有多个。

二、虚拟内存管理

1.虚拟内存的概念

a.传统存储管理理方式的特征

    一次性:作业必须一次性全部装入内存后才能看开始进行。缺点:作业很大时就无法运行,大量作业要求运行,由于内存不足,只能一部分作业先运行,导致多道程序度下降。
    驻留性:作业装入内存后,一直驻留在内存,任何部分不会被换出。

b.局部性原理

    时间局部性:如果执行了程序中的某条指令,那么这条指令不久后很有可能会再次被执行,如果某个数据被访问过,不久之后这个数据很有可能会再次被访问(程序中存在着大量的循环)。
    空间局部性:一旦程序访问了某个存储单元,在不久之后,其附近的存储单元很有可能会再次被访问。(很多数据在内存中都是连续存放的。

c.虚拟存储器的定义和特征

    基于局部性原理,程序的一部分装入内存,一部分留在外存,需要的时候将外存内容调入内存,系统好像为用户提供了一个比实际内存大得多的存储器,称为虚拟存储器。
    虚拟内存的最大容量是由计算机的地址结构(CPU寻址范围)决定的。
    虚拟内存的实际容量 = min(内存和外存容量之和,CPU寻址范围)
    虚拟存储器的特征
    多次性:作业在运行时,分多次调入内存运行。
    对换性:作业不必一直驻留内存,允许作业在运行过程中进行换进换出。
    虚拟性:从逻辑上扩充内存容量,使用户看到的内存容量远大于实际的内存容量。

d.虚拟内存技术的实现

    虚拟内存的实现需要建立在离散分配的内存管理方式的基础上,虚拟内存的实现由一下三种方式:1.请求分页存储管理。2.请求分段存储管理。3.请求段页存储管理。
    不管使用以上哪种方式,都需要一定的硬件支持,需要的支持有以下几个方面:1.一定容量的内存和外存。2.页表机制,作为主要的数据结构。3.中断机构,当用户程序要访问部分尚未调入内存时,则产生中断。4.地址变换机构,逻辑地址到物理地址的转换。

2.请求分页管理方式

    **请求分页系统建立在基本分页系统基础之上,为了支持虚拟存储器功能而增加了请求调页功能和页面置换功能。请求分页是目前组常用的一种实现虚拟存储器的方法。**为实现请求分页,系统除了需要一定容量的内存及外存的计算机系统,还需要有页表机制。缺页中断机构和地址变换机构

a.页表机制

    页表机制的组成:页号、内存块号、状态位、访问字段、修改位和外存地址。
    状态位:当前页是否已经调入内存。
    访问字段:记录本页在一段时间内被访问的次数。
    修改位:记录本页在一段时间内被访问的次数。
    外存地址:指出该页在外存上的位置。
操作系统考研——内存管理_第3张图片

b.缺页中断机构

    请求分页系统中,每当所要访问的页面不在内存中时,便产生一个中断,请求操作系统将所缺的页调入内存。
    在指令执行期间而非一条指令执行完后产生和处理中断信号,属于内部中断。
    一条指令在执行期间,可能产生多次缺页中断。

c.地址变换机构

    请求分页系统中的地址变换机构,是在分页系统地址变换机构的基础上,为实现虚拟内存,又增加了某些功能而形成的。
    在进行地址变换时,先检索快表:
    1.若找到要访问的页,则修改页表项中的访问位,然后利用页表项中给出的物理块号,和页内地址形成物理地址。
    2.若未找到该页的页表项,则到内存中去查找页表,再比对页表项中的状态位P,看该页是否已经调入内存,未调入则产生缺页中断,请求从外存把该页调入内存。

3.页面置换算法

a.最佳置换算法(OPT)

    算法思想:选择以后永不使用的页面或是在最长时间内不再被访问的页面,以便获得最低的缺页率,但现实中是无法预知的。优点:缺页率最小,性能好。

b.先进先出页面置换算法(FIFO)

    算法思想:优先淘汰最早进入内存的页面,即在内存中驻留时间最久的页面。实现简单,但是与进程实际运行规律不匹配,会产生belady异常(增大了分配的物理块数但是故障数不减反增)。

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

    算法思想:选择最近最长时间没有被访问的页面进行淘汰,每个页面设置一个访问字段,用来标识上次被访问到现在经历的时间。性能好,但实现复杂,需要寄存器和栈的硬件支持。LRU算法属于堆栈类算法,性能接近OPT算法。

d.时钟置换算法(CLOCK)

    算法思想:该算法需要用到页表项当中的访问位,把各个页面组织成环形链表,指针指向最先进来的页面,当一个页面被装入内存时,将该位初始化为0,然后如果这个页面被访问,则把该位置为1,当发生一个缺页中断时,考察指针所指向的最先进来的页面,若它的访问位为0,立即进行置换,若访问位为1,则把该位置为0,然后指针往下移动一格,如此下去,直至找到被淘汰的页面,然后把指针移动到它的下一页。时钟置换算法的性能接近于最佳置换算法,但是实现复杂,开销大。

e.改进型时钟置换算法

    算法思想:在改进型时钟置换算法中,相对于时钟置换算法增加了一个修改位,这样页面换出时,既要是未使用过的页面,又要是未被修改过的页面。把同时满足这两个条件的页面作为首选淘汰的页面。由访问位A和修改位M可以组合成下面四种类型的页面(选择最先满足条件的页面):
    第一次扫描(A=0,M=0):最近既未被访问,又未被修改,是最佳置换页。(第一次扫描不改变任何位)
    第二次扫描(A=0,M=0):最近未被访问,但已被修改。(第二次扫描将访问位置为了0)
    第三次扫描(A=1,M=0):最近已被访问,但未被修改。(第三次扫描不改变任何位)
    第四次扫描(A=1,M=1):最近已被访问且被修改。(第四次扫描不改变任何位)

4.页面分配策略

a.驻留集大小

    对于分页式的虚拟内存,在进程准备执行时,不需要也不可能把一个进程的所有页都读入主存,因此,操作系统必须决定读取多少页,即决定给特定的进程分配几个页框。驻留集指的就是给一个进程的分配的物理页框的集合。在设置驻留集大小时,需要考虑以下几个因素:
    (1)分配给一个进程的存储量越小,留在主存中的进程数就越多,可以提高处理机的时间利用率。
    (2)一个进程在主存中的页数过少,页错误率就会相对较高。
    (3)若页数过多,对进程的错误率没有明显的影响。
    基于这些因素,现代操作系统通常采用以下三种策略:
    (1)固定分配局部置换:给每个进程分配固定物理块数,缺页的时候就进行换页。
    (2)可变分配全局置换:每个进程分配一定的物理块,系统自身保留一定空闲物理块,如果进程缺页就对该进程分配新的物理块。
    (3)可变分配局部置换:根据进程的缺页情况,对物理块进行动态分配,如果频繁缺页,就对其多分配物理块,如果缺页率特别低,就减少其物理块。

b.调入页面的时机

    为确定系统将进程运行时所缺的页面调入内存的时机,可采取以下两种调页策略:
    **预调页策略:**将预计不久被访问的页面调入,由程序员决定调入那些页面,成功率仅约50%,因此这种策略主要用于进程的首次调入。
    **请求调页策略:**当进程提出缺页的时候在按照一定的调页策略进行调页(由操作系统将所需页面调入内存)。
    一般情况下,两种调页策略会同时使用。

c.从何处调入页面

    请求分页系统中的外存分为两部分:用于存放文件的文件区,和用于存放对换页面的对换区,对换区通常采用连续分配方式,而文件去采用离散分配方式,因此对换区的磁盘I/O速度比文件区的更快。从何处调入页面就存在三种情况:
    (1)系统拥有足够的对换区空间。可以全部从对换区调入所需页面,提高调页速度。
    (2)缺少足够的对换区空间。不会被修改的文件从文件区调入,可能被修改的部分换入对换区,以后再从对换区调入。
    (3)UNIX方式。进程相关文件访问文件区,没有运行的页面从文件区调入,曾经运行过但又被换出的页面放在对换区。

5.抖动与工作集

a.抖动

    刚刚换出的页面马上又要换入主存,刚刚换入的页面马上又要换出主存,这种频繁的页面调度行为称为抖动或者颠簸。
    引起抖动的原因有:1.分配的物理页帧不足。2.置换算法不当。

b.工作集

    工作集是指某段时间间隔内,进程要访问的页面集合。
    工作集模型的原理是:操作系统跟踪每个进程的工作集,并为进程分配大于其工作集的物理块,落入工作集的页面需要调入驻留集中,落在工作集外面的页面可以从驻留集中换出,若还有空闲物理块,则可以再调入一个进程到内存以增加多道程序数,若所有进程的工作集之和超过了可用物理块的总数,操作系统就会暂停一个进程,并将其页面调出并将其物理块分配给其他进程,防止出现抖动现象。

你可能感兴趣的:(操作系统)