1. 背景
内存是现代计算机运行的中心,由很大一组字或字节组成,每个字或字节都有自己的地址。CPU通过PC的值从内存中提取指令。
1.1 基本硬件
问题:为什么CPU不能直接从磁盘中提取指令与数据?
① CPU能直接访问的存储器只有内存和处理器内的寄存器
② 执行指令以及指令的数据必须在这些可直接访问的存储器上
因此,机器语言可以用内存地址作为参数,而不能使用磁盘地址作为参数。
(1)保证访问物理内存的相对速度
高速缓存:协调速度差异的内存缓存区
(2)内存空间保护
目的: 确保操作系统不被用户进程访问,以及用户进程不被其他用户进程访问。
两种寄存器
① 基地址寄存器:含有最小合法物理内存地址
② 界限地址寄存器:含有地址访问范围
只有操作系统可以(通过特权指令)加载基地址寄存器和界限地址寄存器的值,而不允许用户程序修改它们。
实现方式:
采用基地址寄存器和界限地址寄存器的硬件地址保护,通过对用户模式下产生的每个地址与寄存器的值比较来完成的。
1.2 逻辑地址空间与物理地址空间
定义
① 逻辑地址:由CPU所生成的地址(范围为 0 → m a x 0 \to max 0→max)
② 物理地址:加载到内存地址寄存器中的地址(范围为 R → R + m a x R \to R+max R→R+max)
③ 逻辑地址空间:由程序生成的所有逻辑地址的集合
④ 物理地址空间:逻辑地址空间中所有逻辑地址相对应的物理地址
逻辑地址空间绑定到单独一套物理地址空间
用户只生成逻辑地址,且认为进程的地址空间为0到max。这些地址在使用前必须映射到物理地址。
问题:逻辑地址与物理地址相同吗?
不相同。
① 编译时和加载时的地址绑定方法产生的逻辑地址与物理地址相同
② 执行时的地址绑定产生的逻辑地址与物理地址不相同
1.3 地址绑定
(1)地址绑定的几种情况
① 编译时地址绑定
在编译时就知道进程将在内存中的驻留地址,可以直接生成 “绝对代码”
② 加载时地址绑定
在编译时不知道进程将在内存中的驻留地址,则编译器必须生成 “可重定位代码”
③ 运行时地址绑定
如果进程执行时可以从一个内存段转移到另一个内存段,则必须延迟到运行时进行地址绑定。
(2)使用重定位寄存器的动态重定位
硬件
内存管理单元MMU:在运行时完成从虚拟地址到物理地址的映射
重定位寄存器:
实现
物理地址 = 逻辑地址 + 基地址
1.4 动态链接与共享库
(1)动态链接
将链接推迟到运行时
存根:
是一小段代码,二进制镜像中对每个库程序的引用都有一个存根。
它首先检查所需子程序是否已在内存。如果不在,就将子程序装入内存。存根会用子程序地址替换自己,并开始执行子程序。下一在执行该子程序代码时,就可以直接执行。
(2)共享库
多个版本的库可以都装入内存,程序将通过版本信息确定使用那个库版本。
2. 连续内存分配
2.1 内存映射与保护
硬件支持
内存管理单元MMU:在运行时完成从虚拟地址到物理地址的映射
重定位寄存器:含有最小的物理地址值
界限地址寄存器:含有逻辑地址的范围值
保护实现
① CPU产生的每个逻辑地址都需要与寄存器进行核对。
② 每个逻辑地址必须小于界限地址寄存器,MMU动态将逻辑地址加上重定位寄存器的值后映射为物理地址。将映射后的物理地址发送给内存单元。
寄存器初始化
作为上下文切换的一部分,调度程序会初始化重定位寄存器和界限地址寄存器。
2.2 内存分配
(1)多分区方法
将内存分为固定大小的分区,每个分区只能容纳一个进程。
缺点
多道程序的程度会受分区数的限制。
(2)可变分区方法
在任意时刻有一组可用孔大小列表和输入队列,通常一组不同大小的孔分散在内存中。
① 当新进程需要内存时,操作系统为其查找足够大的孔。
② 如果孔太大,就将孔分成两块。一部分分给进程,另一部分还会给孔集合
③ 进程终止时释放内存,将内存还会给孔集合。若新孔与其他孔相邻,则合并成更大的孔。
问题:三种常见的动态分配方式的定义与比较
(3)动态存储分配的三种常用方式
① 首次适应:分配第一个足够大的孔
② 最佳适应:分配最小的足够大的孔
③ 最差适应:分配最大的孔
首次适应和最佳适应在空间方面优于最差适应。
首次适应相对于最佳适应更快。
2.3 碎片
(1)外部碎片问题
定义
当总的可用内存之和可以满足请求但不连续时,就会出现外部碎片问题。
产生原因
连续内存分配会使内存空间被分为分散的小片段
解决方法——紧缩(compaction)
移动内存内容,以便所有空闲空间合并为一整块。(分散 --> 合并)
① 仅在重定位是动态并在运行时可采用。
② 这种方案开销较大。
解决方法——分页、分段
允许进程的物理地址空间是非连续的
(2)内部碎片问题
定义
将内存以固定大小为单位分配,当分配的大小比进程需求大时,会出现内部碎片问题。
3. 分页
3.1 基本方法
(1)基本方法
将物理内存分为固定大小的块,称为帧。将逻辑内存也分为固定大小的块,称为页。
(2)硬件支持
逻辑地址
CPU产生的逻辑地址由页号(P)和页偏移(d)两部分组成
页的大小通常为2的幂。若页大小为 2 n 2^n 2