1准备工作
1.1存储器结构
1.2进程运行原理
用户程序→进程
- 编译
- 链接
程序的链接
- 静态链接:程序一开始运行前一次性将所有东西打包给装入模块进行装入
- 装入时链接:一边装入一边链接
- 运行时动态链接:程序在内存中运行时发现缺了什么再给装入模块装入
- 装入
程序的装入
绝对装入(由程序员自行指定位置)- 可重定位装入
- 动态运行时装入
两个细节
- 逻辑地址与物理地址
- 内存保护:目的是在装入当前程序的过程中保护对应的内存地址不受其他进程的影响,可通过记录两个物理地址或一个小的物理地址+一个大的逻辑地址来实现,在此范围内OK,否则即越界,不可操作
内存扩充的两个方式:
- 覆盖
- 交换
2内存管理方式
2.1连续分配管理方式
2.1.1单一连续分配
优点:
- 实现简单
- 无外部碎片
- 不一定需要内存保护
缺点:
- 只能用于单用户、单任务OS
- 有内部碎片
- 存储器利用率低
2.1.2固定分区分配
在整个用户空间划分为若干个固定大小的区域,在每个分区中只装入一道作业
分区说明表:为便于内存分配,通常将分区按大小进行排队,建立分区使用表,包含各分区的起始地址、大小及状态(是否已分配)
优点:
- 实现简单
- 无外部碎片
缺点:
- 较大用户程序时,需要采用覆盖技术,降低了性能
- 会产生内部碎片,利用率低
2.1.3动态分区分配
根据进程需要建立分区,动态分配内存空间
基于顺序搜索的动态分区算法:
- 首次适应算法(first fit, FF):从低地址查找合适空间
- 循坏首次适应算法(next fit, NF):从上次查找处向后查找
- 最佳适应算法(best fit, BF):优先使用最小空闲空间
- 最坏适应算法(worst fit, WF):优先使用最大连续空间
算法 | 算法思想 | 分区排序 | 优缺点 |
FF | 从低地址查找合适空间 | 地址递增排列 | 综合性能最好,开销小; 不需要对空闲分区重排序 |
BF | 优先使用最小空闲空间 | 容量递增 | 更容易满足大进程需求; 小碎片多,开销大,需要重新排序 |
WF | 优先使用最大连续空间 | 容量递增 | 小碎片少; 不利于大进程,开销大 |
NF | 从上次查找处向后查找 | 地址递增排列 (循环链表) | 不用每次从链表头查找,开销小; 会使高地址大分区被用完 |
2.2非连续分配管理方式
- 分页存储管理
将用户程序的地址空间分为若干个固定大小的区域,称为“页”或“页面”,将内存空间分为若干个物理块或页框,页和块的大小相同
【可以理解为将物理地址按照固定大小进行划分】
基本地址变换机构:
页式管理中地址空间是一维的,每次方寸都需要地址变换,必须足够快,页表不能太大,会降低内存利用率
具有快表的地址变换机构:【缓冲思想:高速缓冲区】
直接将页号与快表页号比较,匹配成功则取块号+偏移量形成地址,匹配失败,访问主存页表,并同步到快表(局部性原理),命中率不为100%
两级页表
- 将逻辑地址拆分成三部分
- 从PCB中读取页目录表始址
- 根据一级页号查出耳机页表位置
- 根据二级页号查内存块号,加偏移量计算物理地址
- 分段存储管理
将用户程序的地址空间分为若干个大小不同的段,每段可定义一组相对完整的信息,在存储分配时,以段为单位,这些段在内存中可以不相邻接
【可以理解为将用户进程的地址空间进行划分,大小不固定】
分页与分段方式对比:
- 页→物理单位
- 段→逻辑单位
- 分页→一位地址空间
- 分段→二维地址空间
- 分段更容易信息共享和保护(逻辑地址,程序员更容易按照自己逻辑来实现)
段表虽是二维,但占用空间很小小,一般直接存放在寄存器中——段表寄存器
而页表大部分放在内存中,少部分放在页表寄存器中
分页颗粒度小,分段颗粒度大一些
- 段页式存储管理
管理方式:
- 先分段,再分页
- 一个进程→一个段表
- 一个段表项→一个页表
- 一个页表→多个物理块
1个段可能会占用多个页,段表项:
字段【段号】、【页表长度】、【页表存放块号】
段号标记是进程中的哪一个段,所需的页面长度是多少,对应的页表存放块号是几,根据该块号访问物理地址
段页式系统中,为获取一条指令或数据,需要访问3次内存:
- 第一次:访问内存中的段表,取得页表地址
- 第二次:访问内存中的页表,取得该页所在的午理块号,将块号与页内地址形成物理地址
- 第三次:根据i得如此所得的地址,取出指令或数据
缺点:方寸次数增加两倍
解决方法:增设高速缓冲寄存器
地址变换过程: