内存管理
2021-04-03 19:57:09 1 举报
AI智能生成
计算机操作系统内存管理思维导图,可供计算机考研初试复试等使用,排版格式方便打印背诵。
作者其他创作
大纲/内容
内存管理
概念
对内存的划分和分配回收就是内存管理
功能
内存空间的分配和回收
连续分配
单一连续分配
整个内存空间 = 系统区 + 用户区
只适合单道程序
无外部碎片,有内部碎片
固定分区分配
固定:分区的大小固定不变
分区大小相等
适合一台计算机控制多个相同设备的场景
分区大小不等
动态分区分配
分区的大小和数目可变
无内部碎片,有外部碎片
紧凑技术解决外部碎片
分配算法
First Fit首次适应
最简单、最好、最快
容易在头部产生无法利用的小碎块,每次查询都要经过这些小碎块,损耗性能
Best Fit最好适应
留下很多难以利用的小碎块
Worst Fit最坏适应
最不容易产生无法利用的小碎块,可能导致内存没有可用的大分区
Next Fit循环首次适应临近适应
通常在空闲区的末尾分配空间,导致末尾出现很多无法利用的小碎块,而头部的内存因为使用完毕被回收,所以头部出现大分区
非连续分配
基本分页
内存空间等长划分为页
进程的逻辑地址也划分为同样大小的页
也算是分区大小相等的固定分区分配
但是页更小
没有外部碎片,每个进程只有最后一页可能有内部碎片
平均每个进程半页碎片
从计算机的角度考虑,提升内存利用率
基本分段
各个段的长度不定
逻辑地址是二维地址(段号,段内地址)
也算是动态分区分配
从用户的角度考虑,按照逻辑划分,便于共享和保护
没有内部碎片,可能有外部碎片
基本段页
分段和分页结合
既便于共享和保护,也便于管理,提高了内存利用率
逻辑地址是二维地址(段号,段号偏移)
段内偏移中后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 条评论
回复 删除
下一页