更多优质内容
请关注公众号

操作系统入门(十六)内存连续分配——单一连续分配、固定分区分配和动态分区分配-张柏沛IT博客

正文内容

操作系统入门(十六)内存连续分配——单一连续分配、固定分区分配和动态分区分配

栏目:Linux 系列:操作系统入门 发布时间:2022-02-24 19:04 浏览量:80
本系列文章目录
展开/收起

系统区和用户区

整个内存会分为系统区(在低地址)和用户区(高地址),分别存放系统进程和用户进程的数据和指令。

 

 

内存分配策略,主要分为连续分配管理离散分配管理。本节主要介绍连续分配管理。

 

 

· 连续分配管理

连续分配是指,整个进程在物理内存中是连续存储的,分配给进程的内存空间是连续的内存空间。

 

连续分配策略分为3种

单一连续分配:将内存中整个用户区空间分配给1个用户程序,无需对用户区再分区;

固定分区分配:在进程装入内存之前,就将整个用户区分为多个分区,进程装入内存时选择一个大小大于等于该进程所需内存的分区给该进程。

动态分区分配:进程装入内存时才对内存分区,分区的大小就是进程所需的所有内存大小。

 

固定分区分配和动态分区分配都是一个进程只能占用一个分区,不能占用多个分区。

 

1、单一连续分配

内存中只能有一道用户程序,用户程序独占整个用户区 空间。

优点:实现简单;无外部碎片;如果用户区内存不足以装下整个进程,可以采用覆盖技术扩充 内存;不一定需要采取内存保护。

缺点:内存只装入一个进程的信息,内部碎片可能极大,内存利用率极低。无法实现进程并发,并发率低。

 

 

2、固定分区分配

固定分区分配法将整个用户空间划分为若干个固定大小的分区,在 每个分区中只装入一道作业

按照分区大小是否相等,又有两种分法:

 

如何实现内存分配和回收?

操作系统需要建立一个数据结构——分区分配表,来实现各个分区的分配与回 收。每个表项对应一个分区,通常按分区大小排列。每个表项包括对应分区的 大小、起始地址、状态(是否已分配)。可以使用数组或者链表在逻辑上实现这个分区分配表。

优点:实现简单,无外部碎片。

缺点:

a. 当用户程序太大时,可能所有的分区都不能满足需求,此时不得不采 用覆盖技术来解决,但这又会降低性能;

b. 会产生内部碎片,内存利用率低。

c.难以合理预先划分分区, 分区个数划分少了影响并发度,划分多了,每个分区大小就小了,造成问题a

 

 

3、动态分区分配

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

动态分区分配可以使用空闲分区表或者空闲分区链管理:

表项 中包含分区号、 分区大小、分区 起始地址等信息。

 

如果回收分区的时候,待回收的分区和其他空闲分区相连,需要合并这些分区的表项为一个表项(如果是链表,则合并多个节点为一个更大的节点)。

 

 

在一开始给多个进程分配分区时,这些进程在内存中是紧挨着的,随着多次回收和分配,进程在内存中会变成离散分布,并可能出现大量外部碎片。动态分区不会产生内部碎片,因为每个分区大小都等于该进程所需内存大小。

 

此时可以用紧凑技术解决,将离散的进程变成在内存中紧密相连。

 

紧缩是指将所有进程占用的分区移动到一端使其紧凑的挨在一起,空闲区留在另一端。如下图所示,原本所有碎片分区都容纳不下进程5,但移动后所有碎片分区相邻融合为一个连续的空闲区就能放下进程5:

紧缩要将进程在内存中的物理位置“搬家”,因此需要对所有进程的与地址有关的项修改,例如基址寄存器、程序计数器等,还会造成内存数据大量拷贝。因此紧缩会花费大量CPU时间。

紧缩的时机:当所有空闲分区的大小不满足要装入内存的进程大小时进行紧缩。

 

动态分区的优点:

分区大小可变,进程在内存的起始位置可变,空闲分区可合并,更灵活,内存利用率更高;

无内部碎片;

 

缺点:

有外部碎片,外部碎片过多,可能触发“紧凑”,系统开销大;

一个进程需要占用连续的内存空间,相比于离散分配而言,内存利用率低(正是由于连续分配,所以容易产生外部碎片);

 

 

动态分区分配算法(了解即可)

动态分区分配算法研究的是,内存中有空闲分区时,动态分区分配法优先选择哪个分区给进程。

 

首次适应算法

从低地址开始查找分区,找到第一个能满足待装入进程大小的空闲分区。

如何实现:空闲分区在空闲分区链中以地址递增的次序排列。每次分配内存时顺序查找空闲分区链(或空闲分区 表),找到大小能满足要求的第一个空闲分区。

缺点:低地址空闲区会产生很多外部碎片,查找空闲区链表时会重复遍历低地址的外部碎片分区,增加了查找的开销。

 

最佳适应算法

从所有空闲分区中选择满足待装入进程大小的最小空闲分区。目的是预留大分区给大进程。

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

 

缺点:每次都选最小的分区进行分配,会留下越来越多的、小到难以利用的外部碎片。

 

最坏适应法

从所有空闲分区中选择满足待装入进程大小的最大空闲分区。目的是尽可能避免生成外部碎片。

如何实现:空闲分区在空闲分区链中按容量递减次序排序。

缺点:每次都选最大的分区进行分配,可以让分配后留下的空闲区更大,避免外部碎片。但是会导致较大的连续空闲区被迅速用完,“大进程”到达就没有内存分区可用了。

 

 

邻近适应算法

该算法按照首次适应算法的逻辑查找,但下次查找按上次查 找结束的位置开始检索。目的是解决首次适应算法查找时间递增的缺点。

如何实现:空闲分区在空闲分区链中以地址递增的顺序排列,排成一个循环链表。使用一个头指针指向上次分配内存时查 找结束的位置,下次从该位置开始查找空闲分区链,找到大小能满足要求的第一个空闲分区。

 

缺点:进程装入时,头指针之前的空闲分区(低地址的分区)即使有足够空间分配给该进程,系统还是会选择头指针之后的空闲分区来分配。因此该算法会导致高地址和低地址分区可无大分区可用。

四种算法中,首次适应算法的效果反而最好。

首次适应算法和邻近适应算法的优点是分配分区后,无需移动链表节点,而最佳适应和最坏适应算法则需要移动链表节点。邻近适应算法的查找效率最高。

这些优缺点没必要死记,知道原理就能慢慢总结出优缺点。




更多内容请关注微信公众号
zbpblog微信公众号

如果您需要转载,可以点击下方按钮可以进行复制粘贴;本站博客文章为原创,请转载时注明以下信息

张柏沛IT技术博客 > 操作系统入门(十六)内存连续分配——单一连续分配、固定分区分配和动态分区分配

热门推荐
推荐新闻