操作系统之内存管理(内存地址的转换,内存的扩充,内存的保护,内存的分配与回收)

内存管理是一个很大的概念,那么让我们开始进入内存的世界吧

内存管理可分为四部分

  • 内存地址的转换(逻辑地址到物理地址)
    1.绝对装入(早期单道批操作系统)
    2.静态重定位(多道批操作系统)
    3.动态重定位
  • 内存的扩充(虚拟内存)
  • 内存的保护
  • 内存的分配与回收
    1.连续分配管理方式(重点)
    2.非连续管理方式(大重点 点击查看)

前三点只需要了解即可,第四点内存的分配为重点

内存地址的转换

小冯:

乔老师 什么时候会用到内存地址的转换啊?

乔哥:

要说这个问题,就必须谈谈程序的编写到运行间发生了什么
程序在被编写后,需要进行编译,链接 和装入

编译: 本质上是将源程序(.c)编译成若干个目标模块(就是将高级语言转化为机器码 .obj ),每一个目标模块指令中的地址都是逻辑地址,并且每个逻辑地址都是从零开始的。
链接: 将各个目标模块整合为一个装入模块(.exe),并且将逻辑地址合并
装入: 将目标模块放入内存的相应位置即可

但!!!问题是目标模块的地址是逻辑地址,但内存中地址是物理地址,这该怎么转换呢?

小冯:
对呀,该怎么办呢

乔哥 这里有三种方法
1.绝对装入 这种方法是在编译阶段,就已经知道了程序要放到内存的那个位置直接将指令中的逻辑地址改为实际的物理地址,常用於单道批操作系统
2.静态重定位装入 在装入时将逻辑地址改为物理地址,但需要一次性分配所需全部的内存空间,且不可再修改地址
3.动态重定位装入(常用 之后的分页分片都是这种) 在装入时并不修改逻辑地址 ,只有在程序运行时再写改为物理地址。怎么修改呢? 系统会设置一个重定位寄存器(该寄存器会储存程序在内存中的起始地址),将起始地址与逻辑地址相加即可得到物理地址

小冯: 能讲讲链接吗
乔哥:
在这里插入图片描述

小冯: 哇,知识点还是很多啊,需要都记住吗。

乔哥: 不需要的,这里考试主要是选择题,重在理解

内存的扩充

小乔:老师我不太理解 。。。。。。。。。。。

乔哥: 很简单的啦 通常是两种方法 覆盖 和 对换
.
覆盖:将程序分为多个模块,将常用的模块常驻内存,不常用的使用是在调入内存。
内存分为固定区和若干覆盖区
.
“”固定区“”:常驻内存。“”覆盖区“”:使用时调入内存,不使用时掉出内存。例如有A块调出,B块便可调入,就可以使"小内存"使用"大程序"啦.
缺点就是: 覆盖结构需程序员声明,对用户不透明,增加了编程负担
.
对换: 在内存不足时,将内存中某些进程按照一定规则放入外存。之前讲的进程调度就是为了实现该动能。点击查看

内存的保护

两种方式

1.CPU中设置一对上,下限寄存器,存放用户作业在主存中的下限和上限,每当CPU要访问一个地址时,分别和两个寄存器的值相比,判断有无越界。

2.通过采用重定位寄存器(或基址寄存器)和界地址寄存器(又称限长寄存器)来实现这种保护,重定位寄存器含最小的物理地址值,界地址寄存器含逻辑地址的最大值,每个逻辑地址值必须小于界地址寄存器,内存管理机构动态的将逻辑地址与界地址寄存器进行比较,如果未发生地址越界。则加上重定位寄存器的值后映射成物理地址,再送交内存单元。

内存的分配与回收

连续分配管理方式

  • 单一连续分配
    内存中只能有一道程序
    无外部碎片,有内部碎片

  • 固定分区分配
    将内存分为大小相等的分区。
    无外部碎片,有内部碎片

  • 动态分区分配

    • 不会预先建立分区,会根据进程的大小动态分配分区

    • 无内部碎片,有外部碎片,外部碎片可以通过紧凑技术来解决

    • 系统会提供空闲分区链(表),用于存储分区信息

    分区回收:回收后有相邻分区合并
    1.首次适应算法(效果最好)
    在这里插入图片描述
    2.最佳适应算法(可能导致产生许多小的外部碎片)
    在这里插入图片描述
    3.最差适应算法(可能导致大分区不足)
    在这里插入图片描述
    4.临近适应算法(可能导致大分区不足)
    在这里插入图片描述

小冯:不是说这个知识点很重要吗,为什么讲的这么少

乔哥:这里很多知识单用一个文字很难讲明白,主要供大家梳理框架和复习使用,记住下去一定要看书哦.

创作不易,点个赞吧,亲。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章