内存管理
2021-04-03 19:57:09 1 举报
AI智能生成
计算机操作系统内存管理思维导图,可供计算机考研初试复试等使用,排版格式方便打印背诵。
作者其他创作
大纲/内容
概念
对内存的划分和分配回收就是内存管理
功能
内存空间的分配和回收
连续分配
单一连续分配
整个内存空间 = 系统区 + 用户区
只适合单道程序
无外部碎片,有内部碎片
固定分区分配
固定:分区的大小固定不变
分区大小相等
适合一台计算机控制多个相同设备的场景
分区大小不等
无外部碎片,有内部碎片
动态分区分配
分区的大小和数目可变
无内部碎片,有外部碎片
紧凑技术解决外部碎片
分配算法
First Fit
首次适应
首次适应
最简单、最好、最快
容易在头部产生无法利用的小碎块,每次查询都要经过这些小碎块,损耗性能
Best Fit
最好适应
最好适应
留下很多难以利用的小碎块
Worst Fit
最坏适应
最坏适应
最不容易产生无法利用的小碎块,可能导致内存没有可用的大分区
Next Fit
循环首次适应
临近适应
循环首次适应
临近适应
通常在空闲区的末尾分配空间,导致末尾出现很多无法利用的小碎块,
而头部的内存因为使用完毕被回收,所以头部出现大分区
而头部的内存因为使用完毕被回收,所以头部出现大分区
非连续分配
基本分页
内存空间等长划分为页
进程的逻辑地址也划分为同样大小的页
也算是分区大小相等的固定分区分配
但是页更小
没有外部碎片,每个进程只有最后一页可能有内部碎片
平均每个进程半页碎片
从计算机的角度考虑,提升内存利用率
基本分段
各个段的长度不定
逻辑地址是二维地址(段号,段内地址)
也算是动态分区分配
从用户的角度考虑,按照逻辑划分,便于共享和保护
没有内部碎片,可能有外部碎片
基本段页
分段和分页结合
既便于共享和保护,也便于管理,提高了内存利用率
逻辑地址是二维地址(段号,段号偏移)
段内偏移中后12位为页内偏移
一个进程,段表只有一个,页表可以有多个
可能有外部碎片,每个段只有最后一页可能有内部碎片
地址转换
分页
检查页号是否>=页表长度,然后在页表中找出页号对应的物理块号,物理地址=物理块号*2^12 + 页内偏移
分段
检查段号是否>=段表长度,然后再段表中找到对应的段表项,检查 段内偏移是否 >= 段长,然后得
到段号对应的段基址,物理地址=段基址 + 段内偏移
到段号对应的段基址,物理地址=段基址 + 段内偏移
段页
检查段号是否 >= 段表长度,然后再段表中找出对应的段表项,找到页表长度,检查页号是否大于页表长度
从页表中找出页号对应的块号,物理地址 = 块号*2^12 + 页内偏移
从页表中找出页号对应的块号,物理地址 = 块号*2^12 + 页内偏移
存储保护
各个进程在各自的内存空间上运行,互不干扰
两种方法
cpu内设上、下限寄存器
cpu内设基址寄存器、界地址寄存器
页/段 起始地址,页/段 表长度
内存空间扩充
覆盖
用户区 = 固定区 + n*覆盖区
缺点
当同时运行的代码量大于内存时,还是不能运行
对程序员不透明,编程时申明覆盖区
申明的覆盖区如果大于内存中的覆盖区,仍不能运行
但交换可以
交换
换出不运行的进程,换入要运行的进程
虚存技术从逻辑上扩充
原理
局部性原理 + 交换
种类
请求分页
请求分段
请求段页
页面置换算法
OPT
换出以后最不会用的
理想算法
因为运行中无法知道之后会用哪些页,很难实现
FIFO
可能有belady异常
驻留集大的置换次数反而多
LRU
局部性原理
用过去近似将来
换出最近最久未用过的
实现较难,一般不用
CLOCK
实现简单,性能接近LRU
增设访问位
改进CLOCK
空间换时间,性能更好
增设修改位
+TLB+cache
TLB
存放最常用的页表项
cache
存放最常用的页
覆盖是单个进程内部,交换时不同进程之间
程序执行过程
编译
将高级语言代码转换为汇编语言或者机器语言代码
源程序文件 --> 目标文件
链接
将目标文件以及调用的库函数链接成完整的装入模块
各个目标文件独立的逻辑地址 --> 统一的逻辑地址
分类
静态链接
在装入之前连接成完整的装入模块
装入时动态链接
一边装入一边链接
”动态组装“
运行时动态链接
运行过程中将需要的模块链接并装入
装入
将装入模块装入内存
分类
绝对装入
在编译时就知道最终的物理地址
物理地址==逻辑地址
显然是单道程序,直接从0开始就行
可重定位装入
又称静态重定位
逻辑地址从0开始,物理地址假设从x开始,物理地址 = 逻辑地址+x,将所有逻辑地址都换成物理地址
动态运行时装入
逻辑地址从0开始,物理地址从 重定位寄存器存的值x 开始,物理地址 = 逻辑地址 + x,寻址的时候动态转换,程序中还是逻辑地址
x可以动态变化
0 条评论
下一页