存储器管理
程序的装入和链接
将一个用户源程序变为一个可在内存中执行的程序,有以下步骤:
- 编译:编译程序将用户源代码编译成若干目标模块
- 链接:链接程序将编译后的目标模块和它们所需的库函数链接成一个完整的可装入模块
- 装入:装入程序将装入模块装入内存
程序的链接
根据链接的时间,可以分为下面三种:
- 静态链接:在程序运行以前进行链接的方式
- 装入时动态链接:在装入内存时,边装入边链接的方式
- 运行时动态链接:在程序执行中需要目标模块时,才对它进行链接。
程序的装入
将一个装入模块装入内存,有绝对装入
,可重定位装入
和动态运行时装入
三种方式
- 绝对装入方式:直接将目标模块装入到内存指定的位置(具体的物理地址),只适合单道程序环境。
- 可重定位装入方式:因为装入的模块使用的是逻辑地址,与实际装入内存的物理地址不同,因此在装入时进行一次重定位(对目标程序中的指令和数据进行修改,因为装入后变换过的地址不会再次改变,因此也称作静态重定位)。
- 动态运行时装入:在程序装入内存后并不会立即把装入模块中的相对地址转换为绝对地址,而是将地址转换推迟到程序真正执行时才进行。
连续分配方式
指的是为一个用户程序分配一个连续的内存空间。连续分配方式又可以分为单一连续分配、固定分区分配、动态分区分配、动态重定位分区分配四种方式。
- 单一连续分配:内存被分为系统区和用户区,这种方式就是将用户程序直接全部分配到用户区中。只能用于单用户、单任务的操作系统中。
- 固定分区分配:将内存用户空间划分为若干固定大小的区域,每次在一个分区中只转入一道作业。不同分区的几道作业可以并发运行,这是最简单的一种多道程序的存储管理方式。
- 动态分区分配:根据进程的实际需要,动态为之分配内存空间。
这种方式需要系统配置空闲分区表或空闲分区链来描述空闲分区和已分配分区的情况。 - 可重定位分区分配:如果当前系统中只有若干小的分区,虽然它们的容量总和大于要装入的程序,但因为这些分区不相邻,无法将程序装入内存。
为了解决这个问题,动态重定位就是通过将内存中所有作业进行移动,让它们全部相邻,从而将多个小分区拼接成一个大分区。
但此时需要对程序和数据的地址进行变换,并且需要硬件的支持,即在系统中增加一个重定位寄存器,用来存放程序在内存中的起始地址。
对换
指的是把内存中暂时不能运行的进程或暂时不用的程序和数据调度到外存上,以腾出足够的内存空间,再把已具备运行条件的进程或进程所需的程序和数据调入内存。
如果对换的单位是进程,则称为“进程对换”(”整体对换“);如果对换的基本单位是“页”或“段”,则分别称为“页面对换”和“分段对换”,两者又统称为“部分对换”。