1、内存管理的基本原理和要求
1)内存管理的定义
操作系统对内存的划分和动态分配就是内存管理的概念。
2)内存管理的功能
(1)内存空间的分配和回收:由操作系统完成对主存的分配和回收,对编程人员透明。
(2)地址转换:使逻辑地址转换为真实的物理地址。
(3)内存空间的扩充:利用虚拟存储技术或自动覆盖技术,从逻辑上 扩充内存。
(4)存储保护:保证各道作业在各自的存储空间内运行,互不干扰。
3)程序的装入和链接
创建进程首先要将程序和数据装入内存,将用户源程序变为可在内存中执行的程序。
(1)步骤描述:
编译:由编译程序将用户源代码编译为若干目标模块。
链接:由链接程序将编译后的一组目标模块和所需的库函数链接在一起,形成一个完整的装入模块。
装入:由装入程序将装入模块装入内存运行。
(2)程序链接的方式
静态链接:在程序运行之前,先将各目标模块及他们所需的库函数链接成一个可执行程序,此后不再拆开。
装入时动态链接:编译后所得的一组目标模块在装入时,边装入边链接。
运行时动态链接:对某些目标模块的链接,是在程序执行中需要该目标模块时才进行的。便于修改和更新以及实现对目标模块的共享。
(3)装入内存的方式
绝对装入:在编译时即知道程序将装入的内存的具体地址,则编译程序将产生绝对地址的目标代码。而后将程序和数据装入内存,只适用于单道程序环境。
可重定位装入:在多道程序环境中,多个目标模块的起始地址均为0开始。装入内存时,通过所分配的内存起始地址加上程序内的相对地址进行地址的动态变换,一次完成,又称为静态重定位。(必须一次性全部装入,运行期间不能动态扩充和移动)。
动态运行时装入:装入模块装入内存后并不立即进行地址转换,而是等到程序执行时才进行。需要重定位寄存器的支持(可以将程序分到不连续的存储区中,程序运行前只需要装入部分代码,运行期间根据需要动态分配内存,便于程序段的共享,可以向用户提供一个比存储空间大得多的地址空间)。
(4)逻辑地址空间与物理地址空间
逻辑地址空间:程序编译后的每个模块都是以0开始编址,称为目标模块的逻辑地址。当链接为一个完整的可执行目标程序时,链接程序将按顺序以0开始编址,构造统一的逻辑地址空间。
物理地址空间:内存中物理单元的集合,是地址转换的最终地址,当装入程序将可执行代码装入内存中时,必须将逻辑地址转化为物理地址。
(5)内存保护
内存分配前,需要保护操作系统不受用户进程的影响,同时保护用户进程不受其他用户进程的影响。
内存保护的两种方式:
a.在CPU中设立一对上、下限寄存器,存放用户作业在主存中的上下限地址,每当CPU要访问一个地址时,先根据这对上下限寄存器判断是否越界访问。
b.采用重定位寄存器和限长寄存器来实现这种保护。重定位寄存器保存最小的物理地址,限长寄存器保存逻辑地址的最大值。(注意:一个是最小的物理地址,一个是逻辑地址最大值)进行内存访问时,先判断逻辑地址是否大于限长寄存器值,若未越界,则加上重定位寄存器的值映射成物理地址,再进行内存访问。
2、覆盖与交换
覆盖与交换技术是在多道程序环境扩充内存的两种方法。
1)覆盖
早期系统主存小,仅存放一道用户程序,但存储空间放不下用户进程也时有发生,这一问题可以通过覆盖技术解决。
==覆盖技术的思想:==将程序分为多个段(多个模块)。常用的段常驻内存,不常用的段在需要时调入内存。
把内存划分为一个固定区和若干个覆盖区,固定区存放用户程序经常活跃的部分,调入后就不再调出(除非运行结束),其余部分按调用关系分段,将即将访问的段放在覆盖区,需要用到时调入内存,用不到时调出内存。其他放在外存,在需要调用前,系统将其调入覆盖区,替换原有的段。
必须由程序员声明覆盖结构,操作系统完成自动覆盖。
缺点:对用户不透明,增加了用户编程负担,覆盖技术只用于早期的操作系统中。
2)交换
基本思想:把处于等待状态的进程或者被CPU剥夺运行权限的进程从内存移除到辅存,这一过程称为换出;把准备好竞争CPU的进程从辅存移到内存,这一过程称为换入。
暂时换出外存等待的进程状态为挂起状态(挂起态)。
挂起态又可以进一步细分为就绪挂起、阻塞挂起两种状态。
(1)具有兑换功能的操作系统中,通常把磁盘空间分为文件区和对换区两部分,文件区主要用于存放文件,主要追求存储空间的利用率,因此对文件区空间的管理采用离散分配方式;
离散分配方式:
1、分页存储管理方式
2、 分段存储管理方式
3、段页式存储管理方式
对换区空间只占磁盘空间的小部分,被换出的进程数据就存放在对换区,由于对换的速度直接影响到系统的整体速度,因此对换区空间的管理主要是求换入换出速度,因此通常对换区采用连续分配方式。总之,对接I/O速度比文件区的更快。
连续分配方式:
单一连续分配
固定分区分配
动态分区分配
动态可重定位分区分配
(2)交换通常在许多进程运行且内存吃紧时运行,而系统负有降低就暂停。例如:在发现许多进程运行时进程发生缺页,就说明内存紧张,此时可以换出一些进程,如果缺页明显下降,就可以暂停换出。
(3)可优先换出阻塞进程:可换出优先级低的进程;为了防止优先级低的进程在被调入内存后很快又被换出,有的系统还会考虑进程在内存的驻留时间。
(注意,PCB会常驻内存,不会被换出外存)