一、什么是连续分配管理

连续分配管理方式内存空间分配与回收的一种管理方式,相较于非连续分配管理方式而言,连续分配要求为用户进程分配的必须是一个连续的内存空间

连续分类管理方式有三种方式,包括:

  1. 单一连续分配
  2. 固定分区分配
  3. 动态分区分配

二、单一连续分配

在单一连续分配方式中,内存被分为两个部分:系统区用户区。(如下图)

【操作系统】连续分配管理方式_内部碎片

系统区通常位于内存的低地址部分,用户存放操作系统的相关数据。

用户区存放用户进程相关数据,用户区内只能有一道用户程序,用户程序独占用户区。

优点:

1.实现简单、无外部碎片

2.可以采用覆盖技术扩充内存。

什么是覆盖技术?

覆盖技术是一种用于解决程序大小超过物理内存总和的问题。

即出现如下图的情况,如何让程序运行的一种方法

【操作系统】连续分配管理方式_数据_02

覆盖技术的思想:

将程序分成多个段,常用的段常驻内存,不常用的段只有在需要的时候调入内存,运行完毕之后既调出内存。

内存又被分为一个固定区和多个覆盖区。常用的段放在固定区中(只有当程序运行完后,才会调出内存)。不常用的段放在覆盖区中,只有在需要的时候调入覆盖区,用不到的时候既调出覆盖区。

举栗:该程序具有层次结构,B运行的时候,C不能运行。D运行的时候,E、F不能运行。E运行的时候,F、D不能运行。

当不采用覆盖技术存储时,总共需要8+8+10+12+4+10 = 52K内存。

【操作系统】连续分配管理方式_内部碎片_03

 当采用覆盖技术存储时,则可根据层次结构,划分出一个固定区和两个覆盖区(A、B)。固定区的内存大小为8K。覆盖区A的内存大小为10K(因为在同一时间段内,B和C只能有一个运行,所以取其大者)。同理覆盖区B的内存大小为12K。由此可见,当采用覆盖技术时,只需要30K的内存,便可以运行这个程序。

但是覆盖技术增加了程序员的编程难度,现在已经很少使用了

3.不一定需要内存保护。

什么是内存保护?

所谓内存保护即内存中的进程即不能修改操作系统的数据,也不能修改其他进程的数据。即各个进程只能访问自己的内存空间。

内存保护的两种方式:

<1. 上下限寄存器,访问地址之前需要与两个寄存器中的数据进行对比,处于二者之间方可访问。

【操作系统】连续分配管理方式_用户区_04

<2.界地址寄存器+重定位寄存器。其中重定位寄存器中存储的是物理地址的起始位置,界地址寄存器存放的是逻辑地址的最大位置。

【操作系统】连续分配管理方式_用户区_05

 

 三、固定分区分配

        为了在内存中装入多道程序,而且这些程序之间又不会相互干扰。于是将整个用户空间划分为若干个固定大小的分区。(这里的固定大小,指划分完后分区的大小不再改变。而不是内存大小都一样的分区)。每个分区中只能装入一道作业。

作业与进程的区别

1.作业是用户向计算机提交任务的任务实体。在用户向计算机提交作业作业后,系统将它放入外存中的作业等待队列中等待执行。而进程则是完成用户任务的执行实体,是向系统申请分配资源的基本单位。任一进程,只要它被创建,总有相应的部分存在于内存中。

2.一个作业可由多个进程组成,且必须至少由一个进程组成,反过来不成立。

3.作业的概念主要用在批处理系统中,像UNIX这样的分时系统中就没有作业的概念。而进程的概念则用在几乎所有的多道程序系统中。
 

固定分区分配有两种方式:1、分区大小相等 2、分区大小不等

        分区大小相等:如下图,即将用户区分成内存大小一致的多个分区。每个分区只能放一道作业。

        

【操作系统】连续分配管理方式_用户区_06

        分区大小相等:缺乏灵活性,但适合于一台计算机控制多个相同对象的场合。

        分区大小不等:  先统计大作业小作业一共有多少,然后根据比例进行划分。如下图      

        

【操作系统】连续分配管理方式_数据_07

 操作系统如何对各个分区进行管理?

建立分区说明表(分区大小、起始地址、状态),如图

【操作系统】连续分配管理方式_内部碎片_08

优点:

实现简单、无外部碎片。

缺点:

1、当用户程序太大时,所有的分区都无法满足,这时候需要采用覆盖技术进行处理,但降低了性能

2、会产生内部碎片

四、动态分区分配

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

【操作系统】连续分配管理方式_windows_09

动态分区分配的三个问题:

1、采用什么样的数据结构记录内存使用情况

2、当有多个分区满足进程的需求时,选择哪一个分区分配

3、分配与回收的处理。

下面我们一一探讨。

采用什么样的数据结构记录内存使用情况

两种常用的数据结构:空闲分区表、空闲分区链(如下图)

 

【操作系统】连续分配管理方式_内部碎片_10

 当有多个分区满足进程的需求时,选择哪一个分区分配

此处设计到了动态分区分配算法,常见的有四种:首次适应算法、最佳适应算法、最坏适应算法、邻近适应算法。这里仅简单的提一下。

首次适应算法:空闲分区链(或表),按照起始地址从小到大排序,分配内存时按照从前往后的顺序依次查找,找到合适的即分配。

最佳适应算法:空闲分区链(或表),按照容量从小到大排序,分配内存时按照从前往后的顺序依次查找,找到合适的即分配。

最坏适应算法:空闲分区链(或表),按照容量从大到小排序,分配的时候,只看第一个分区即可(因为最大)。

邻近适应算法:是在首次适应算法的基础上,进行的一些优化。即空闲分区链(或表),按照起始地址从小到大排序,每次分配内存时从上次查找结束的位置开始查找空闲分区链(或表),找到第一个合适的分区即分配。

分配与回收的处理

分配的时候,出现的两种情况

第一种,分区大小大于进程大小

【操作系统】连续分配管理方式_数据_11

对于这一种,只需要修改空闲分区表(或链)的起始地址和大小即可

第二种,分区大小等于进程大小

【操作系统】连续分配管理方式_内部碎片_12

对于这一种,则需要在空闲分区链(或表)中删除该空闲分区。

回收的时候出现的四种情况(其实我觉得就两种)

一种是回收区的前面、后面、或者前面后面都有一个空闲分区,这时候需要进行空闲分区的合并

如图,收回4MB的分区,但是其后面有一个空闲分区,则需要进行合并

【操作系统】连续分配管理方式_数据_13

 

【操作系统】连续分配管理方式_内部碎片_14

 

 第二种就是和上面的相反,前后都没有空闲分区,那么直接在空闲分区表(或链)增加一个即可。

五、内部碎片和外部碎片

内部碎片:分配给某进程的内存区域中,有部分没被用上。

外部碎片:某些内存中的某些空闲分区由于太小而难以利用。

内部碎片是针对固定分区而言的,如果有一个分区是10MB,一个进程使用了8MB,那么剩下的2MB无法被使用,即产生了内部碎片。动态分区分配不会产生这个问题的原因是,分区的大小和数目都不是固定的,这个2MB也可以作为一个小分区继续使用。

外部碎片:则是针对动态分区而言的,即空闲分区内存的总和大于进程所需要的内存,但每一个空闲分区的内存都小于进程所需要的内存。

【操作系统】连续分配管理方式_内部碎片_15

 动态分区分配可以通过"紧凑"技术,处理外部碎片。

紧凑技术即把所有已分配进程全部往前提,放在一起。如图(针对上图的紧凑处理)

【操作系统】连续分配管理方式_内部碎片_16

 

 ------------------------------------------------分割线-----------------------------------------------------------

七十年后再君语! 

【操作系统】连续分配管理方式_内部碎片_17