内存管理408

一、内存管理概念

1、内存管理概念

在这里插入图片描述

1.1 内存管理的基本原理与要求

内存管理(Memory Management)是操作系统设计中最重要和复杂的内容之一。虽然计算机硬件技术一直在飞速发展,内存容量也在不断增大,但仍然不可能将所有用户进程和系统所需要的全部程序与数据放入主存,因此操作系统必须对内存空间进行合理的划分和有效的动态分配。操作系统对内存的划分和动态分配,就是内存管理的概念。

  • 内存管理的功能:
  1. 内存空间的分配与回收 :由操作系统完成主存储器空间的分配和管理,使程序员摆脱存储
  2. 地址转换:在多道程序环境下,程序中的逻辑地址与内存中的物理地址不可能一致,因此存储管理必须提供地址变换功能,把逻辑地址转换成相应的物理地址。
  3. 内存空间的扩充:利用虚拟存储技术或自动覆盖技术,从逻辑上扩充内存。
  4. 内夺共享:指允许多个进程访问内存的同一部分。例如,多个合作进程可能需要访问同一块数据,因此必须支持对内存共享区域进行受控访问。
  5. 存储保护:保证各道作业在各自的存储空间内运行,互不干扰。
  • 程序的链接与装入:编译、链接、装入
    创建进程首先要将程序和数据装入内存。将用户源程序变为可在内存中执行的程序,通常需要以下几个步骤:
  1. 编译。由编译程序将用户源代码编译成若干目标模块。
  2. 链接。由链接程序将编译后形成的一组目标模块及它们所需的库函数链接在一起,形成一
    个完整的装入模块。
  3. 装入。由装入程序将入模块入内存运行。
    在这里插入图片描述
  • 链接的三种方式:
  1. 静态链接:在程序运行之前,先将各目标模块及它们所需的库函数连接成一个完整的可执行文件(装入模块),之后不再拆开。
  2. 装入时动态链接:将各目标模块装入内存时,边装入边链接的链接方式。
  3. 运行时动态链接:在程序执行中需要该目标模块时,才对它进行链接。其优点是便于修改和更新,便于实现对目标模块的共享。
  • 内存的装入模块在装入内存时,同样有以下三种方式
  1. 绝对装入:在编译时,如果知道程序将放到内存中的哪个位置,编译程序将产生绝对地址的目标代码。
    装入程序按照装入模块中的地址,将程序和数据装入内存。
  2. 可重定位装入:又称静态重定位。编译、链接后的装入模块的地址都是从0开始的,指令中使用的地
    址、数据存放的地址都是相对于起始地址而言的逻辑地址。可根据内存的当前情况,将装入模块装入
    到内存的适当位置。装入时对地址进行“重定位”,将逻辑地址变换为物理地址(地址变换是在装入
    时一次完成的)。
  3. 动态重定位:又称动态运行时装入。编译、链接后的装入模块的地址都是从0开始的。装入程序把装
    入模块装入内存后,并不会立即把逻辑地址转换为物理地址,而是把地址转换推迟到程序真正要执行
    时才进行。因此装入内存后所有的地址依然是逻辑地址。这种方式需要一个重定位寄存器的支持。
1.2 逻辑地址与物理地址
  • 逻辑地址:编译后,每个目标模块都从0号单元开始编址,这称为该目标模块的相对地址(或逻辑地址)。当链接程序将各个模块链接成一个完整的可执行目标程序时,链接程序顺序依次按各个模块的相对地址构成统一的从0号单元开始编址的逻地址空间(虚拟地址空间 )。
  • 物理地址空间是指内存中物理单元的集合,它是地址转换的最终地址,进程在运行时执行指令和访问数据,最后都要通过物理地址从主存中存取。当装入程序将可执行代码装入内存时,必须通过地址转换将逻辑地址转换成物理地址,这个过程称为地址重定位。
1.3 进程的内存映像

不同于存放在硬盘上的可执行程序文件,当一个程序调入内存运行时,就构成了进程的内存映像。一个进程的内存映一般有几个要素:

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

代码段和数据段在程序调入内存时就指定了大小,而堆和不一样当用像 malloc 和 free这样的 C 标准库函数时,堆可以在运行时动态地扩展和收缩。用户栈在程序运行期间也可以动态地扩展和收缩,每次调用一个函数,栈就会增长;从一个函数返回时,栈就会收缩。.
在这里插入图片描述

1.4 内存保护

确保每个进程都有一个单独的内存空间。内存分配前,需要保护操作系统不受用户进程的影响,同时保护用户进程不受其他用户进程的影响。内存保护可采取两种方法:
(1)在 CPU 中设置一对上、下限存器,存用户作业在存中的下限和上限地址,每当CPU 要访问一个地址时,分别和两个存器的相比,判断有无越界。
(2)采用重定位寄存器(又称基地址寄存器)和界地存器(又称限长寄器)来实现这种保护。重定位寄存器含最小的物理地址值,界地址寄存器含逻辑地址的最大值。内存管理机构动态地将逻辑地址与界地址寄存器进行比较,若未发生地址越界,则加上重定位寄存器的值后映射成物理地址,再送交内存单元,
在这里插入图片描述

1.5 内存共享

可重入代码又称 纯代码,是一种允许多个进程同时访问但不允许被任何进程修改的代码

2、覆盖与交换

在这里插入图片描述

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

2.1 覆盖
  • 覆盖的基本思想如下:由于程序运行时并非任何时候都要访问程序及数据的各个部分(尤其是大程序),因此可把用户空间分成一个固定区和若干覆盖区。将经常活跃的部分放在固定区,其余部分按调用关系分段。首先将那些即将要访问的段放入覆盖区,其他段放在外存中,在需要调用前,系统再将其调入覆盖区,替换覆盖区中原有的段。
  • 覆盖技术的特点是,打破了必须将一个进程的全部信息装入主存后才能运行的限制,但当同时运行程序的代码量大于主存时仍不能运行,此外,内存中能够更新的地方只有覆盖区的段,不在覆盖区中的段会常驻内存。覆盖技术对用户和程序员不透明。
2.2 交换
  • 交换的基本思想是,把处于等待状(在 CPU 原则下被剥夺运行权利)的程序从内存移到辅存,把内存空间腾出来,这一过程又称换出:把准备好竞争 CPU 运行的程序从辅存移到内存,这一过程又称换入。

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

3、 连续分配管理方式

在这里插入图片描述

3.1 单一连续分配

内存在此方式下分为系统区和用户区,系统区仅供操作系统使用,通常在低地址部分;在用户区内存中,仅有一道用户程序,即整个内存的用户空间由该程序独占。
这种方式的优点是简单、无外部碎片,无须进行内存保护,因为内存中永远只有一道程序。缺点是只能用于单用户、单任务的操作系统中,有内部碎片,存储器的利用率极低。

3.2 固定分区分配

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

  • 分区大小相。程序太小会造成浪费,程序太大又无法装入,缺乏灵活性。
  • 分区大小不等。划分为多个较小的分区、适的中等分区和少大分区。
    这种方式存在两个问题:一是程序可能太大而放不进任何一个分区,这时就需要采用覆盖技术来使用内存空间;二是当序小于固定分区大小时,也要占用一个完整的内存分区,这样分区内部就存在空间浪费,这种现象称为内部碎片。固定分区是可用于多道程序设计的最简单的存储分配,无外部碎片,但不能实现多进程共享一个主存区,所以存储空间利用率低。
3.3 动态分区分配

又称可变分区分配,它是在进程装入内存时,根据进程的实际需要,动态地为之分配内存,并使分区的大小正好适合进程的需要。因此,系统中分区的大小和数目是可变的。

动态分区分配没有内部碎片,但是有外部碎片。内部碎片,分配给某进程的内存区域中,如果有些部分没有用上。外部碎片,是指内存中的某些空闲分区由于太小而难以利用。

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

在进程装入或换入主存时,若内存中有多个足够大的空闲块,则操作系统必须确定分配哪个内存块给进程使用,这就是动态分区的分配策略。考虑以下几种算法:
(1)首次适应 (First Fit)法。空闲分区以地址递增的次序链接。分配内存时,从链首开始顺序查找,找到大小能满足要求的第一个空闲分区分配给作业。
(2)邻近适应(Next Fit)算法。又称循环首次适应算法,由首次适应算法演变而成。不同之处是,分配内存时从上次查找结束的位置开始继续查找。
(3)最佳适应(Best Fit)法。空闲分区按容量递增的次序形成空闲分区链,找到第一个能满足要求且最小的空闲分区分配给作业,避免“大材小用”。
(4)最坏适应(Worst Fit)法。空闲分区以容量递减的次序链接,找到第一个能满足要求的即最大的分区,从中分割一部分存储空间给作业。

4、 基本分页存储管理

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

4.1 分页存储的基本概念

(1) 页面和页面大小
进程中的块称为页或页面(Page),内存中的块称为页页(Page Frame)。外存也以同样的单位进行划分,直接称为块或盘块(Block)。进程在执行时需要申请主存空间,即要为每个页面分配主存中的可用页框,这就产生了页和页框的一一对应。
(2)地址结构
在这里插入图片描述
地址结构包含两部分:前一部分为页号 P,后一部分为页内偏移量 W。地址长度为32位其中0~11 位为页内地址,即每页大小为 4KB;12 ~ 31 位为页号,即多允许2的20次方页。
(3) 页表
为了便于在内存中找到进程的每个页面所对应的物理块,系统为每个进程建立一张页表,记录页面在内存中对应的物理块号,页表一般存放在内存中。
在这里插入图片描述

4.2 基本地址变换机构

在这里插入图片描述

地址变换机构的任务是将逻辑地址转换为内存中的物理地址。地址变换是借助于页表实现的。
在这里插入图片描述

4.2 具有快表的地址变化机构

在地址变换机构中增设一个具有并行查找能力的高速缓冲存储器一一快表,又称相联存储器(TLB),用来存放当前访问的于页表项,以加地址变换的过程。与此对应,主存中的页表常称为慢表。

4.4 两级页表

二级页表实际上是在原有页表结构上再加上一层页表。建立多级页表的目的在于建立索引,以便不用浪费主存空间去存储无用的页表项,也不用盲目地顺序式查找页表项。
在这里插入图片描述

5、基本分段存储管理

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

5.1 分段

段式管理方式按照用户进程中的自然段划分逻辑空间。进程的地址空间:按照程序自身的逻辑关系划分为若干个段,每个段都有一个段名(在低级语言中,程序员使用段名来编程,在高级程序设计语言中,这个工作由编译程序完成。),每段从0开始编址,内存分配规则:以段为单位进行分配,每个段在内存中占据连续空间,但各段之间可以不相邻。

5.2 段表

每个进程都有一张逻辑空间与内存空间映射的段表,其中每个段表项对应进程的一段,段表项记录该段在内存中的始址和长度。
在这里插入图片描述
配置段表后,执行中的进程可通过查找段表,找到每段所对应的内存区。可见,段表用于实现从逻辑段到物理内存区的映射。
在这里插入图片描述

5.3 地址变换机构

在这里插入图片描述

6、 段页式管理

分页存储管理能有效地提高内存利用率,而分段存储管理能反映程序的逻辑结构并有利于段的共享和保护。将这两种存储管理方法结合起来,便形成了段页式存储管理方式。
在段页式系统中,作业的地址空间首先被分成若干逻辑段,每段都有自己的段号,然后将每段分成若千大小固定的页。对内存空间的管理仍然和分页存储管理一样,将其分成若和页面大小相同的存储块,对内存的分配以存储块为单位。
在段页式系统中,作业的逻辑地址分为三部分:段号、页号和页内偏移量。
在这里插入图片描述

二、虚拟内存

1、 虚拟内存的基本概念

1.1 传统存储管理方式的特征

(1)一次性。作业必须一次性全部装入内存后,才能开始运行。
(2)驻留性。作业被装入内存后,就一直驻在内存中,其任何部分都不会被换出”直至作业运行结束。运行中的进程会因等待I/O而被阻塞,可能处于长期等待状态。

1.2 局部性原理

局部性原理表现在以下两个方面
(1)时间局部性。程序中的某条指令一旦执行,不后该指令可能再次执行,某数据被访问过,不久后该数据可能再次被访问。产生的原因是程序中存在着大量的循环操作。
(2)空间局部性。一旦程序访问了某个存储单元,在不久后,其附近的存储单元也将被访问即程序在一段时间内所访问的地址,可能集中在一定的范围之内,因为指令通常是顺序存放、顺序执行的,数据也一般是以向量、数组、表等形式簇聚存储的。

1.3 虚拟存储器的定义与特征

基于局部性原理,在程序装入时,仅须将程序当前要运行的少数页面或段先装入内存,而将其余部分暂留在外存,便可启动程序执行。在程序执行过程中,当所访问的信息不在内存时,由操作系统将所需要的部分调入内存,然后继续执行程序。另一方面,操作系统将内存中暂时不使用的内容换出到外存上,从而腾出空间存放将要调入内存的信息。这样,系统好像为用户提供了一个比实际内存容量大得多的存储器,称为康拟存储器。
虚拟存储器的三个主要特征:
(1)多次性。是指无须在作业运行时一次性地全部装入内存,而允许被分成多次调入内存运行,即只需将当前要运行的那部分程序和数据装入内存即可开始运行。
(2)对换性。是指无须在作业运行时一直常驻内存,在进程运行期间,允许将那些暂不使用的程序和数据从内存调至外存的对换区(换出),待以后需要时再将它们从外存调至内存(换进)。正是由于对换性,才使得虚拟存储器得以正常运行。
(3)虚拟性。是指从逻辑上扩充内存的容量,使用户所看到的内存容量远大于实际的内存容量。这是虚拟存储器所表现出的最重要特征,也是实现虚拟存储器的最重要目标。

1.4 虚拟内存技术的实现

虚拟内存的实现有以下三种方式:

  • 请求分页存储管理。
  • 请求分段存储管理。
  • 请求段页式存储管理
    不管哪种方式,都需要有一定的硬件支持。一般需要的支持有以下几个方面
  • 一定容量的内存和外存。
  • 页表机制(或段表机制),作为主要的数据结构。
  • 中断机构,当用户程序要访问的部分尚未调入内存时,则产生中断。
  • 地址变换机构,逻辑地址到物理地址的变换。

2、 请求分页管理方式

请求分页系统建立在基本分页系统基础之上,为了支持虚拟存储器功能而增加了请求调页功能和页面置换功能。请求分页是目前最常用的一种实现虚拟存储器的方法。
在请求分页系统中,只要求将当前需要的一部分页面装入内存,便可以启动作业运行。在作业执行过程中,当所要访问的页面不在内存中时,再通过调页功能将其调入,同时还可通过置换功能将暂时不用的页面换出到外存上,以便腾出内存空间。

2.1 页表机制

请求分页系统的页表机制不同于基本分页系统,请求分页系统在一个作业运行之前不要求全部一次性调入内存,因此在作业的运行过程中,必然会出现要访问的页面不在内存中的情况,如何发现和处理这种情况是请求分页系统必须解决的两个基本问题。为此,在请求页表项中增加了4个字段。
在这里插入图片描述

2.2 缺页中断机构

在请求分页系统中,每当所要访问的页面不在内存中时,便产生一个缺页中断,请求操作系统将所缺的页调入内存。此时应将缺页的进程阻塞(调页完成唤醒),若内存中有空闲块,则分配一个块,将要调入的页装入该块,并修改页表中的相应页表项,若此时内存中没有空闲块,则要淘汰某页(若被淘汰页在内存期间被修改过,则要将其写回外存)。

2.3 地址变换机构

请求分页系统中的地址变换机构,是在分页系统地址变换机构的基础上,为实现虚拟内存又增加了某些功能而形成的,如产生和处理缺页中断,及从内存中换出一页的功能等等。
在这里插入图片描述

在这里插入图片描述

2.3 页框分配
  1. 驻留集大小
    对于分页式的虚拟内存,在进程准备执行时,不需要也不可能把一个进程的所有页都读入主存。因此,操作系统必须决定读取多少页,即决定给特定的进程分配几个页框。给一个进程分配的物理页框的集合就是这个进程的驻留集。
  2. 内分配策略
    在请求分页系统中,可采取两种内存分配策略,即固定和可变分配策略。在进行置换时,也可采取两种策略,即全局置换和局部置换。于是可组合出下面三种适用的策略:
    (1)固定分配局部置换(2)可变分配全局置换(3)可配局部置换
  3. 物理块调用算法
    采用固定分配策略时,将系统中的空闲物理块分配给各个进程,可采用下述几种算法:
    (1)平均分配算法,将系统中所有可供分配的物理块平均分配给各个进程
    (2)比例分配法,根据进程的大小按比例分配物理块。
    (3)优先权分配算法,为重要和紧的进分配较多的物理块。通常采取的方法是把所有可分配的物理块分成两部分一部分按比例分配给各个进程:一部分则根据优先权分配。
2.4页面置换算法

请求分页存储管理与基本分页存储管理的主要区别:
在程序执行过程中,当所访问的信息不在内存时,由操作系统负责将所需信息从外存调入内存,然后继续执行程序。
若内存空间不够,由操作系统负责将内存中暂时用不到的信息换出到外存。
在这里插入图片描述

  1. 最佳置换算法(OPT,Optimal):每次选择淘汰的页面将是以后永不使用,或者在最长时间内不再被访问的页面,这样可以保证最低的缺页率。
  2. 先进先出置换算法(FIFO):每次选择淘汰的页面是最早进入内存的页面。
  3. 最近最久未使用置换算法(LRU,least recently used):每次淘汰的页面是最近最久未使用的页面。实现方法:赋予每个页面对应的页表项中,用访问字段记录该页面自上次被访问以来所经历的时间t。当需要淘汰一个页面时,选择现有页面中 t 值最大的,即最近最久未使用的页面。
  4. 时钟置换算法是一种性能和开销较均衡的算法,又称CLOCK算法,或最近未用算法(NRU,NotRecently Used)。

3、 抖动和工作集

  • 刚刚换出的页面马上又要换入内存,刚刚换入的页面马上又要换出外存,这种频繁的页面调度行为称为抖动,或颠簸。产生抖动的主要原因是进程频繁访问的页面数目高于可用的物理块数(分配给进程的物理块不够)。
  • 工作集:指在某段时间间隔里,进程实际访问页面的集合。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值