内存管理
计算机在内存中存放数据,程序在被执行前要线放到内存中才能被CPU处理。操作系统作为系统资源的管理者,要对内存进行管理。操作系系统要负责一下几个方面的内存管理:
- 地址转换
- 内存空间的扩展
- 内存空间的分配与回收
- 内存保护
1.地址转换的实现
操作系统要提供地址转换的功能,负责可执行程序的逻辑地址与物理地址的转换。其中涉及到内存装入方式和模块链接方式。
内存装入方式
程序执行过程如下(考虑C语言):首先源代码(.c文件)经过预处理,然后在编译器编译后生成汇编代码(.s文件,由汇编语言构成),接着通过汇编器将汇编代码翻译成机器码文件(.o文件),汇编后得到的文件即为二进制文件,然后通过链接器链接,最后得到可执行文件(.out)。但是此时指令中的地址还没有确定下来,因为此时指令中的地址为逻辑地址,而最后执行时需要的是在内存中的真实地址(即物理地址),考虑内存装入时的方式,可以分为3类:
-
绝对装入
如果在编译时能够确定程序最终会装在内存中的哪个位置,则编译程序会生成带绝对地址(物理地址)的目标代码,此时装入程序按照装入模块中的地址将程序和数据装入内存。绝对装入仅适用于单道程序环境,因此基本不使用。
-
静态重定位/可重定位装入
在装入可执行文件时,根据装入时内存的当前情况,将装入模块装入到内存的合适位置,同时装入时对地址进行重定位,将逻辑地址转换为物理地址。静态重定位的缺点时一个作业装入内存时必须分配其需要的所有内存空间,且作业一旦装入内存在运行期间无法移动位置。
-
动态重定位/动态运行时装入
装入程序在将模块装入内存后不会立马执行地址转换,而是将该过程推迟到程序真正要执行时才进行,因此装入到内存时的所有地址均为逻辑地址,在运行时才实行地址转换,这个过程需要一个重定义寄存器。因此采用动态重定位运行程序在内存中移动,在程序运行前只需装入部分代码即可,在程序运行期间能够继续申请内存,因此十分灵活。这是现代操作系统的装入方式。
链接方式
-
静态链接
静态链接是在程序运行之前,将各个目标模块链接在一起成一个完整的可执行模块(装入模块),之后不在拆分。

-
装入时动态链接
装入时动态链接是将目标模块装入内存时一边链接一边装入的链接方式。

-
运行时动态链接
运行时动态链接时在程序执行时发现需要当前模块,于是才对当前模块进行连接,可以和动态重定位结合使用。利用运行时动态链接可以很方便地实现修改和更新,便于实现对目标模块的更新。

2.内存空间的扩展
内存空间的扩展实际上主要通过通过虚拟内存、覆盖和交换实现的,通过虚拟内存能将物理空间扩展为逻辑空间。
覆盖技术
将内存分为一个固定区和若干个覆盖区。固定区中放入常驻内存的段,调入后不再调出;在覆盖区中放入不常用的段,需要时调入内存,不用时调出内存。
交换技术
在内存空间不足时,系统会将内存中某些进程暂时换出到外存,将外存中某些已经具备运行条件的进程换入到内存,即中期调度(内存调度):决定将哪个处于挂起状态的进程重新调回到内存中,是内存与磁盘之间的调度。
在具有对换功能的操作系统中,通常将磁盘分为文件区和对换区。文件区采用离散分配,追求存储空间利用率;对换区占磁盘的小部分,被换出的进程存放在对换区,主要追求换入换出速率,因此I/O速度大于文件区。
虚拟内存
虚拟内存详情可见虚拟内存管理。
3.内存空间的分配与回收
操作系统需要实现对内存空间的管理和分配,分配内存时要考虑连续分配和非连续分配等问题。内存分配详见内存空间的分配
4.内存保护机制
操作系统需要提供内存保护功能,保证各个进程在各自的内存空间中运行,不相互干扰。可以通过以下两种方法实现:
-
在CPU中设置一对上、下限寄存器,用来存放进程的上、下限地址,若进程中的指令要访问地址,则利用寄存器检查是否越界。
-
采用重定位寄存器/基址寄存器和界地址寄存器/限长寄存器进行越界检查。在重定位寄存器中存放进程的起始物理地址(即在内存中的真实地址),在界地址寄存器中存放进程的最大逻辑地址。 例如假设进程的逻辑地址空间为0 ~ 150,装入是的起始物理地址为100,则实际物理地址空间为0+100 ~ 150+100 = 100 ~ 250

浙公网安备 33010602011771号