《操作系统 - 清华大学》3 -3:连续内存分配:内存碎片与分区的动态分配

文章目录

  • 0. 概述
  • 1. 内存碎片问题
  • 2. 动态分配
  • 3. 首次适配算法
  • 4. 最优适配算法
  • 5. 最差适配算法

0. 概述

内存分配是操作系统管理过程中很重要的环节,首先需要考虑的是一块连续区域分配的过程,这个过程中会有很多问题,首先比较关注的一个问题是内存碎片问题。

1. 内存碎片问题

在这里插入图片描述
什么碎片问题?
实际上就可以理解为当给一个运行程序分配空间之后,会出现一些无法进一步利用的空闲空间,这就是碎片,因为它已经没法被使用了。

但是碎片又分两种:
外碎片: 就是说在分配单元之间的这个没法去使用的内存。
内碎片: 所谓内碎片就是已经分配给了这个应用程序,但应用程序没法去进一步使用在这个分配的内存。
这两者都是希望尽量避免,希望能够有一种有效的内存分配方法,能够有效地减少内碎片和外碎片。

2. 动态分配

另一个问题在于,首先站在操作系统角度,它要在什么时候提供连续空间的分配?

  1. 很显然操作系统需要把应用程序从硬盘加载到内存中去,需要在内存中分配出一块连续的区域,那程序可以正常地跑起来,那么这时候需要去分配内存,分配连续空间。
  2. 应用程序在运行的时候,它需要去访问数据,这时候需要给数据分配块空间,这也是操作系统来完成,它希望能够给应用程序提供它所需要的内存空间,当然这个空间也需要是连续的。

为此操作系统需要管理整个空闲的和非空闲的内存空间,它需要知道哪些空间是已经被占用了,哪些空间还是空闲的,这实际上是有一些数据结构和算法来有效地进行管理。
在这里插入图片描述
为此在这里面首先介绍三个简单的内存分配算法,包括首次适配、最佳适配、还有最差适配。这三种内存分配算法。

3. 首次适配算法

在这里插入图片描述

什么叫首次适配算法?

字面意思还是比较好理解,首先看看上述例子,这例子有三块空闲空间,1K、2K 和500B,地址也是由 0 地址开始到最后的 Max最大地址空间。在整个存储里面存在了三块空间空间。
~  
那如果应用程序提出一个需求,要分配 n 个 BYTE,首先需要找到第一个能够满足这个需求的空闲块。把这个块就分配给应用程序。

那基于这个原则,看一看刚才说到的1K、2K、 500 byte 按照这个地址顺序来找,如果从低地址和高地址找,如果采用 First-fit 分配策略的话,那么应该是选择哪空闲块分配出去?

其实就是第一个空间块,因为它从0 地址开始往下找,第一个碰到的就是1K,而这个1K 空间块能够满足应用程序发出400 BYTE 的应用需求,所以说这就是 First-fit 分配算法的执行过程。

这个算法看起来是挺简单,也便于实现,但其实它有一定需求,还有它的特点,那么它需求什么呢?

在这里插入图片描述

首先,需要把空闲的内存块按照地址排序,从0地址开始找,一个一个空闲块开始找,按照地址顺序,那么第一个满足内存请求大小的空间块就能够就是分配出去了。

但是也需要注意这个分配过程中还存在另一过程回收那在回收过程中需要考虑,是否能够把空闲的块合并一下,合并就可以使我们有更大的空间块。为什么这么说呢?

因为一旦能够形成更大空间块之后,其实可以满足更多的应用需求,特别是这种大的内存应用需求。这是First-fit 分配策略的时候需要考虑的问题。

那么这种方法的优点是什么?

  1. 它的优点其实也很直接,第一个简单。可以看出来,确实找到第一个,不管后面,第一个能够满足需求就马上返回了。
  2. 它能够产生更多更大的空闲块。因为找到第一个之后,可能后面还有很多大的空间块,就不需要去破坏,把这个大空闲块变得更小,这也是它的好处。

那它不好的在什么地方呢?
容易产生外碎片。因为它把第一个块找到之后,下一次再找可能又找到下一个空闲块,那么这两个空闲块之间的那个空间可能就不太容易被使用到,因为它已经比较小了。外碎片问题会随动态分配和释放,持续加剧,从而使得这个算法在某些情况下就不太适用了。

4. 最优适配算法

第二个为 Best-fit——最优适配算法,相对于首次适配算法而言,它有新的特点,它寻找整个适配块中最适合的空闲块,最适合满足分配请求的空闲块。什么叫最适合,实际就是说它的力度会比分配请求的那个力度要大,但是它们的差值是最小的,这是最匹配最贴近,这就为 best-fit 的含义。
在这里插入图片描述

看看这幅图,如果采取最优适配算法的话,那么到底应选择哪一个空间块分配出去呢?

也是一样分配 400 byte,那可以看出来最匹配 400 byte 的空闲块是 500 byte 空闲块,所以说会把最后一个500 byte 空闲块给分配出去,可以看到会产生一个 100 byte 的空闲块,那么这100 byte空闲空间将来很难被使用到,因为将来的需求可能都大于100,那空闲的100 就不太好用。

在这里插入图片描述
那它的要求是什么呢?

避免把大的空间块拆散,找的空间块一定是最适合这个分配请求的 size ,所以可避免对大空闲块拆分。另一方面,外碎片的产生可达到最小化。
~  
为了完成这个算法,要把空闲内存块排好序,最好是能够按照 size 来排序。这样的话就可以比较容易在链表中找到满足最贴近分配请求 size 的空间块的位置,同时在做回收的时候也需要考虑怎么能够把它合并,这一点也是跟前面一样是比较困难。

它的好处什么呢?

对于大多数小内存分配的情况比较合适,相对而言也比较简单。

不好的地方在哪呢?

它把外碎片拆得比较细,使得将来进一步使用外碎片的可能性比较小,使得将来整个空间中很碎的、很小的空闲块到处都存在,不利于后续空间的分配和管理。

5. 最差适配算法

在这里插入图片描述
它的特点是找到一个空闲的内存块,它与内存分配请求的 size 差距是最大的,把这种块作为分配的对象分配出去。

以刚才例子为例,如果是1K 2K 500 byte 空闲块,如果采取最坏适配算法的话,那么其实可以看到应该选择2K byte 空闲块,因为它和分配请求400 byte 的差距是最大的。

算法的特点是可以首先把大的空间块给拆分了,可以理解为好,也可以理解为不好的地方,那么它可以把大块变成小块,小块还继续保留,这是它的一个特点。尽量拆分大块的方法使得避免产生大量的、琐碎的、小的碎片,这是它的特点。
在这里插入图片描述
如果为能够实现这种算法,也需要对空闲的块做排序,根据它的 size 来排序,这样可以更好地选择到底哪一个块是与分配请求的 size 是差距最大的。

第二个也需要考虑怎么去合并,它的分配效率相对来说是比较快的,它的好处是说如果分配请求尽量是比较大的、中大型的 size 的话,那么采取最坏适配算法是比较合适的。

但是不好的地方在哪呢?

它一开始就要去拆那个大块,带来的问题就是将来再去分配这种大块就可能分配不到了,这是它的问题,大块的这种处理使得对这种大块的请求会带来一定影响。

再看看前面讲了三种首次适配、最优适配和最坏适配算法,这三者到底哪个是最好的一个算法吗?

其实这里面没有最好算法的说法,为什么这么说呢?因为应用程序的请求是随机产生的,或者说根据特定的应用场景,有各自的特点,有可能应用程序一会是需要大的空闲块,一会需要小的空闲块,有时候它可能一直需要小的,或者一直需要大的,而这个需求是随机的、可变的。

那么这几种算法,没有一种是能够满足所有的需求,所以这些算法可以理解为是一种简单的内存管理算法,实际应用中有一些更复杂的算法,后续做进一讲解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/17755.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL学习/复习3约束

一、表的常用约束 二、null、not null 三、默认值default 3.1default与null 四、注释commen 注意事项:desc查不到注释 五、zerofill 5.1填充0以控制宽度 六、primary_key 6.1复合主键 七、auto_increment 7.1last_insert_id() 八、unique 8.1unique与primary_key …

python视频编辑中的蒙版技术:创意与技术相结合

在数字视频编辑的世界里,蒙版技术是一种强大的工具,它允许我们在视频帧上进行精确的编辑和效果叠加。通过蒙版,我们可以控制哪些部分的视频内容被显示或隐藏,从而创造出各种视觉效果和过渡。在本文中,我们将探讨如何使…

文件操作和IO

目录 一. 文件预备知识 1. 硬盘 2. 文件 (1) 概念 (2) 文件路径 (3) 文件类型 二. 文件操作 1. 文件系统操作 [1] File常见的构造方法 [2] File的常用方法 [3] 查看某目录下所有的目录和文件 2. 文件内容操作 (1) 打开文件 (2) 关闭文件 (3) 读文件 (4) 写文件 …

PCB结构与组成

PCB板就是印制电路板,又称印刷电路板,是电子元器件电气连接的提供者。PCB板转化成我们所熟悉的电路板过程如下: 了解完定义,下面是我们电路板的标识 可简单的把PCB板拆分成六个部分:导线、铺铜、过孔、焊盘、丝印、阻焊…

OrienterNet在二维公共地图实现视觉定位的模型

论文来自MetaAI: https://arxiv.org/pdf/2304.02009https://arxiv.org/pdf/2304.02009github代码: https://github.com/facebookresearch/OrienterNet?tabreadme-ov-filehttps://github.com/facebookresearch/OrienterNet?tabreadme-ov-file 研究目…

LEAN 之 多态机制(Polymorphism,Type class)简析

LEAN 通过 类型类(Type Class)来提供的多态机制(Polymorphism)。 以∅:Set α 为例,有 Set α 实现 class EmptyCollection。 其中,class EmptyCollection 定义如下: 也就是&#xf…

【微软:多模态基础模型】(1)从专家到通用助手

欢迎关注【youcans的AGI学习笔记】原创作品 【微软:多模态基础模型】(1)从专家到通用助手 【微软:多模态基础模型】(2)视觉理解 【微软:多模态基础模型】(3)视觉生成 【微…

基于java的社区捐赠物品管理系统

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 数据…

机器学习—建立表现基准

让我们来看看一些具体的数字,Jtrain和Jcv是什么,以及如何做出判断,如果学习算法具有高偏差或高方差,使用一个语音识别应用的例子作为讲解。 很多在手机上进行网络搜索的用户会使用语音识别,而不是在手机上的小键盘上打…

阮一峰科技爱好者周刊(第 325 期)推荐工具:一个基于 Next.js 的博客和 CMS 系统

近期,阮一峰在科技爱好者周刊第 325 期中推荐了一款开源工具——ReactPress,ReactPress一个基于 Next.js 的博客和 CMS 系统,可查看 demo站点。(fecommunity 投稿) ReactPress:一款值得推荐的开源发布平台 …

大学语文教材电子版(第十一版)教学用书PDF及课件

大学语文课件:https://caiyun.139.com/m/i?005CiDusEVWnR 《大学语文》(第十一版)主编:徐中玉 齐森华 谭帆。 大学语文教材电子版教师用书PDF第一课《齐桓晋文之事》艺术赏析: 孟子四处游说,养成善辩的…

RK356x-8:Wifi模块AP6xxx配置与调试

本文记录如何根据原理图,配置和调试RK356x(测试用RK3566)主板上wifi/蓝牙模块(测试用AP6212,rkwifibt),使其能正确连网。 1.配置SOC接口 1.1 查看原理图,看看wifi模块用的接口是什…

Java基础——网络编程

可以让设备中的程序与网络上其他设备中的程序进行数据交互(实现网络通信的)。 1. 基本的通信架构 基本的通信架构有2种形式:CS架构(Client客户端/Server服务端)、BS架构(Browser浏览器/Server服务端&…

变分自编码器(VAE, Variational Autoencoder)

代码说明 VAE 模型结构: 编码器将输入数据(如 MNIST 图像)映射到潜在空间,生成均值 (mu) 和对数方差 (logvar)。 通过重新参数化技巧 (reparameterize) 从正态分布中采样潜在向量 z。 解码器将潜在向量 z 映射回原始空间&#xf…

1. Django中的URL调度器 (项目创建与简单测试)

1. 创建 Django 项目 运行以下命令创建一个名为 blog_project 的 Django 项目: django-admin startproject blog_project2. 创建博客应用 Django 中,项目可以包含多个应用。创建一个名为 blog 的应用: cd blog_project python manage.py …

多目标优化算法:多目标黑翅鸢算法(MOBKA)求解ZDT1、ZDT2、ZDT3、ZDT4、ZDT6,提供完整MATLAB代码

一、黑翅鸢算法介绍 黑翅鸢优化算法(Black-winged Kite Algorithm, BKA)是2024年提出的一种元启发式优化算法,其灵感来源于黑翅鸢的迁徙和捕食行为。这种算法通过模拟黑翅鸢在捕食过程中的飞行和搜索策略,被用来解决优化问题&…

记一次Mysql远程连接报错

问题描述: Plugin caching sha2 password could not be loaded: 在wsl2用docker中拉取了mysql镜像,启动后想在win下的环境远程连接到docker中的mysql,报错了,报错如下所示 搜寻了相关的资料发现,在拉下来的myslq版本…

STM32F103移植FreeRTOS

1. 源码下载 在https://www.freertos.org/中下载源码,这里下载的是FreeRTOSv202212.01版本,源码内容解释可参考: https://rtos.100ask.net/zh/FreeRTOS/DShanMCU-F103/chapter7.html#_7-1-freertos%E7%9B%AE%E5%BD%95%E7%BB%93%E6%9E%84拷贝…

CAD多段线两侧偏移(交叉线容易出错)

public void 交叉多段线容易出错(){List<Curve> entse Z.db.SelectEntities<Curve>();List<Polyline> ents Z.db.CurvesToPolyLines(entse);//Z.db.SelectEntities<Polyline>();double offsetDistance 5.0;//偏移距离List<Polyline> resultP…

数据库EVA模式与传统数据库模式 | 分析对比及应用场景

目录 1. 实战场景2. 基本知识3. 应用场景 1. 实战场景 从实战进行探讨以及深入&#xff1a; 事因是同事给我创建表结构的时候&#xff0c;以如下这种方式进行创建&#xff1a; 看到这张表的结构可能会思考&#xff1a; 为啥设备的部件值&#xff08;日期、数值、字符串&…