内存管理的需求:重定位、内存保护、内存共享
程序装入和链接
编译→链接→装入
-
链接方式
- 静态链接:在程序运行前将各目标模块和它们所需库函数链接成一个完整的可执行程序。
- 装入时动态链接:把编译得到的目标模块在装入内存时,边装入边链接。
- 运行时动态链接:执行该目标模块时才对它进行链接。
-
装入方式
- 绝对装入:编译程序产生绝对地址的目标代码。(单道程序环境)
- 可重定位装入:多个目标模块的起始地址通常都是从0开始,此时采用可重定位装入方式。装入时对目标程序中指令和数据的修改过程称为重定位。静态重定位:地址变换在装入时一次完成,必须分配其要求的全部内存空间。
- 动态运行时装入:执行时才进行地址转换。
内存保护
- 上下限寄存器
- 重定位寄存器(基址寄存器:存放最小物理地址)、界地址寄存器(存放逻辑地址最大值)
内存扩充
- 覆盖:一个进程不需要全部装入内存。
- 交换:不同进程在内存换入换出。
内存分配
-
连续分配管理方式
- 单一连续分配:内存分为系统区和用户区,内存中永远只有一道程序,可采用覆盖技术。
- 固定分区分配:将内存分成若干个固定大小分区,每个分区只装入一道作业。
- 动态分区分配:(可变分区分配)根据进程大小动态建立分区。
1)首次适应算法
2)最佳适应算法
3)最坏适应算法
4)邻近适应算法
-
非连续分配管理方式
由于需要额外存储索引,非连续分配方式的存储密度低于连续分配方式。
- 基本分页式存储管理:页表(页号,该页表对应的内存块号),页表寄存器(页表首址和页表长度)
- 基本分段式存储管理:段表(每个段首址,该段段长),段表寄存器(段表首址,段表长度)
- 段页式存储管理:每个进程一张段表,每个分段一张页表。段表寄存器,段表,页表。
虚拟内存管理
虚拟内存(虚拟存储器):系统提供部分调入,请求调入,置换功能,给用户以更大存储空间的感觉,虚拟存储器的大小由计算机的地址结构决定。
- 局部性原理
- 时间局部性:程序中某条指令一旦执行,不久后可能再次执行。
- 空间局部性:程序访问某个存储单元,不久后其附近单元也将被访问。
虚拟内存技术实现
建立在离散分配的内存管理方式上。
实现方式:
- 请求分页存储管理:页表(页号,物理块号,状态位P,访问字段A,修改位M,外存地址)
- 请求分段存储管理
- 请求段页式存储管理
需要的硬件支持:
- 一定容量的内存和外存
- 页表/段表机制
- 中断机构
- 地址变换机构
- 页面置换算法
- 最佳置换算法:淘汰最长时间不再被访问,无法实现的算法。
- 先进先出页面置换算法:优先淘汰最早进入内存的页面。(Balady异常:物理块数增多而页故障数反增。)
- 最近最久未使用置换算法:需要寄存器和栈的硬件支持。
- 时钟置换算法:设置使用位,修改位
- 页面分配策略
- 固定分配局部置换:为每个进程分配一定数目的物理块,在整个运行期间都不改变,置换只在自己的内存页中选择。
- 可变分配全局置换:为每个进程分配一定数目的物理块,操作系统保持一个空闲物理块队列,某进程缺页时,从中取一个分配给进程。
- 可变分配局部置换:同1,但当某进程频繁缺页或缺页率极低调整为其分配的物理块数。
- 调页时机
- 预调页策略:批量调页,成功率50%
- 请求调页策略
- 抖动(颠簸):频繁的页面调度