3.1 内存管理的基本逻辑
内存管理的功能:
- 内存空间的分配与回收:本章最重要的一点
- 在程序被调入内存时,选择从哪里被调入,就引出了外存的交换区与文件区和三种取页面方式;
- 在程序被调入内存时,选择在何时被调入,就引出了预调页和请求调页两种策略;
- 物理内存空间可以被程序连续分配(单一连续,固定分区,动态分区),也可以被非连续分配(页式,段式,段页式,衍生请求式);
- 连续分配时,内存不能完全利用,产生内、外部碎片,动态分区时还有4种分配算法
- 非连续分配时,只有内部碎片没有外部碎片,程序只在内存中分散存储一小部分代码和数据
- 进程所占内存越小并发度越高,因此确定系统给每个进程的页框数有3种策略
- 当进程访问页面不在内存时,需要的置换算法有4种
- 地址转换:逻辑地址到物理地址,主要是非连续分配的地址计算
- 内存的扩充:覆盖,交换,虚拟存储,三种
- 存储保护:设置上下限寄存器,或重定位寄存器和界地址寄存
重定位寄存器是“加” 界地址寄存器是“比”
- 内存空间的分配与回收:本章最重要的一点
程序在内存中的过程:
- 编译:将源代码变成目标模块;此处每个模块的地址都是从0开始
- 链接:将目标模块与库函数链接在一起形成完整的装入模块;此处地址合在一起才算是逻辑地址
- 静态链接:在运行前完整链接库函数,不再拆开
- 装入时动态链接:在装入时边装边链接
- 运行时动态链接:在程序执行中,需要时才链接,便于修改更新,实现目标模块的共享
- 装入:将装入模块放入内存;此处逻辑地址变成物理地址
- 绝对装入:逻辑地址等于物理地址;只适用于单道程序
- 静态重定位:装入时重定位,要求分配全部空间,进程地址不再改变
- 动态重定位:运行时重定位,空间不需要全部,也不需要连续,进程可以移动
3.2 连续分配管理方式
内部碎片:是已经被分配出去(能明确指出属于哪个进程)却不能被利用的内存空间
外部碎片:是还没有被分配出去(不属于任何进程),但由于太小了无法分配
这样就比较好理解了
3.2.1 单一连续分配
内存中只有一道程序,逻辑地址与物理地址对应,可以采用覆盖技术扩充内存容量
3.2.2 固定分区分配
内存的分区大小划定就不变,有大小相等的分区块,也有大小不等的分区块
- 缺点:程序太大,放不进任何分区,也许能用覆盖技术分段运行;程序太小,分区利用率很低
3.2.3 动态分区分配
- 概念:不预先划分内存区块,由程序的具体情况动态划分
空闲块的使用策略:
固定分区会产生内部碎片,动态分区会产生外部碎片
紧凑技术:移动程序,消除外部碎片,动态重定位的运用
3.3 非连续分配管理方式
3.3.1 基本分页存储
- 概念:程序分页,内存分块,进程由页向块映射,分配内存
- 进程中的为页,物理内存中的为页框、页帧或者物理块,外存中称块
- 页面大小指分页的大小KB,页表长度指页表项的个数
- 页表由页表项组成,每个页表项的长度是一样的,并没有页号存在,得自己算
- 地址转换:
- 页号与PCB中的页表长度比较,判断是否越界
- 页号是页表始址和页面大小推出来的
- 只提供虚拟地址即可找到物理地址,所以页式管理是一维的
- 快表:解决多次访存影响速度的问题
- 逻辑地址与快表比对,如果相同就直接得出物理地址,如果快表中没有再访存慢表得到物理地址
- 一般默认先查TLB再访存,有些会同时访问
多级页表:解决页表在内存中太占地方的问题
概念:程序按自然段划分逻辑空间,段内连续,段间不连续
- 段表的段表项也是一样长,段号也是需要自己算的,实际只存了基址和段长
- 与分页相比,考虑了用户的编程,信息共享及动态链接的需求
- 无法只通过一个逻辑地址得知物理地址,因为分段管理的地址空间是二维的
地址转换:与页式不同,段号与段表长度比较,看是否越界;偏移量与段长比较,看是否越界
3.3.3 段页式存储
概念:程序先按逻辑分段,段中再分页;
一个程序有一个段表,一个段有一个页表;
3.4 虚拟内存
3.4.1 基本概念
- 局部性原理:时间局部性:现在用了待会还要用,例如循环
空间局部性:现在这一个待会下一个,例如数组 概念:基于局部性原理,只将一部分程序装入内存,用时再调入内存,不用时调出至外存,原本存不了那么多程序的内存,现在能运行这么多程序,给用户的感觉就像内存增大了很多倍,但其实只是逻辑上的扩大
3.4.2 请求分页管理方式
概念:在基本分页的基础上,增加了请求调页和页面置换的功能
- 页表机制:对比之前的基本分页,增加了一些标志位
- 状态位:显示是否已存入内存,是就为1,不是为0
- 访问字段:记录被访问的次数,是置换时的依据
- 修改位(脏位):记录是否被更改,改了的话,置换该页时要写回内存
- 外存地址:在外存上的地址
置换算法:
驻留集:为进程分配的页框的集合,称为驻留集,具体分多少个页框:
- 固定分配局部置换:页框数一定,缺页只能置换
- 可变分配全局置换:页框数不定,缺页就给空闲物理块
- 可变分配局部置换:动态增减页框数,允许缺页置换
- 工作集:现页面前t个页面的无重复集合;反映接下来一段时间里会经常访问的页面
- 调入时机:预调页靠预测,用于运行前首次调入;请求调页一次调一页,用于运行中
- 从哪里调入:交换区大,文件区复制到交换区,让内存从交换区中取
交换区小,不会被修改的代码段直接从从文件区拿,可能被修改的在交换区换入换出
UNIX方式,全从文件区拿,被换出的才放进交换区 - 抖动:换出换进,CPU效率低下,存储器负荷运行;原因是物理块分配少了
**