文章目录
内存管理
内存管理的功能
内存的分配与回收
地址转换
内存扩充
- 覆盖
- 交换
- 虚拟存储器
存储保护
程序的编译、链接、装入
编译
- 实体:源程序 -> 目标程序
链接
-
实体:目标程序 -> 装入模块
-
分类
- 静态链接
- 装入是动态链接
- 运行时动态链接
装入
-
实体:装入模块 -> 内存
-
分类
- 绝对装入
- 静态重定位
- 动态重定位
覆盖与交换
覆盖
- 操作:由程序员将程序划分为 【主程序段+覆盖区】,覆盖区的程序可以相互替换
- 缺点:对用户不透明
交换
- 操作:将外存划分为 【交换区+文件区】,当内存不足的时候,将部分作业调入到 交换区
连续分区分配管理
单一分区分配
- 操作:将内存划分为 系统区+用户区
- 特点:只允许单作业单用户
- 存在内部碎片
固定分区分配
-
操作:将系统划分为多个固定分区
-
数据结构:分区分配表
-
表的字段
- 分区大小
- 是否已分配
- …
-
-
分类
- 分区大小固定
- 分区大小不固定
-
静态重定位
动态分区分配
-
操作:在进程/作业进入时,进行动态装入
-
数据结构
- 分区分配表
- 空闲分区链
-
分区分配算法
- 顺序
- 最近算法
- 最佳适应算法
- 最差适应算法
-
拼接技术
- 操作:当新来的进程/作业需要装入,但是找不到比它的size大的空闲分区的时候,尝试对内存中的空闲分区进行合并
- 缺点:耗时,浪费资源
- 带拼接技术的动态分区分配技术也称为“可重定位动态分区分配”
页面分配策略
驻留集
- 请求分页管理分配给进程的物理块集合
页面分配策略
-
固定分配
- 进程运行过过程中,驻留集大小不变
-
可变分配
- 进程运行过过程中,驻留集大小可变
-
局部置换
- 发生缺页时,只能使用进程内部的物理块进行置换
-
全局置换
- 发生缺页时,系统可以分配空闲物理块给进程,也可以从其他进程中取出物理块给缺页进程
-
固定分配局部置换
-
可变分配全局置换
- 只要发生缺页,就分配新的物理块
-
可变分配局部置换
- 根据发生缺页的频率,动态地增加或减少进程的物理块
页面调入策略
- 预调页
- 请求调页
从何处调入页面
-
系统拥有足够的交换区空间
-
系统缺少交换区空间
- 不会被修改的文件从文件区调入,会被修改的文件调到对换区
-
UNIX方式
- 第一次从文件区调入,后面都从对换区调入
工作集
- 最近 n 次内存访问过的页面的集合
抖动与缺页
Belady现象
- 说明:缺页率随着分配物理块的增加而增加的现象
- 原因:被置换的页面是进程会访问到的页面
- FIFO 会存在这种现象
抖动
-
系统把时间耗费在了页面的换入和换出上了
-
解决
- 增大内存空间
- 改变页面置换算法
缺页率
非连续分区分配管理
基本分页存储管理
-
基本概念
-
页
-
目标程序的一个分区
-
页的大小
- 页面过大
- 页面过小
-
-
页框、页帧、物理块
- 内存的一个分区
-
-
逻辑地址结构
-
逻辑地址分为【页号+页内偏移】
-
由逻辑地址可以得到
- 页号的最大值
- 页面的大小
-
-
页表
-
页表项
- 页号
- 物理地址
-
-
地址转换
- 第一步:根据逻辑地址计算出页号 S 和页内偏移W
- 第二步:根据基址寄存器取出页表基址,并检查页号是否合法,若不合法则产生中断
- 第三步:页表基址+页表大小*页号,根据这个地址从页表中查出对应的块号
- 第四步:块号*页大小+页内偏移
-
快表TLB
- 依据局部性原理(时间局部性&空间局部性)
- 作用:相当于一个小页表,存储最近查询过的页表的项及其对应的物理地址,当要进行地址转换的时候,会先查快表
- 缺点:需要硬件支持
-
两级页表、多级页表
-
逻辑地址结构
- 外层页表地址
- 页内地址
- 页内偏移
-
页表结构(二级页表为例)
-
外层页表
-
页表项
- 页号
- 内层页表所在的物理地址
-
-
内层页表
-
页表项
- 页号
- 物理地址
-
-
-
-
存储保护
- 缺点:不利于页面共享
-
碎片
- 会产生内部碎片
基本分段存储管理
-
段的概念
- 程序员根据程序逻辑将目标程序划分成多个块
-
逻辑地址结构
- 段号
- 段大小
- 段内偏移
-
段表
-
段表项
- 段号
- 段大小
- 物理地址
-
-
地址转换
- 第一步:根据逻辑地址得到【段号、段大小和段内偏移】
- 第二步:从基址寄存器中查出段表的基址及段表的长度
- 第三步:检查段号是否小于段长,否则产生中断;检查段内偏移是否小于段大小,否侧产生中断;
- 第四步:根据段号从段表中查出物理块的物理地址
- 第五步:物理地址+段内偏移
-
存储保护
-
段共享
- 概念:多个段表对应的段表项指向共享的段
-
纯代码、可重入代码
- 概念:除临界区以外的代码,不会修改的代码
-
基本段页式存储管理
-
逻辑地址结构
- 段号
- 段内页号
- 页内偏移
-
段表(不同于分段中的段表)
- 段号
- 页表长度
- 页表地址
-
页表
- 页号
- 块号
-
地址转换
- 第一步:根据逻辑地址计算【段号、段内页号、段内偏移】
- 第二步:检查段号是否小于段长,否则产生中断
- 第三步:根据段号找到页号,判断页号是否小于页表长度,否则产生中断;访问页表,取出块号
- 第四步:块号*页大小+页内偏移
-
碎片
- 段页式的内部碎片要比基本页式的内部碎片要多
补充
-
地址空间的维数
- 基本分页的逻辑地址的地址空间是一维的
- 基本分段和段页式的地址空间都是二维的
- 解释:基本分页的逻辑地址只需要知道“页内偏移”即可得到物理地址,因为页号的系统自动分配的;而基本分段的段号是人为给定的,所以需要知道“段号”+“段内偏移”才能从逻辑地址得到物理地址
-
页表、段表的数量
- 一个进程/作业对应一张页表/段表
虚拟存储器
引入
-
解决问题
- 基本分页、基本分段存储管理具有一次性和驻留性,即作业需要一次性装入内存,并且长期驻留在内存中
-
局部性原理
-
时间局部性
- 当前执行的指令,在短时间内很可能再次执行
-
空间局部性
- 当前访问的存储单元,在短时间内很可能再次访问
-
-
特征
- 离散型
- 多次性
- 交换性
- 虚拟性
请求分页存储管理
-
操作
- 请求分页=基本分页+请求页面+页面置换
-
页表
- 页号
- 物理块号
- 访问位
- 修改位
- 状态位
- 外存地址
-
缺页中断
-
产生
- 当请求分页时,内存中不存在请求的页面,则产生缺页中断
-
与其他中断的区别
- 在指令执行期间产生和处理中断信号
- 一条指令可以产生多个缺页中断
-
-
页面置换算法
-
最佳置换OPT
- 换出以后再也不用或最迟再被使用的页面
-
先进先出FIFO
- 换出最先进入内存的页面
-
最近最久未用LRU
- 换出在内存中停留最久的页面
-
时钟置换算法CLOCK
-
具体步骤
-
不缺页
- 对应的页面的访问位置为 1
- 指针位置不变
-
缺页
-
循环遍历链表
- 指针指向的页面访问位为0,则换页,换页后对应的访问位置为 1;指针指向下一个页面
- 指针指向的页面访问位为 1,则将其访问位置为 0;指针指向下一个页面
-
-
-
-
改进型时钟置换算法
-
概念
- 每个页面对应一个二元组(a, b),a 为访问位,b 为修改位
-
具体步骤
-
不缺页
- 对应的页面元组置为(0,0)
-
缺页
-
三步
-
- 遍历链表,找出二元组为 (0, 0) 的页面
-
- 遍历链表,找出二元组为 (0, 1) 的页面,并将遍历过的页面的二元组的访问位置为 0
-
- 如果上述两步未找到需要置换的页面,则重复步骤1、2
-
-
-
-
-
内部碎片与外部碎片
内部碎片
已经分配给进程,装入之后剩下的
外部碎片
未分配给进程,但是由于空闲分区太小而装不下的