内存管理
2019-01-04 13:37:43 0 举报
AI智能生成
asp.net复习
作者其他创作
大纲/内容
存储保护
保证进程在子集的内存空间内运行,不会越界访问
两种方式
设置上下限寄存器
利用重定位寄存器,界限地址寄存器
链接
静态链接
装入前链接成一个完整的逻辑地址
装入时动态链接
运行前边装入边链接
运行时动态链接
运行时需要模块时才装入
逻辑地址和物理地址
地址绑定(装入)
编译时绑定
装入时产生绝地地址
静态重定位(加载时绑定)
装入是将逻辑地址转换成物理地址
动态重定位(运行时绑定)
运行时将逻辑地址转换成物理地址
进程交换
内存空间不足时,换出一些进程,换进一些进程
3问题
内存分配
连续分配
单一连续分配
只支持单道程序,内存分为系统区和用户区,用户程序放在用户区
无外部碎片,有内部碎片
固定分区分配
两种分区方式
分区大小相等
分区大小不等
无外部碎片,有内部碎片
支持多道程序,内存用户空间分为若干个固定大小的分区,每个分区只能装一道作业
动态分区分配
支持多道程序,在晋城装入内存时,根据进程的大小动态地建立分区
无内部碎片,有外部碎片
外部碎片可用紧凑技术解决
回收内存分区时,可能遇到四中情况
回收区之后有相邻的空闲分区
会收区之前有相邻的空闲分区
会收区之前,后都有相邻的空闲分区
回收区前,后都没有相邻的空闲分区
动态分区分配算法
首次适应算法
地址从前到后,找到第一个能满足大小的分区
最佳适应算法
按照空间大小从小到大排序,找到第一个能满足大小的分区
产生很多外部碎片
最坏使用算法
每次使用最大的内存空闲分区
解决产生太多无法再使用的外部碎片
但是如果来了大进程,就没有足够大的分区
邻近适应算法
解决首次适应算法查找过多的问题
每次都从上次查找结束的位置开始查找,找到第一个满足要求的空闲分区
可能低地址区域的更适应分区没有被分配,而高地址区域的大分区被使用,导致没有大分区
非连续分配
分页
把内存分为一个个大小相等的分区,每一个分区就是一个页帧,每一个页帧都有一个编号,从零开始
为什么每个页面的大小是2的整数次幂?
页表(一个进程一个页表)
每个页表项的长度是相同的,页号是隐藏的
页表项长度计算: 假设总内存是4GB,页面大小是4KB,总共要分为2^20个内存快,所以页号的索引范围必须含阔0~2^20-1,则页表项的长度至少为3个字节,可能页表项以字节为原子单位,但是在实际中,为了使每个页面恰好装的下整个页表项,经常会让一个页表项占更多的字节,比如上面的例子,就会让每个页表项占4个字节,因为一个页面4KB,存放4字节的页表项,可以没有内碎片,计算题得3字节
页表记录进程页面和1实际存放的内存块之间的对应关系
区分 页表长度, 页表项长度, 页面大小
页内偏移量的位数即页面大小,假设位数为10,页面大小为2^10=1kB
页式管理中的地址是一维的
计算
如何实现地址转换
1:计算处逻辑地址对应的页号
2:找到对应页面在内存中的存放位置
3:算出逻辑地址对应的页内偏移量
4:物理地址=页面始址+页内偏移量
页内偏移量的计算
页号 = 逻辑地址/页面地址;页内偏移量=逻辑地址%页面大小
或逻辑地址结构计算,逻辑地址=[页号p,页内偏移量w]
具有块表的地址查询机制
分段
0 条评论
下一页