1 基本原理和要求
1 内存管理的功能
- 内存空间的分配与回收
- 地址转换
- 内存空间的扩充
- 存储保护
2 程序装入和链接
- 静态链接
- 装入时动态链接
- 运行时动态链接
3 装入内存的三种方式
- 绝对装入
- 编译时,编译程序产生绝对地址的目标代码,
- 只适用于单道程序环境
- 绝对地址可在编译或汇编时给出,也可由程序员直接赋予
- 通常情况下,程序中采用的是符号地址,然后再转换为绝对地址
- 可重定位装入
- 指令中使用的地址,数据的地址都是相对于起始地址的逻辑地址
- 装入时才重新定位,将逻辑地址转换为物理地址(地址变换是在装入时一次完成的)
- 一个作业装入内存时必须分配完所有的内存空间,若果不足,就不能装入
- 在运行期间不能移动,也不可再申请新的内存
- 动态运行时装入
- 编译链接后的装入模块的地址都是从0开始的
- 装入模块装入内存后不会立刻把逻辑地址转换为物理地址,而是把逻辑地址转换为物理地址的过程推迟到程序真正运行时
- 需要重定位寄存器,存放装入模块存放的起始地址
- 允许程序在内存中移动
4 关于链接和装入的理解(☆)
不是说上面的链接和装入是一一对应的,静态链接不是说就非得和静态装入(绝对装入)是一块儿的,绝对装入现在都不用了,但是静态链接我们还是用的就可以说明这一问题.
链接是针对程序在磁盘中的,比如静态链接的程序是用到的模块已经固定好啥样了,就像这样
然后怎么装入就看哪种方式,现在的应该都是动态装入
静态装入:
假设有一个没有错误(err.o),使用动态装入:
如果动态链接:
装入后:
装入是怎样将链接好后的程序装入到内存里,当然也可能是没有链接好,但是编译通过了(毕竟动态链接)
2 覆盖和交换
覆盖与交换技术是在多道程序环境下用来扩充内存的两种方法
3 连续分配管理方式
连续分配:系统为用户进程分配的必须是一个连续的内存空间
1 单一连续分配
一般无需内存保护
优点:简单,无外部碎片,可采用覆盖技术,不需要额外的技术支持
缺点:只适用于单用户,单任务,有内部碎片,利用率低
2 固定分区分配
分类:
- 分区大小相等
- 分区大小不等
优点:可用于多道程序的最简单的存储分配,无外部碎片
缺点:不能实现多进程共享一个主存区,所以利用率低,存在内部碎片(当程序小于固定分区大小,也占用一个完整的内存分区,这样分区内部就存在空间浪费,这种现象称为内部碎片);程序可能太大而放不进任意一个分区中,此时用户不得不使用覆盖技术来使用内存空间
3 动态分区分配
内部碎片,外部碎片
动态分配没有内部碎片
当剩余的内存空间可以满足某进程,但是由于是不连续的碎片,可以采用紧凑(拼凑Compaction)技术来解决
1 使用的数据结构
- 空闲分区表
- 空闲分区链
2 分配与回收
- 分配
- 如果那一块未满就更新一下
- 如果恰好那一块一样大,就删除表项或结点
- 回收
- 回收区前面有就俩合并,后面有也是,如果前后都有,就三个都合并
- 前后都没,插入一个表项
- 适合重定位装入方式,因为连续,且可以移动
动态分区分配算法
4 非连续分配管理方式
1 基本分页存储管理方式
1 分页存储知识点:
2 基本地址变换机构
3 具有块表的地址变换机构
- 进程切换时,快表被清楚
- 查询未命中,访问两次内存,查询命中访问一次
- 快慢表同时注意以下:
- 局部性原理
- 总结
4 两级页表
- 单级页表的问题
- 页表必须连续分配,当页表过大时,需要占用过多的连续页框
- 没有必要让整个页表常驻内存,进程在一段时间内的运行可能只访问几个特定的页面
- 访问次数(没有块表机构):
- n级页表,访问n+1次内存,如只有一个页表,则先访问页表,得到块号再访问内存单元(这个别忘了),如果2级则访问顶级页表一次,找到下一级页表所在的块号,访问该块号得到二级页表,找到要访问的内存块号,最后访问内存单元
- 一个页表最多只能占用一个页面,两级不够就继续分
- 总结
2 基本分段存储管理
1 逻辑地址结构
段号 段内偏移量
2 表项结构
段号 段长 本段在主存的始址