# 内存管理

知识结构

  • 内存管理概念
    • 内存管理的概念;交换与覆盖;连续内存分配管理方式
    • 非连续内存分配管理方式;分页管理方式;分段管理方式;段页式管理方式
  • 虚拟内存攻略
    • 虚拟内存的概念;请求分页管理方式;页面置换算法
    • 页面分配策略;工作集;抖动

# 3.1 内存管理概念

# 3.1.1 内存管理的基本原理和要求

虽然计算机硬件一直在飞速发展,内存容量也在不断增长,但仍不可能将所有用户进程和系统所需要的资源全部放入主村,因此操作系统必须对内存空间进行合理的划分和有效的动态分配。

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

内存管理的功能有:

  • 内存空间的分配和回收。由操作系统完成内存分配,提高编程效率
  • 地址转换。逻辑地址转换称为相应的物理地址
  • 内存空间的扩充。利用虚拟存储技术或自动覆盖,从逻辑上扩充内存。
  • 存储保护。保证各道作业在各自的存储空间内运行,互不干扰

程序运行的基本原理和要求

  1. 程序装入和链接

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

  • 编译。由编译程序将用户的源代码编译成若干目标模块
  • 链接。由链接程序将目标模块和所需的库函数链接在一起,形成一个完整的装入模块
  • 装入。由装入程序装入内存运行
  1. 逻辑地址空间与物理地址空间

编译后,每个目标模块都从 0 号单元开始编址,这称为该目标模块的的相对地址。当链接程序将各个模块连接成一个完整的可执行目标程序时,链接程序按顺序按各个模块的相对地址构成统一的从 0 号单元开始编址的逻辑地址空间。

不同进程可以有相同的逻辑地址,因为这些相同的逻辑地址可以映射到主存的不同位置。

物理地址空间是指内存中物理单元的集合,它是地址转换的最终地址,进程在运行时执行指令和访问数据,最后都要通过物理地址从主存中存取。

当装入程序将可执行指令装入内存时,必须通过地址转换将逻辑地址转化为物理地址,这个过程称为地址重定位。

  1. 内存保护

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

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

  • 在 CPU 种设置一堆上下限寄存器,存放用户作业在主存中的上限和下限地址,每当 CPU 要访问一个地址时,分别和两个寄存器的值相比,判断有无越界。
  • 采用重定位寄存器和界地址寄存器来实现这种保护。重定位寄存器包含最小的物理地址值,界地址寄存器含逻辑地址的最大值。逻辑地址未超过界地址寄存器中的值,则加上冲 i 党委寄存器的值后映射成物理地址,再送交内存单元。

# 3.1.2 覆盖和交换

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

  1. 覆盖

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

覆盖的基本思想如下:由于程序运行时并非任何时候都要访问程序及数据的各个部分,因此可以把用户用剑分为一个固定区和若干个覆盖区。将经常活跃的部分防在固定区,其余部分按调用关系分段。

  1. 交换

交换的基本思想是,把处于等待状态的程序从内存移到辅存,把空间腾出来,这一过程又称换出;把准备好竞争 CPU 运行的程序从辅存移到内存,这一过程又称换入。

交换技术主要在不同进程之间进行,而覆盖则用于同一个程序或进程中。

由于覆盖要求该处得程序之间得覆盖结构,使得其对用户和程序员不透明,所以对于主存无法存放用户程序得矛盾,现代擦做系统是通过虚拟内存技术来解决得,覆盖技术则已成为历史。

# 3.1.3 连续分配管理方式

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

  1. 单一连续分配
  2. 固定分区分配
  3. 动态分区分配

# 3.1.4 非连续分配管理方式

非连续分配允许一个程序分散地装入不相邻的内存分区。

设想这样一种情况,我们有一个需要 1G 空间的作业,内存中也有超过 1GB 的空间,但没有连续的 1GB 空间,如果采用连续分配管理方式,此时这个作业是没法运行的。但若采用非连续分配管理方式,则作业所要求的内存空间可以分散在内存中的各个区域,当然这些分散的区域也需要额外的空间来存储它们的索引,这样作业就可以运行了。

非连续分配方式根据分区的大小是否固定,分为分页存储管理方式和分段存储管理方式。

分页

在分页存储管理方式中,又根据运行作业时是否要把作业的所有页面都装入内存才能运行,分为基本分页存储管理方式和请求分页存储管理方式。

分段

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

段页式

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

# 3.2 虚拟内存管理

# 3.2.1 虚拟内存的基本概念

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

之前讨论的内存管理策略都是为了同时把多个进程保存在内存中,它们都具有以下两个共同的特征;

  • 一次性。作业必须一次性全部装入内存
  • 驻留性。作业被装入内存后,就一直驻留在内存中
  1. 局部性原理

要理解虚拟内存技术的思想,首先需要了解著名的局部性原理。快表,页高速缓存及虚拟内存技术从广义上讲,都属于高速缓存技术。这个技术所依赖的原理就是局部性原理。

局部性原理表现在以下两个方面

  • 时间局限性。程序中的某条指令一旦执行,不久后该指令可能再次执行,数据被访问后,可能再次被访问。一个典型的原因就是程序中存在大量的循环操作。
  • 空间局部性。一旦程序访问了某个存储单元,在不久后,其附近的存储单元也将被访问,因为指令通常是顺序存放、顺序执行的。
  1. 虚拟存储器的定义和特征

基于局部性原理,在程序装入时,将程序的一部分装入内存,而将其余部分留在外村,就可启动程序执行。在程序执行过程中,所访问的信息不在内存时,操作系统会将所需要的部分装入内存,然后继续执行程序。这样好像操作系统为用户提供了一个比实际内存大得多的存储器,称为虚拟存储器。

虚拟存储器有以下三个主要特征

  • 多次性。无需在作业运行时一次性地全部装入内存
  • 对换性。无需再作业运行时一直常驻内存
  • 虚拟性。从逻辑上扩充内存的容量
  1. 虚拟内存技术的实现

虚拟内存技术允许将一个作业分多次调入内存。采用连续分配方式时,会使相当一部分内存都处于暂时或“永久”的空闲状态,造成内存资源的严重浪费,也无法从逻辑上扩大内存,因此虚拟内存的实现需要建立在离散分配的内存管理方式上

# 3.2.2 请求分页管理方式

请求分页系统建立在基本分页系统基础之上,为了支持虚拟存储器功能而增加了请求调页功能和页面置换功能。请求分页是目前最常用的一种实现虚拟存储器的方法。

# 3.2.3 页面置换算法

进程运行时,若其访问的页面不在内存中需将其调入,但内存已无空闲空间时,就需要从内存中调出一页程序或数据,送入磁盘的对换区。

# 3.2.4 页面分配策略

  1. 驻留集大小
  2. 调入页面的时机
  3. 从何处调入页面

# 3.2.5 抖动

在页面置换过程中,一种最糟糕的情形是,刚刚换出的页面马上又要换入主存,刚刚换入的页面马上又要换出贮存,这种频繁的页面调度行为称为抖动。若一个进程在换页上用的时间多于执行时间,则这个进程就在颠簸。

# 3.2.6 工作集

工作集是指在某段时间间隔内,进程要访问的页面集合。基于局部性原理,可以用最近访问过的页面来确定工作集。

工作集模型的原理是,让操作系统跟踪每个进程的工作集,并为进程分配大于其工作集的物理块。落在工作集内的页面需要调入驻留集中,而落在工作集外的页面可从驻留集中换出。