跳转至
阅读量:

3.1 内存管理概念

一、内存管理的基本原理和要求

内存管理(Memory Management)是操作系统中最重要和最复杂的内容之一。有效的内存管理在多道程序设计中非常重要,它不仅可以方便用户使用存储器、提高内存利用率,还可以通过虚拟技术从逻辑上扩充存储器。

内存管理的功能有:

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

1. 程序装入和链接

创建进程首先要将程序和数据接入内存。将用户源程序变为可在内存中执行的程序,通常需要以下几个步骤:

  • 编译:由编译程序将用户源代码编译成若干目标模块;
  • 链接:由链接程序将编译后形成的一组目标模块及所需的库函数链接在一起,形成一个完整的装入模块;
  • 装入:由装入程序将装入模块装入内存运行。

img

程序的链接有以下三种方式:

  • 静态链接:在程序运行之前,先将各目标模块及它们所需的库函数链接成一个完整的执行程序,以后不再拆开;
  • 装入时动态链接:将用户源程序编译后所得到的一组目标模块,在装入内存时,采用边装入边链接的方式;
  • 运行时动态链接:对某些目标模块的链接,是在程序中需要该目标模块时才进行的,其优点是便于修改和更新,便于实现对目标模块的共享。

内存装入模块在装入内存时,同样有三种方式:

  • 绝对装入:在编译时,若知道程序将驻留在内存的某个位置,则编译程序将产生绝对地址的目标代码。绝对装入程序按照装入模块中的地址,将程序和数据装入内存。由于程序中的逻辑地址与实际内存地址完全相同,故故不需要对程序和数据的地址进行修改;绝对装入方式只适合单道程序环境。另外程序中所用的绝对地址,可在编译或汇编时给出,也可以由程序员直接赋予。通常情况下在程序中采用的是符号地址,编译或汇编时再转换为绝对地址;

  • 可重定位装入:在多道程序环境下,多个目标模块的起始地址(简称始址)通常都从 0 开始,程序中的其他地址都是相对于始址的,此时应采用可重定位装入方式。根据内存的当前情况,将装入模块装入内存的适当位置。装入时对目标程序中指令和数据的修改过程称为重定位

  • 静态重定位的特点是:一个作业装入内存时,必须给它分配要求的全部内存空间,若没有足够的内存,则不能装入作业。一旦进入内存,整个运行期间就不能在内存中移动,也不能再申请空间;

  • 动态运行时装入(动态重定位):程序在内存中若发生移动,则需要采用动态的装入方式。装入程序把装入模块装入内存后,并不立即把装入模块中的相对地址转换为绝对地址,而是把这种地址转换推迟到程序真正需要执行的时候才执行。因此,装入内存后的所有地址均为相对地址。这种方式需要一个重定位寄存器的支持。

  • 动态重定位的特点是:可以将程序分配到不连续的存储区中中;在程序运行之前可以只装入它的部分代码即可投入运行,然后再程序运行期间,根据需要动态申请分配内存;便于程序段的共享,可以向用户提供一个比存储空间大得多的地址空间。

img

2. 逻辑地址空间于物理地址空间

编译后,每个目标模块都从 0 号单元开始编址,这称为该目标模块的相对地址(逻辑地址)。当链接程序将各个模块链接成一个完整的可执行目标程序时,链接程序顺序依次按照各个模块的相对地址构成统一的从 0 号单元开始编址的逻辑地址空间。用户程序和程序员只需要知道逻辑地址,而内存管理的具体机制则是完全透明的,只有系统编程人员才会涉及。不同进程可以拥有相同的逻辑地址,因为这些逻辑地址可以映射到主存的不同位置。

物理地址空间是指内存中物理单元的集合,它是地址转换的最终地址,进程在运行时执行指令和访问数据,最后都要通过物理地址从主存中存取。当装入程序将可执行代码装入内存时,必须通过地址转换将逻辑地址转换成物理地址,这个过程就称为地址重定位

3. 内存保护

内存分配前,需要保护操作系统不受用户进程的影响,同时保护用户进程不受其他用户进程的影响。

内存保护可采取两种方法:

  • 在 CPU 中设置一对一上、下限寄存器;存放用户作业在主存中的下限和上限地址,每当 CPU 要访问一个地址时,分别和两个寄存器的值相比较,判断有无越界;

  • 采用重定位寄存器(基址寄存器)界地址寄存器(限长寄存器)来实现这种保护。重定位寄存器含最小的物理地址值,界地址寄存器含逻辑地址的最大值。每个逻辑地址值必须小于界地址寄存器;内存管理机构动态地将逻辑地址与界地址寄存器进行比较,若未发生地址越界,则加上重定位寄存器的值后映射成物理地址,再送交内存单元。

img

二、覆盖与交换

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

1. 覆盖

早期的计算机系统中,主存容量很小,虽然主存中仅存放一道用户程序,但存储空间放不下用户进程的现象也经常发生,这一矛盾可以用覆盖技术来解决。

覆盖的基本思想如下:由于程序运行时并非任何时候都要访问程序及数据的各个部分,因此可以把用户空间分成一个固定区和若干个覆盖区。将经常活跃的部分放在固定区,其余部分按调用关系分段。首先先将那些即将要访问的段放入覆盖区,其他段放在外存中,在需要调用前,系统再将其调入覆盖区,替换覆盖区中原有的段。

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

2. 交换

交换的基本思想是:把处于等待状态的程序从内存中移到辅存中,把内存空间腾出来,这一过程又称换出。

有关交换,需要注意以下几个问题:

  • 交换需要备份存储,通常是快速磁盘。它必须足够大,并能够提供对这些内存映像的直接访问;
  • 为了有效使用 CPU,需要使每个进程的执行时间比交换时间长,而影响交换时间的主要是转移时间。转移时间与所交换的内存空间成正比;
  • 交换时间通常作为磁盘的一整块,且独立于文件系统,因此使用起来可能很快;
  • 交换通常再又许多进程运行且内存空间吃紧时开始启动,而系统负荷降低就暂停;
  • 普通的交换使用不多,但交换策略的某些变体在许多系统(如UNIX系统)中仍然发挥作用。

交换技术主要在不同进程之间进行,而覆盖主要在同一个程序或进程中。现代操作系统中,虚拟内存技术已经替代了覆盖技术;而交换技术仍然具有较强的生命力。

三、连续分配管理方式

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

1. 单一连续分配

内存在此方式下分为系统区和用户区。系统区仅供操作系统使用,通常在低地址部分;用户区是为用户提供的、除系统区之外的内存空间。这种方式无需进行内存保护。因为内存在永远只有一道程序,因此肯定不会因为访问越界而干扰其他程序。

这种方式的优点是简单、无外部碎片,可以采用覆盖技术,不需要额外的技术支持。缺点是只能用于单用户、单任务的操作系统中,有内部碎片,存储器的利用率极低。

2. 固定分区分配

评论