操作系统--3. 内存管理
1 内存基础知识
1.1 存储单元
- 按字节编址的计算机,每个存储单元大小为1字节,即8个二进制位。
- 按字编址的计算机,每个存储单元大小根据计算机的位数确定。
1.2 逻辑地址 vs 物理地址
- 逻辑地址(相对地址):每个程序段的地址都是从0开始编号的地址。
- 物理地址(绝对地址):实际内存中的真实地址编号。
逻辑地址到物理地址的映射需要装入程序需要解决的问题。
装入的三种方式
- 绝对装入:在编译时,如果知道程序将放到内存中的哪个位置,编译程序将产生绝对地址的目标代码。装入程序按照装入模块中的地址,将程序和数据装入内存。
- 静态重定位:由又称可重定位装入。编译、链接后的装入模块的地址都是从0开始的,指令中使用的地址、数据存放的地址都是相对于起始地址而言的逻辑地址。可根据内存的当前情况,将装入模块装入到内存适当的位置。装入时对地址进行“重定位”,将逻辑地址转化为物理地址(地址变换是在装入时一次性完成的)
- 动态重定位:又称动态运行时装入。编译、链接后的装入模块的地址都是从0开始的。装入程序把装入模块装入内存后,并不会立即把逻辑地址转化为物理地址,而是把地址转换推迟到程序真正要执行时才进行。因此装入内存后所有的地址依然是逻辑地址,这种方式需要一个重定位寄存器的支持。
优点:
- 可将程序分配到不连续的存储区,
- 在程序运行前只需要装入他的部分代码即可投入运行,然后在程序运行期间,根据需要动态申请分配内存,
- 便于程序段的共享,可以向用户提供一个比存储空间大得多的地址空间。
链接的三种方式
-
静态链接:在程序运行之前,先将各目标模块及他们所需要的库函数连接成一个完整的可执行文件(装入模块),之后不再拆开。
-
装入时动态链接:将各目标模块装入内存时,边装入边链接的方式。
-
运行时动态链接:在程序执行中需要该目标模块时, 才对它进行链接。其优点是便于修改和更新,便于实现对目标模块的共享。
2 内存管理的概念
内存管理需要做些什么事?
- 操作系统负责 内存空间的分配与回收
- 操作系统需要提供某种技术从逻辑上 对内存空间进行扩充。
- 操作系统需要提供地址转换功能,负责程序的 逻辑地址 与 物理地址 的转换
- 操作系统需要提供 内存保护 功能。保证各进程在各自存储空间内运行,互不干扰。
- 方法一:在CPU中 设置一对上、下限寄存器 ,存放进程的上下限地址。进程的指令要访问某个地址时,CPU检查是否越界。
- 方法二:采用 重定位寄存器(又称 基址寄存器)和 界地址寄存器(又称 限长寄存器)进行越界检查。重定位寄存器中存放的是进程的 起始物理地址。界地址寄存器中存放的是进程的 最大逻辑地址。
3 覆盖和与交换
3.1 覆盖
覆盖技术:用来 解决程序大小超过物理内存总和 的问题。
基本思想:将程序分为多个段(多个模块)。常用的段常驻在内存,不常用的段在需要时调入内存。内存中分为一个“固定区”和若干个“覆盖区”。需要常驻内存的段放在“固定区”中,调入后不再调出(除非运行结束)。
缺点:程序的调用结构必须由程序员显性声明,操作系统完成自动覆盖。对用户不透明,增加了用户编程负担。覆盖技术只用于早期的操作系统中。
3.2 交换
交换技术:又称对换技术。内存空间紧张时,系统将内存中某些进程暂时换出外存,把外存中某些已具备运行条件的进程换入内存(进程在内存与磁盘间动态调度)。换出时,进程被换出到外存,对应的PCB保留在内存中并插入 挂起 队列。 进程被换出后必须要记录进程存在外存的什么位置,这个信息由PCB 保存。
挂起:被换出的进程称为挂起(suspend)态,挂起态由分为 就绪挂起,阻塞挂起。从而引入7状态模型,具体参考