导图社区 内存管理
这是一篇关于内存管理的思维导图,内存管理是指软件运行时对计算机内存资源的分配和使用的技术,感兴趣可以了解下。
编辑于2022-01-13 22:17:40内存管理
1. 内存管理概念
1.1. 程序的运行过程
1.编译器将目标程序产生目标模块
2.链接程序将若干目标模块组成完整的装入模块
静态链接
装入时动态链接
运行时动态链接
3.装入程序将装入模块装入内存
绝对装入
可重定位装入(静态重定位)
动态运行时装入(动态重定位)
1.2. 内存管理的功能
内存分配、回收
连续分配
单一连续分配
固定分区分配
动态分区分配
非连续分配
分页式
基本概念
分页思想
把进程分页
把内存分块
每个页、每个块的大小相同,每个页面可以离散的存储在不同的内存块中
易混概念
内存块(内存中分为大小相同的若干块,又叫页框、物理页)
页面(把进程以块为单位划分,又叫页面)
页表
功能:记录页面和内存块之间的联系(一一对应的关系)
组成:(页号、内存块号)
1个进程对应1个页表,进程的1页对应1个页表项
页表项特点
每个页表项大小相同,只有“块1号"占内存,“页号”相当于内存块的序号,是隐含的
计算问题
i号页表项的存放地址=该页表始址+i×页表项大小
逻辑地址的结构
在计算机系统中,若逻辑地址为32位二进制数,一般的前0-11位为页内偏移量,后12-31位为页号,无需计算机计算页号和页内偏移量
逻辑地址的二进制结构:(页号,页内偏移量)
如何实现地址转换()
1.计算页号和页内偏移量(做题)
2.查找相关页表,找到对应的物理块号,从而得知该内存块始址
3.物理地址=内存块始址+页内偏移量
基本地址变换结构
页表寄存器(硬件)
存放页表始址F
存放页表长度M(用于越界检测)
地址变换过程(做题)
1.给出逻辑地址A,计算页号P、页内偏移量W
P=A/页面大小L
W=A%页面大小L
2.页号合法性检查(越界检查)判断P≤M,是则转步骤3,否则错误
3.查找页表找到P所对应的屋里块号b
第1次访问内存
存放块号b的内存区域的物理地址为=F+P×页表项长度
4.计算物理地址E=b×L+W
5.根据E访问对应内存内的数据
第2次访问内存
事迹上在计算机系统内部, 1.系统得到逻辑地址A后,直接将其转换为2进制代码,根据业内偏移量的位数,将A的二进制代码进行分割,就可以得到页号P、页内偏移量W。 2.系统只需要将b和W转换为2进制代码然后拼接既可得到E
其它小细节
页内偏移量的位数与页面大小的关系
页式管理中地址是一维的(系统只需知道A既可推算出E)
实际应用中,通常使1个页框恰好放入整数个页表项
页表一般存放在连续的内存块中
具有快表的分页管理
快表是什么
一种硬件(高速缓冲存储器/相联存储器)
如何发挥作用
在基本分页储存管理的地址变换机构中加入快表硬件
快表初始为空
在系统进行越界检查后,查找快表,若快表中没有对应表项,则查询页表,查询到所在的页表项后同时将该页表项储存到快表中,使下一次出现同样地址访问时可直接查询快表
两级(多级)页表管理方式
单级页表存在的缺点
1.所有页表必须连续存放,需要占用较大的连续储存空间
2.在一段时间内内并非所有页面都能用到,没必要让整个页表常驻内存
两级页表的概念
将当前页表再次分页,建立页表的页表(页目录表/外层页表/定级页表)
逻辑地址的结构:
两级页表逻辑地址的二进制结构:(一级页号,二级页号,页内偏移量)
地址转换过程
1.将逻辑地址进行拆分,得到两级页号、页内偏移量
2.从PCB中读取页目录表(1级页表)始址
3.判断1级页号是否越界,而后根据1级页号查询页目录表,找到该1级页号对应2级页表块在内存中的位置(2级页表始址)
多了一步查询操作
4.根据2级页号 查询该页表块内的页表项 找到2级页号对应的内存块
5.找到该内存块,读写数据
需注意的问题
多级页表中,各级页表的大小不得超过1个页面,若分两级页表不够可分多级
N级页表访问内存的次数需要N+1次(无快表的情况下)
分段式
概念
按照用户进程中的逻辑关系划分若干段,每一段都是同一类型的数据,每个段大小不一
每个段储存在一个连续的内存空间中,段与段之间可以离散存放
段表
记录逻辑段与实际上的储存位置的关系
段表项
每个段表项的大小相同
构成:【段号(隐含的),段长C【指该段表项所对应的段有多长】,段基址b(该段号所对应段在内存中的始址)】
段表寄存器
存放段表始址F
存放段表长度M【指段表有多长】(用于越界监测)
用于计算当前段号所在的段表在内存中的位置
地址转换过程
第4步检查段内地址是否越界是因为段的大小是不一样的,可能存在月结的情况
分页与分段的对比
分页对用户不可见,又系统自动进行,分段对用户可见
分页的地址空间是1维的,分段是2维的
分段更容易实现信息共享和保护
单级分页和分段都需要两次访存
都可以引入快表机构
分段的地址转换中有两次越界中断监测
段页式
组织方式
用户提交的作业首先被分为若干段
将每段氛围若干大小相同的页,内存空间中也是分为页框
作业的逻辑地址结构【段号,页号,页内偏移量】
每个进程建立1张段表
每个分段建立1张页表
1个进程中,段表只有1个,页表有若干个
段表项:【段号,页表长度,页表始址】
页表:【页号,块号】
段表寄存器:【段表始址,段表长度】
地址转换
由操作系统负责将逻辑地址转换为物理地址
内存扩充
自动覆盖技术
虚拟存储技术
存储保护
保证进程在自己的内存空间运行不越界访问
2种方式
1.设置上下限
2.
重定位寄存器
界地址寄存器
注意后面出现的变换机构中的流程图
2. 虚拟内存管理
2.1. 基本概念
虚拟内存的定义
程序运行前只需要装入当前要用到的一部分数据既可运行,一个进程的所有数据都是多次调入内存的
运行过程中,根据需要动态的将页面从外存调入内存(当内存有空闲时)
请求调页功能
选择内存中的某些页面进行淘汰,将新的页面调入内存运行(当内存没有空闲时)
页面置换功能
局部性原理
时间局部性
某些指令或数据有时会被频繁访问
空间局部性
在一段时间内,进程访问的内存空间可能集中在一定的范围之内
高速缓存技术支持
时间局部性通过将近期使用的指令和数据保存到高速缓存器中
空间局部性通常使用较大的高速缓存,并将预取机制集成到高速缓存控制逻辑中实现
主要特征
多次性
对换性
虚拟性(只是在逻辑上扩充内存容量)
2.2. 如何实现
实现方式
请求分页式
页表机制
页表项结构:【页号、物理块号、状态位P、访问字段A、修改位M、外存地址】
A:表示该页面在一段时间内的访问次数/已有多长时间未被访问
也是页面淘汰的条件之一,当系统在内存中找到该页时,需要修改A的值
M:该页调入内存后是否被修改过
若该页面被修改过,则如果选择淘汰该页面时,需要通过I/O操作,将最新的内容写回外存,将原来在外存中的数据进行覆盖【I/O操作会增加系统开销】
外存地址:指出改页在外存中的存放位置
P:表示页面是否已经在内存中
缺页中断机构
判断条件
若缺页则进行中断操作,将需要的页调入内存
内存满,选择淘汰页进行页面置换
内存有空间直接调入
地址变换机构
地址变换过程详见182页
请求分段式
请求段页式
页面置换算法
OPT最佳置换算法
优先淘汰最长时间内不会被用到的页面
性能好但无法实现
FIFO先进先出置换算法
优先淘汰最先进入内存的页面
实现简单,但是性能差,可能会出现Belady异常
LRU最近最久未使用置换算法
优先淘汰当前最久未被访问的页面【需要用到访问字段A,选择最长时间未访问的(A的值最大)那个】
需要寄存器和桟的支持
开销大,需要对所有页面进行排序确定淘汰页
CLOCK 时钟置换法
设置使用位,首次装入内存的或后来被访问的页面的访问位置为1
从第1个页面循环扫描,找访问位=1 的机械能淘汰,并将扫描过的页面访问位置为1,若未找到进行第2论扫描
实现简单、开销小、但是未考虑页面是否被修改过
改进的时钟置换法
设置【访问位u,使用位m】
按条件循环扫描
找u=0,m=0的进行淘汰,若没有转2
找u=0,m=1的进行淘汰,并将扫描过的页面将其u置于0,若没有转1
实在不行,找u=1,m=0的,再不行找u=1,m=1的
页面分配策略
策略
固定、可变分配
进程运行期间,其驻留集大小是否可变
局部、全局置换
缺页时是否只从该进程自己的驻留集中选择1个页面进行置换
3种组合
固定分配、局部置换
可变分配、全局置换
缺页时就给该进程所缺页面分配新的内存
分配空闲内存块
换出其它进程的未锁定的页面
可变分配、局部置换
缺页次数多的,再次给他分配内存块
缺页次数少的,回收一些内存块
时机
运行前
(首次调入,只需要重要的、常用的一部分数据,由程序员指定)预调页
运行时
请求调页
从何处调入
外存分为
文件区(速度慢)
对换区(速度快)
有足够对换空间
将所有文件都转移至对换区,以后都从对换区进行页面置换
没有足够对换空间
不会被修改的页面:放入文件区,调入后不需要再调出
会被修改页面:换出时必须存到对换区,以后都从对换区进行再次调入
UNIX方式
第1次调入的页面存放在文件区,之后换出的页面都存放在对换区
硬件支持
内存、外存
页表、段表机制
中断机构
地址变换机构
2.3. 分散概念补充
驻留集
分页式管理中:系统给进程分配的内存块的集合
工作集
一段时间内,某个进程访问页面的集合
抖动、颠簸现象
页面出现频繁换入换出的现象
原因
直接:分配给该进程的内存块数不够
主要:页面置换算法不合理
与对换区大小、进程优先级无关
注意对比,逻辑地址的分割方法相同