内存管理是一个很大的概念,那么让我们开始进入内存的世界吧
内存管理可分为四部分
- 内存地址的转换(逻辑地址到物理地址)
1.绝对装入(早期单道批操作系统)
2.静态重定位(多道批操作系统)
3.动态重定位 - 内存的扩充(虚拟内存)
- 内存的保护
- 内存的分配与回收
1.连续分配管理方式(重点)
2.非连续管理方式(大重点 点击查看)
前三点只需要了解即可,第四点内存的分配为重点
内存地址的转换
小冯:
乔老师 什么时候会用到内存地址的转换啊?
乔哥:
要说这个问题,就必须谈谈程序的编写到运行间发生了什么
程序在被编写后,需要进行编译,链接 和装入。编译: 本质上是将源程序(.c)编译成若干个目标模块(就是将高级语言转化为机器码 .obj ),每一个目标模块指令中的地址都是逻辑地址,并且每个逻辑地址都是从零开始的。
链接: 将各个目标模块整合为一个装入模块(.exe),并且将逻辑地址合并
装入: 将目标模块放入内存的相应位置即可但!!!问题是目标模块的地址是逻辑地址,但内存中地址是物理地址,这该怎么转换呢?
小冯:
对呀,该怎么办呢
乔哥 这里有三种方法
1.绝对装入 这种方法是在编译阶段,就已经知道了程序要放到内存的那个位置,直接将指令中的逻辑地址改为实际的物理地址,常用于单道批操作系统
2.静态重定位装入 在装入时将逻辑地址改为物理地址,但需要一次性分配所需全部的内存空间,且不可再修改地址
3.动态重定位装入(常用 之后的分页分片都是这种) 在装入时并不修改逻辑地址 ,只有在程序运行时再写改为物理地址。怎么修改呢? 系统会设置一个重定位寄存器(该寄存器会储存程序在内存中的起始地址),将起始地址与逻辑地址相加即可得到物理地址了
小冯: 能讲讲链接吗
乔哥:
小冯: 哇,知识点还是很多啊,需要都记住吗。
乔哥: 不需要的,这里考试主要是选择题,重在理解
内存的扩充
小乔:老师我不太理解 。。。。。。。。。。。
乔哥: 很简单的啦 通常是两种方法 覆盖 和 对换
.
覆盖:将程序分为多个模块,将常用的模块常驻内存,不常用的使用是在调入内存。
将内存分为固定区和若干覆盖区.
“”固定区“”:常驻内存。“”覆盖区“”:使用时调入内存,不使用时掉出内存。例如有A块调出,B块便可调入,就可以使"小内存"使用"大程序"啦.
缺点就是: 覆盖结构需程序员声明,对用户不透明,增加了编程负担
.
对换: 在内存不足时,将内存中某些进程按照一定规则放入外存。之前讲的进程调度就是为了实现该动能。点击查看
内存的保护
两种方式
1.CPU中设置一对上,下限寄存器,存放用户作业在主存中的下限和上限,每当CPU要访问一个地址时,分别和两个寄存器的值相比,判断有无越界。
2.通过采用重定位寄存器(或基址寄存器)和界地址寄存器(又称限长寄存器)来实现这种保护,重定位寄存器含最小的物理地址值,界地址寄存器含逻辑地址的最大值,每个逻辑地址值必须小于界地址寄存器,内存管理机构动态的将逻辑地址与界地址寄存器进行比较,如果未发生地址越界。则加上重定位寄存器的值后映射成物理地址,再送交内存单元。
内存的分配与回收
连续分配管理方式
-
单一连续分配
内存中只能有一道程序
无外部碎片,有内部碎片 -
固定分区分配
将内存分为大小相等的分区。
无外部碎片,有内部碎片 -
动态分区分配
-
不会预先建立分区,会根据进程的大小动态分配分区
-
无内部碎片,有外部碎片,外部碎片可以通过紧凑技术来解决
-
系统会提供空闲分区链(表),用于存储分区信息
分区回收:回收后有相邻分区合并
1.首次适应算法(效果最好)
2.最佳适应算法(可能导致产生许多小的外部碎片)
3.最差适应算法(可能导致大分区不足)
4.临近适应算法(可能导致大分区不足)
-
小冯:不是说这个知识点很重要吗,为什么讲的这么少
乔哥:这里很多知识单用一个文字很难讲明白,主要供大家梳理框架和复习使用,记住下去一定要看书哦.
创作不易,点个赞吧,亲。