博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
3.1.1内存管理概念
阅读量:3961 次
发布时间:2019-05-24

本文共 3258 字,大约阅读时间需要 10 分钟。

1.从写程序到程序运行

在这里插入图片描述

1.1编辑源代码文件

1.2编译

由编译程序将用户源代码编译成若干个目标模块(编译就是把高级语言翻译为机器语言)

1.3链接

链接:由链接程序将编译后形成的一组目标模块,以及所需库函数链接在一起,形成一个完整的装入模块

1.3.1静态链接

静态链接:在程序运行之前, 先将各目标模块及它们所需 的库函数连接成一个完整的 可执行文件(装入模块), 之后不再拆开。

1.3.2装入时动态链接

装入时动态链接:将各目标 模块装入内存时,边装入边 链接的链接方式。

1.3.3运行时动态链接

运行时动态链接:在程序执行中需要该目标模块时,才 对它进行链接。其优点是便 于修改和更新,便于实现对 目标模块的共享。

1.4装入

1.4.1绝对装入

绝对装入:在编译时,如果知道程序将放到内存中的哪个位置,编译程序将产生绝对地址的目标代码。 装入程序按照装入模块中的地址,将程序和数据装入内存。

缺点:绝对装入只适用于单道程序环境。

1.4.2可重定位装入(静态重定位)

静态重定位:又称可重定位装入。编译、链接后的装入模块的地址都是从0开始的,指令中使用的地 址、数据存放的地址都是相对于起始地址而言的逻辑地址。可根据内存的当前情况,将装入模块装入 到内存的适当位置。装入时对地址进行“重定位”,将逻辑地址变换为物理地址(地址变换是在装入 时一次完成的)。

缺点:静态重定位的特点是在一个作业装入内存时,1必须分配其要求 的全部内存空间1,如果没有足够的内存,就不能装入该作业。 作业一旦进入内存后,在运行期间就不能再移动,也不能再申 请内存空间。

1.4.3动态运行时装入(动态重定位)

动态重定位:又称动态运行时装入。编译、链接后的装入模块的地址都是从0开始的。装入程序把装 入模块装入内存后,并不会立即把逻辑地址转换为物理地址,而是把地址转换推迟到程序真正要执行 时才进行。因此装入内存后所有的地址依然是逻辑地址。这种方式需要一个重定位寄存器的支持

在这里插入图片描述

2.内存管理的概念

2.1内存空间的分配与回收

操作系统负责内存空间的分配与回收

2.2内存空间的扩展(覆盖与交换)

操作系统需要提供某种技术从逻辑上对内存空间进行扩充

2.3地址转换(装入)

操作系统需要提供地址转换功能,负责程序的逻辑地址与物理地址的转换.

为了使编程更方便,程序员写程序时应该只需要关注指令、数据的逻辑地址。而逻辑地址到物理地址的转换(这个过程称为地址重定位,三种装入方式)应该由操作系统负责,这样就保证了程序员写程序时不需要关注 物理内存的实际情况。

2.4内存保护

操作系统需要提供内存保护功能。保证各进程在各自存储空间内 运行,互不干扰

2.4.1方法一

方法一:在CPU中设置一对上、下限寄存器,存放进程的上、下限地址。进程的指令要访问某个地址 时,CPU检查是否越界。

在这里插入图片描述

2.4.2方式二

方法二:采用重定位寄存器(又称基址寄存器)和界地址寄存器(又称限长寄存器)进行越界检查。重定位寄存器中存放的是进程的起始物理地址。界地址寄 存器中存放的是进程的最大逻辑地址。

在这里插入图片描述

3.覆盖与交换

3.1覆盖技术

覆盖技术的思想:将程序分为多个段(多个模块)。 常用的段常驻内存,不常用的段在需要时调入内存。 内存中分为一个“固定区”和若干个“覆盖区”。 需要常驻内存的段放在“固定区”中,调入后就不再 调出(除非运行结束), 不常用的段放在“覆盖区”,需要用到时调入内存, 用不到时调出内存

在这里插入图片描述
缺点:必须由程序员声明覆盖结构,对用户不透明,增加了用户编程负担。

3.2交换技术

交换(对换)技术的设计思想:内存空间紧张时,系统将内存中某些进程暂时换出外存,把外存中 某些已具备运行条件的进程换入内存(进程在内存与磁盘间动态调度)

在这里插入图片描述

4.连续分配管理方式

4.1单一连续分配

在单一连续分配方式中,内存被分为系统区用户区。 系统区通常位于内存的低地址部分,用于存放操作系统 相关数据;用户区用于存放用户进程相关数据。 内存中只能有一道用户程序,用户程序独占整个用户区 空间。

在这里插入图片描述

优点:实现简单;无外部碎片可以采用覆盖技术扩充内存;不一定需要采取内存保护(eg:早期的 PC 操作系统 MS-DOS)。

缺点:只能用于单用户、单任务的操作系统中;有内部碎片;存储器利用率极低。

4.2固定分区分配

20世纪60年代出现了支持多道程序的系统,为了能在内 存中装入多道程序,且这些程序之间又不会相互干扰, 于是将整个用户空间划分为若干个固定大小的分区,在 每个分区中只装入一道作业,这样就形成了最早的、最 简单的一种可运行多道程序的内存管理方式。可以采用覆盖技术扩充内存.

4.2.1分区大小相等

在这里插入图片描述

4.2.2分区大小不相等

在这里插入图片描述

优点:实现简单,无外部碎片
缺点:a. 当用户程序太大时,可能所有的分区都不能满足需求,此时不得不采 用覆盖技术来解决,但这又会降低性能;b. 会产生内部碎片,内存利用率低。

4.2.3分区说明表

操作系统需要建立一个数据结构——分区说明表,来实现各个分区的分配与回 收。每个表项对应一个分区,通常按分区大小排列。每个表项包括对应分区的 大小、起始地址、状态(是否已分配)。

在这里插入图片描述

4.3动态分区分配(可变分区分配)

动态分区分配又称为可变分区分配。这种分配方式不会预先划分内存分区,而是在进程装入内存时, 根据进程的大小动态地建立分区,并使分区的大小正好适合进程的需要。因此系统分区的大小和数 目是可变的。

4.3.1空闲分区表

在这里插入图片描述

4.3.2空闲分区链

在这里插入图片描述

动态分区分配没有内部碎片,但是有外部碎片
如果内存中空闲空间的总和本来可以满足某进程的要求, 但由于进程需要的是一整块连续的内存空间,因此这些 “碎片”不能满足进程的需求。 可以通过紧凑(拼凑,Compaction)技术来解决外部碎片。

4.3.3动态分区分配算法

4.3.3.1首次适应算法

每次都从低地址开始查找,找到第一个能满足大小的空闲分区。

4.3.3.2最佳适应算法

空闲分区按容量递增次序链接。每次分配内存时顺序查找空闲分区链(或空闲分区 表),找到大小能满足要求的第一个空闲分区。

缺点:每次都选最小的分区进行分配,会留下越来越多的、很小 的、难以利用的内存块。因此这种方法会产生很多的外部碎片

4.3.3.3最坏适应算法

空闲分区按容量递减次序链接。每次分配内存时顺序查找空闲分区链(或空闲分区表),找到大小能满足要求的第一个空闲分区。

缺点:每次都选最大的分区进行分配,虽然可以让分配后留下的 空闲区更大,更可用,但是这种方式会导致较大的连续空闲区被 迅速用完。如果之后有“大进程”到达,就没有内存分区可用了。

4.3.3.4邻近适应算法

空闲分区以地址递增的顺序排列(可排成一个循环链表)。每次分配内存时从上次查 找结束的位置开始查找空闲分区链(或空闲分区表),找到大小能满足要求的第一个空闲分区。

缺点:邻近适应算法的规则可能会导致无论低地址、高地址部分的空闲分区 都有相同的概率被使用,也就导致了高地址部分的大分区更可能被使 用,划分为小分区,最后导致无大分区可用

在这里插入图片描述

5.

6.补充

  1. 编址空间的大小取决于硬件的访存能力,一般由地址总线宽度决定。

  2. 虚拟内存的管理需要由相关的硬件和软件支持,有请求分页页表机制、缺页中断机构、地址变换机构等。

  3. 覆盖和交换的提出就是为了解决主存空间不足的问题,但不是在物理上扩充主存,只是将暂时不用的部分换出主存,以节省空间,从而在逻辑上扩充主存。

  4. 在整个系统中设置一个重定位寄存器

  5. 对主存的访问是以字节或字为单位的。

  6. 每个进程拥有一张页表,且进程的页表驻留在内存中

  7. 在分段存储管理方式中,以段为单位进行分配,每段是一个连续存储区,每段不一定等长,段与段之间可连续,也可不连续。

  8. 多级页表优点的是减少页表所占的连续内存空间,,即当页表太大时,将页表再分级,把每张页表控制在一页之内,减少页表所占的连续内存空间

    ,

转载地址:http://ukmzi.baihongyu.com/

你可能感兴趣的文章
The Road Not Taken
查看>>
VB全局对象
查看>>
比较Cint() , int() , fix() ,round()的区别
查看>>
举例说明常用字符串处理函数
查看>>
用Mindmanager整理的VB常用函数
查看>>
随风潜入夜,润物细无声
查看>>
软件生存期模型
查看>>
制定计划(问题的定义,可行性研究)
查看>>
需求分析
查看>>
软件设计
查看>>
程序编码
查看>>
软件测试
查看>>
软件维护
查看>>
软件项目管理
查看>>
面向过程的分析方法
查看>>
面向数据流的设计方法
查看>>
软件设计基础
查看>>
UML的基本结构
查看>>
UML中几种类间关系:继承、实现、依赖、关联、聚合、组合的联系与区别
查看>>
用例图(UseCase Diagram)—UML图(一)
查看>>