《操作系统 - 清华大学》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.mzph.cn/web/59792.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Mysql基础]表的查询

一、表的增删改查 CRUD : Create(创建), Retrieve(读取),Update(更新),Delete(删除) 1.1 插入否则更新 由于 主键 或者 唯一键 对应的值已经存在而导致插入失败 -- 创建一张学生表 CREATE TABLE students (id INT UNSIGNED PR…

信息安全工程师(83)Windows操作系统安全分析与防护

一、Windows操作系统安全分析 系统漏洞: Windows操作系统由于其复杂性和广泛使用,可能存在一些已知或未知的漏洞。这些漏洞可能会被黑客利用,进行恶意攻击。微软会定期发布系统更新和补丁,以修复这些漏洞,提高系统的安…

Excel超级处理器:高效实现2种批量生成二维码方式

在Excel数据处理中,二维码的批量生成是一个常见且重要的需求。借助Excel超级处理器这一强大的插件,用户可以轻松实现二维码的两种主要批量生成方式:直接在单元格中显示二维码图片,以及直接生成二维码图片并保存在文件夹中。超级处…

vue+svg圆形进度条组件

vuesvg圆形进度条组件 一、实现思路二、ProgressCircle.vue三、父组件使用四、实现效果 一、实现思路 使用svg的circle元素画两个圆形&#xff0c;一个圆形控制进度&#xff0c;一个绘制底色 二、ProgressCircle.vue 代码示例&#xff1a; <template><!-- 圆形进度…

react+hook+vite项目使用eletron打包成桌面应用+可以热更新

使用Hooks-Admin的架构 Hooks-Admin: &#x1f680;&#x1f680;&#x1f680; Hooks Admin&#xff0c;基于 React18、React-Router V6、React-Hooks、Redux、TypeScript、Vite2、Ant-Design 开源的一套后台管理框架。https://gitee.com/HalseySpicy/Hooks-Adminexe桌面应用…

如何基于Tesseract实现图片的文本识别

在前一篇文章基础上&#xff0c;如何将报告图片中的文本解析出来&#xff0c;最近研究了基于Tesseract的OCR方案&#xff0c;Tesseract OCR是一个开源的OCR引擎&#xff0c;主要结合开源的tesseract和pytesseract&#xff0c;实现了jpg/png等格式图片文本识别&#xff0c;供大家…

Vue中template模板报错

直接<v出现如下模板&#xff0c;出现如下错误 注意两个地方&#xff1a; 1.template里面加一个div标签 2.要写name值 如下图

地质旅游平台推动“旅游+地质”融合发展

2024年元旦假期&#xff0c;哈尔滨文旅市场持续火爆。据哈尔滨市文化广电和旅游局大数据测算&#xff0c;截至1月1日&#xff0c;哈尔滨市累计接待游客304.79万人次&#xff0c;实现旅游总收入59.14亿元&#xff0c;游客接待量与旅游总收入达到历史峰值。 夏有进“淄”赶烤&…

Linux源码阅读笔记-V4L2框架基础介绍

V4L2视频设备驱动基础 V4L2 是专门为 Linux 设备设计的整套视频框架&#xff08;其主要核心在 Linux 内核&#xff0c;相当于 Linux 操作系统上层的视频源捕获驱动框架&#xff09;。为上层访问系统底层的视频设备提供一个统一的标准接口。V4L2 驱动框架能够支持多种类型设备&…

机器学习day2-特征工程

四.特征工程 1.概念 一般使用pandas来进行数据清洗和数据处理、使用sklearn来进行特征工程 将任意数据&#xff08;文本或图像等&#xff09;转换为数字特征&#xff0c;对特征进行相关的处理 步骤&#xff1a;1.特征提取&#xff1b;2.无量纲化&#xff08;预处理&#xf…

机器学习 - 为 Jupyter Notebook 安装新的 Kernel

https://ipython.readthedocs.io/en/latest/install/kernel_install.html 当使用jupyter-notebook --no-browser 启动一个 notebook 时&#xff0c;默认使用了该 jupyter module 所在的 Python 环境作为 kernel&#xff0c;比如 C:\devel\Python\Python311。 如果&#xff0c…

w038基于SpringBoot的网上租赁系统设计与实现

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0…

【AI图像生成网站Golang】JWT认证与令牌桶算法

AI图像生成网站 目录 一、项目介绍 二、雪花算法 三、JWT认证与令牌桶算法 四、项目架构 五、图床上传与图像生成API搭建 六、项目测试与调试(等待更新) 三、JWT认证与令牌桶算法 在现代后端开发中&#xff0c;用户认证和接口限流是确保系统安全性和性能的两大关键要素…

【PS】蒙版与通道

内容1&#xff1a; 、选择蓝色通道并复制&#xff0c;对复制的蓝色通道ctrli进行反向选择&#xff0c;然后ctrll调整色阶。 、选择载入选区&#xff0c;然后点击rgb。 、点击蒙版 、点击云彩图层调整位置 、点击色相/饱和度&#xff0c;适当调整 、最后使用滤镜等功能添加光圈…

树莓派4B Qt+FFMPEG 多线程录制USB相机mjpeg数据流“h264_omx“硬件编码的MP4文件

文章目录 1 前言2 一些问题说明2.0 树莓派4b系统版本2.1 Qt2.2 FFMPEG2.3 图像格式 3 核心代码3.0 代码逻辑3.1 pro文件3.2 avframequeue.cpp3.3 decodethread.cpp 4 资源下载 1 前言 本项目为在树莓派4B开发板上&#xff0c;通过QtFFMPEG以多线程分别解码、编码USB摄像头视频数…

i春秋-Hash(__wakeup沉默、序列化)

练习平台地址 竞赛中心 题目描述 题目内容 啥也没有就一个标签跳转 点击后的确发生了跳转 观察到url中有key和hash两个值&#xff0c;猜测hash是key的hash 查看源代码发现确实是 $hashmd5($sign.$key);the length of $sign is 8 解密得到$sign应该为kkkkkk01 构造122的hash i…

【C语言指南】C语言内存管理 深度解析

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《C语言指南》 期待您的关注 引言 C语言是一种强大而灵活的编程语言&#xff0c;为程序员提供了对内存的直接控制能力。这种对内存…

解决vue3+ts打包项目时会生成map文件

在正常未配置的情况下使用npm run build 命令打包&#xff0c;会生成很多的js和map文件,map文件是为了方便我们在生产环境进行更友好的代码调试&#xff0c;但是这样就存一个安全问题&#xff1b;容易被攻击&#xff1b; 解决方法&#xff1a;在package.json文件&#xff0c;重…

MySQL:表设计

表的设计 从需求中获得类&#xff0c;类对应到数据库中的实体&#xff0c;实体在数据库中表现为一张一张的表&#xff0c;类中的属性就对应着表中的字段&#xff08;也就是表中的列&#xff09; 表设计的三大范式&#xff1a; 在数据库设计中&#xff0c;三大范式&#xff0…

使用 Azure OpenAI 服务对数据进行联合 SharePoint 搜索

作者&#xff1a;来自 Elastic Gustavo Llermaly 使用 Azure OpenAI 服务处理你的数据&#xff0c;并使用 Elastic 作为向量数据库。 在本文中&#xff0c;我们将探索 Azure OpenAI 服务 “On Your Data”&#xff0c;使用 Elasticsearch 作为数据源。我们将使用 Elastic Shar…