Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >23-内存空间的分配与回收

23-内存空间的分配与回收

作者头像
Ywrby
发布于 2022-10-27 05:03:17
发布于 2022-10-27 05:03:17
9770
举报
文章被收录于专栏:YwrbyYwrby

连续分配管理方式

连续分配:指系统为用户进程分配的必须是一个连续的内存空间

单一连续分配

在单一连续分配方式中,内存被分为系统区和用户区。

  • 系统区通常位于内存的低地址部分,用于存放操作系统相关数据
  • 用户区用于存放用户进程相关数据。内存中只能有一道用户程序,用户程序独占整个用户区空间。

优缺点

  • 优点:实现简单,无外部碎片,可以采用覆盖技术扩充内存,不一定需要内存保护机制
  • 缺点:只能用于单用户,单任务的操作系统中,有内部碎片,存储器利用率极低

内部碎片:分配给某进程的内存区域中,如果有些部分没有用上,这些内存部分就被称为“内部碎片”

固定分区分配

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

固定分区分配又可以细分为分区大小相等与分区大小不等两种情况

针对分区大小不等的情况,系统为了维护分区状态以及管理各个分区,需要建立一个数据结构–分区说明表:

分区号

大小(MB)

起始地址(M)

状态

1

2

8

未分配

2

2

10

未分配

3

4

12

已分配

当某用户程序要装入内存时,由操作系统内核程序根据用户程序大小检索该表,从中找到一个能满足大小的、未分配的分区,将之分配给该程序,然后修改状态为“已分配”。

优缺点

  • 分区大小相等:
    • 优点:适用于计算机控制多个相同对象的场合
    • 缺点:缺乏灵活性
  • 分区大小不等:
    • 优点:实现简单,无外部碎片,增加了灵活性,可以按照不同大小的进程需求,根据系统中运行的作业大小情况进行划分
    • 缺点:当用户程序过大时,可能所有分区都不能满足需求,此时不得不采用覆盖技术解决,但这又会降低性能,会产生内部碎片,内存效率低

动态分区分配

动态分区分配又称为可变分区分配。这种分配方式不会预先划分内存分区,而是在进程装入内存时,根据进程的大小动态地建立分区,并使分区的大小正好适合进程的需要。因此系统分区的大小和数目是可变的。(eg:假设某计算机内存大小为64MB,系统区8MB,用户区共56 MB..)

动态分区分配中首先我们要考虑“系统要用什么样的数据结构记录内存使用情况?”,另外从进程4进入过程中我们看到,有多个空闲分区满足它的要求,所以我们要考虑“当很多空闲分区都能满足需求时,应该选择哪个分区进行分配”,最后我们看到,在进程3执行结束后,几个空闲分区在物理位置上相连,是否要将它们几个结合,所以我们还需要考虑“如何进行分区的分配与回收”

系统要用什么样的数据结构记录内存使用情况?

最长采用两种常用的数据结构:空闲分区表和空闲分区链

当很多空闲分区都能满足需求时,应该选择哪个分区进行分配

把一个新作业装入内存时,须按照一定的动态分区分配算法,从空闲分区表(或空闲分区链)中选出一个分区分配给该作业。由于分配算法算法对系统性能有很大的影响,因此人们对它进行了广泛的研究。并在此基础上完成了多种动态分区分配算法

如何进行分区的分配与回收

首先是在分配过程中,可能会出现将进程大小与空闲分区大小不相等的情况,此时对于空闲分区表来说就需要修改对应分区大小以及起始地址。也可能出现进程大小恰好等于空闲分区大小的情况,此时就需要删除空闲分区表中的一行,对空闲分区链也同理

而对于回收过程,需要注意的就是,如果一个进程执行结束,其所在分区由分配状态变为空闲状态,就需要检查该分区前后是否还存在空闲分区,如果前方或后方存在空闲分区,就需要将他们合并为一个分区,并修改空闲分区表。如果前后都不存在空闲分区,则需要在空闲分区表中新增一行

动态分区分配没有内部碎片,但是有外部碎片。

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

动态分区分配算法

首次适应算法

  • 算法思想:每次都从低地址开始查找,找到第一个能满足大小的空闲分区。
  • 如何实现:空闲分区以地址递增的次序排列。每次分配内存时顺序查找空闲分区链(或空闲分区表),找到大小能满足要求的第一个空闲分区。

最佳适应算法

  • 算法思想:由于动态分区分配是一种连续分配方式,为各进程分配的空间必须是连续的一整片区域。因此为了保证当“大进程”到来时能有连续的大片空间,可以尽可能多地留下大片的空闲区,即优先使用更小的空闲区。
  • 如何实现:空闲分区按容量递增次序链接。每次分配内存时顺序查找空闲分区链(或空闲分区表),找到大小能满足要求的第一个空闲分区。

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

最坏适应算法

又称最大适应算法(Largest Fit)

  • 算法思想:为了解决最佳适应算法的问题–即留下太多难以利用的小碎片,可以在每次分配时优先使用最大的连续空闲区,这样分配后剩余的空闲区就不会太小,更方便使用。
  • 如何实现:空闲分区按容量递减次序链接。每次分配内存时顺序查找空闲分区链(或空闲分区表),找到大小能满足要求的第一个空闲分区。

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

临近适应算法

基于首次适应算法的一种改良

  • 算法思想:首次适应算法每次都从链头开始查找的。这可能会导致低地址部分出现很多小的空闲分区,而每次分配查找时,都要经过这些分区,因此也增加了查找的开销。如果每次都从上次查找结束的位置开始检索,就能解决上述问题。
  • 如何实现:空闲分区以地址递增的顺序排列(可排成一个循环链表)。每次分配内存时从上次查找结束的位置开始查找空闲分区链(或空闲分区表),找到大小能满足要求的第一个空闲分区。

首次适应算法每次都要从头查找,每次都需要检索低地址的小分区。但是这种规则也决定了当低地址部分有更小的分区可以满足需求时,会更有可能用到低地址部分的小分区,也会更有可能把高地址部分的天分区保留下来(最佳适应算法的优点)

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

四种动态分配算法比较

算法

算法思想

分区排列顺序

优点

缺点

首次适应

从头到尾找适合的分区

空闲分区以地址递增次序排列

综合看性能最好。算法开销小,回收分区后一般不需要对空闲分区队列重新排序

最佳适应

优先使用更小的分区,以保留更多大分区

空闲分区以容量递增次序排列

会有更多的大分区被保留下来,更能满足大进程需求

会产生很多的,难以利用的碎片;算法开销大,回收分区后可能需要对空闲分区队列重新排序

最坏适应

优先使用更大的分区,以防止产生太小的不可用的碎片

空闲分区以容量递减次序排列

可以减少难以利用的小碎片

大分区容易被用完,不利于大进程:算法开销大(原因同上)

临近适应

由首次适应演变而来,每次从上次查找结束位置开始查找

空闲分区以地址递增次序排列(可排列成循环链表)

不用灭磁都从低地址的小分区开始检索,算法开销小

会使高地址的大分区也被用完

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-12-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
概念题知识点总结
1.操作系统的的4个基本特点 并发性(宏观上同时进行,微观上交替): 两个或两个以上的事件或活动在同一时间间隔内发生。 共享性:计算机系统中的资源可被多个并发执行的用户程序和系统程序共同使用,而不是被其中某一个程序所独占。 不确定性(异步性 随机性):进程是以人们不可预知的速度进行;进程是走走停停,不是一气呵成的。 虚拟性:把物理上的一个实体变成逻辑上的多个对应物或把物理上的多个实体变成逻辑上的一个对应物。 2.OS的三种基本类型及其主要目标 批处理操作系统(有效):  提高资源利用率 分时操作系统(方便用
SuperHeroes
2018/05/30
6720
操作系统常见面试题总结
操作系统本质上是一个运行在计算机上的软件程序 ,管理着计算机硬件和软件资源,为计算机硬件和软件提供了一种中间层,使应用软件和硬件进行分离,屏蔽了硬件层的复杂性,让我们把关注点更多放在软件应用上。操作系统的主要功能有:
全栈程序员站长
2022/06/29
6890
操作系统常见面试题总结
操作系统主存储器空间的分配和回收_内存管理的功能
(3)如何进行分区的分配与回收操作?假设系统采用的数据结构是“空闲分区表”…如何分配?
全栈程序员站长
2022/11/10
1.1K0
操作系统主存储器空间的分配和回收_内存管理的功能
计算机内存管理介绍
计算机操作系统内存管理是十分重要的,因为其中涉及到很多设计很多算法。《深入理解计算机系统》这本书曾提到过,现在操作系统存储的设计就是“带着镣铐跳舞”,造成计算机一种一种容量多,速度快的假象。包括现在很多系统比如数据库系统的设计和操作系统做法相似。所以在学习操作系统之余我来介绍并总结一些操作系统的内存管理。
Bug开发工程师
2019/05/05
6480
计算机内存管理介绍
3.1.3连续分配管理方式
连续分配方式,是指为一个用户程序分配一个连续的内存空间。它主要包括单一连续分配、固定分区分配和动态分区分配。
week
2018/08/27
7500
操作系统学习笔记-11:内存分配(一):连续分配
从第 11 篇笔记开始进入第二章节,也就是存储器管理的相关知识。下面是本篇笔记的思维导图:
Chor
2020/05/06
4.5K0
操作系统内存管理——分区、页式、段式管理
内存管理主要包括虚地址、地址变换、内存分配和回收、内存扩充、内存共享和保护等功能。
bear_fish
2018/09/14
5.6K0
操作系统内存管理——分区、页式、段式管理
OS——基本存储管理(1)
终于也是跨过了处理机管理,来到内存管理的内容了。目前基本存储管理这一章还差分页、分段以及段页三种管理方式没有学,之所以在学之前来写这一篇文章,主要是觉得这一章的内容过于零碎了,不易成逻辑又很容易忘掉,所以写这一篇来串一下已学的内容,在复习的基础上为学接下来的做一些铺垫。
mumumu
2022/12/26
6810
OS——基本存储管理(1)
冷月手撕408之操作系统(12)-内存分配之连续存储管理
操作系统的内存的分配与回收连续存储管理主要介绍了,内存管理中连续存储管理的三种方法,重点掌握动态分区分配的分配算法。
学长冷月
2021/02/22
5490
冷月手撕408之操作系统(12)-内存分配之连续存储管理
nginx_采取的内存分配策略
首次适应(First Fit)算法:空闲分区以地址递增的次序链接。分配内存时顺序查找,找到大小能满足要求的第一个空闲分区。
随心助手
2019/10/15
9060
操作系统-超20000字的“总结”
从单道批处理系统对CPU的利用情况可看出,作业运行过程中若发生IO请求,高速的CPU要等待低速的I/O操作完成,导致CPU资源利用率和系统吞吐量降低。
Karos
2023/02/24
1.4K0
操作系统-超20000字的“总结”
[操作系统]内存连续分配管理方式
单一连续分配:内存分为系统区和用户区,只有一道用户程序占据整个用户区,无外部碎片,有内部碎片,内存利用率低 固定分区分配:分为系统区和用户区,用户区划分多个分区,每个分区一个程序,无外部碎片,有内部碎片,利用率低
唯一Chat
2021/01/02
9440
操作系统内存管理(思维导图详解)
包括程序装入等概念、交换技术、连续分配管理方式和非连续分配管理方式(分页、分段、段页式)。
黄规速
2022/04/14
8470
操作系统内存管理(思维导图详解)
OS存储器管理(一)
存储器的层次: 分为寄存器、主存(内存)和 辅存(外存)三个层次。 主存:高速缓冲存储器、主存储器、磁盘缓冲存储器,          主存又称为可执行存储器; 辅存:固定磁盘存储器、可移动的外部存储器;          其可长期保存数据,但不能被处理器直接访问。 此处针对的是在OS层面上对主存(内存)的管理。 内(主)存储器管理的主要功能:① 逻辑地址到物理地址的转换     ② 内存(主存)空间的分配与回收     ③ 内存信息(数据)的共享与保护     ④ 内存的逻辑扩充(虚拟存储器的实现)
欠扁的小篮子
2018/04/11
1.3K0
OS存储器管理(一)
内存管理两部曲之物理内存管理
先笼统地总结下内存管理到底是干啥的,下面这段话摘自《现代操作系统 - 第 3 版》:
飞天小牛肉
2021/06/24
9170
[操作系统]内存动态分区分配算法
首次适应算法 每次从低地址开始查找,找到第一个能满足大小的空闲分区,顺序查找空闲分区链或者空闲分区表
唯一Chat
2021/01/02
1.4K0
[操作系统]内存动态分区分配算法
某操纵系统采用可变分区分配存储管理方法,用户区为512K且始址为0,用空闲分区表管理空闲分区。若分配是采用分配空闲区低地址部分的方案,且初始时用户区的512K空间空闲,对下述申请序列:申请300K,申
如果大家觉得有用的话,可以关注我下面的微信公众号,极客李华,我会在里面更新更多行业资讯,企业面试内容,编程资源,如何写出可以让大厂面试官眼前一亮的简历等内容,让大家更好学习编程,我的抖音,B站也叫极客李华。大家喜欢也可以关注一下
GeekLiHua
2025/01/21
910
某操纵系统采用可变分区分配存储管理方法,用户区为512K且始址为0,用空闲分区表管理空闲分区。若分配是采用分配空闲区低地址部分的方案,且初始时用户区的512K空间空闲,对下述申请序列:申请300K,申
《逆袭进大厂》第五弹之操作系统开胃菜(附前四期PDF下载方式)
C++ 的八股文终于搞完了,前四篇文章字数分别是:32156、37814、31114、24098 个字,加起来一共 125,182个字,12W 字的八股文….如果还有没看过的,可以点击下面的链接去看看了。
拓跋阿秀
2021/03/21
9870
[每天五分钟,备战架构师-3]操作系统基本原理之存储管理
存储器是计算机系统中最重要的资源之一,任何程序和数据及各种控制用的数据结构都必须占有一定的存储空间,因此,存储管理直接影响系统性能。
大江小浪
2018/07/24
5810
[每天五分钟,备战架构师-3]操作系统基本原理之存储管理
操作系统 内存管理 内存存储管理方案
固定分区是指系统先把内存划分为若干个大小固定的分区,一旦分配好,在系统运行期间便不再重新划分。程序运行时必须提供对内存资源的最大申请量。
Meng小羽
2019/12/23
1.5K0
推荐阅读
相关推荐
概念题知识点总结
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档