《操作系统 - 清华大学》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.rhkb.cn/news/473174.html

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

相关文章

7.高可用集群架构Keepalived双主热备原理

一. 高可用集群架构Keepalived双主热备原理 (1)主机+备机keepalived配置(192.168.1.171) ! Configuration File for keepalivedglobal_defs {# 路由id:当前安装keepalived节点主机的标识符,全局唯一router_id keep_101 } #计算机节点(主机配置) vrrp_instance VI_1 {</

Notepad++的完美替代

由于Notepad的作者曾发表过可能在开发者代码中植入恶意软件的言论&#xff0c;他备受指责。在此&#xff0c;我向大家推荐一个Notepad的完美替代品——NotepadNext和Notepad--。 1、NotepadNext NotepadNext的特点&#xff1a; 1、跨平台兼容性 NotepadNext基于Electron或Qt…

【Chapter 3】Machine Learning Classification Case_Prediction of diabetes-XGBoost

文章目录 1、XGBoost Algorithm2、Comparison of algorithm implementation between Python code and Sentosa_DSML community edition(1) Data reading and statistical analysis(2)Data preprocessing(3)Model Training and Evaluation(4)Model visualization 3、summarize 1…

Linux(CentOS)安装达梦数据库 dm8

CentOS版本&#xff1a;CentOS 7&#xff0c;查看操作系统版本信息&#xff0c;请查阅 查看Linux内核版本信息 达梦数据库版本&#xff1a;dm8 一、获取 dm8 安装文件 1、下载安装文件 打开达梦官网&#xff1a;https://www.dameng.com/ 下载的文件 解压后的文件 2、上传安…

ReactPress与WordPress:两大开源发布平台的对比与选择

ReactPress与WordPress&#xff1a;两大开源发布平台的对比与选择 在当今数字化时代&#xff0c;内容管理系统&#xff08;CMS&#xff09;已成为各类网站和应用的核心组成部分。两款备受欢迎的开源发布平台——ReactPress和WordPress&#xff0c;各自拥有独特的优势和特点&am…

前后端请求响应

引入 在之前的例子中&#xff0c;我们编写了一个简单的web类&#xff0c;我们运行启动类&#xff0c;启动内嵌的tomcat后就可以在浏览器通过特定的路径访问tomcat中的应用程序。 但之前编写的程序仅仅是个简单的java类&#xff0c;其并未实现某个接口或继承某个类&…

Ubuntu24 上安装搜狗输入法

link 首先在终端中依次输入以下代码 sudo apt update sudo apt install fcitx 找到语言支持 在终端中依次输入 sudo cp /usr/share/applications/fcitx.desktop /etc/xdg/autostart/ sudo apt purge ibus 进入网页 搜狗输入法linux-首页​ shurufa.sogou.com/linux 找到刚才下…

Linux从0——1之shell编程4

声明&#xff01; 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&a…

嵌入式硬件杂谈(二)-芯片输入接入0.1uf电容的本质(退耦电容)

引言&#xff1a;对于嵌入式硬件这个庞大的知识体系而言&#xff0c;太多离散的知识点很容易疏漏&#xff0c;因此对于这些容易忘记甚至不明白的知识点做成一个梳理&#xff0c;供大家参考以及学习&#xff0c;本文主要针对芯片输入接入0.1uf电容的本质的知识点的进行学习。 目…

树莓派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摄像头视频数…

Cartographer激光雷达slam -20241116

Cartographer Cartographer代码结构 cartographer&#xff1a;负责处理来自雷达、IMU和里程计的数据并基于这些数据进行地图的构建&#xff0c;是cartographer理论的底层实现cartographer_ros&#xff1a;基于ros的通信机制获取传感器的数据并将它们转换成cartographer中定义…

Scratch 014生日贺卡(上)

知识回顾&#xff1a; 1、“面向鼠标指针”积木块 2、“重复执行直到”积木块 本次分享制作生日贺卡引入广播模块 案列效果&#xff1a; 生日贺卡上案例效果-CSDN直播 步骤拆解&#xff1a; 1、添加背景和角色 2、编辑贺卡造型添加名字 3、流程图的组成和画法 4、…

外网访问 WebDav 服务

从外部网络环境&#xff08;比如异地和家中网络&#xff09;来访问公司内网的 WebDav 服务&#xff08;基于 IIS &#xff09;并映射成本地虚拟磁盘。 步骤如下 第一步 在公司内网的电脑上设置 webDav。 1&#xff0c;找到【控制面板】&#xff0c;双击进入。 2&#xff0c…

渑池县中药材产业党委莅临河南广宇企业管理集团有限公司参观交流

11月14日&#xff0c;渑池县人大副主任、工商联主席杨航率县中药材产业党委代表团一行13人&#xff0c;莅临河南广宇集团参观交流。河南广宇集团总经理王峰、副总经理王培等领导热情接待并陪同参观、座谈。 代表团一行首先参观了集团旗下郑州美信中医院&#xff08;庚贤堂中医药…

WP网站如何增加文章/页面的自定义模板

通过Wordpress我们后台在发布文章或者页面的时候其实可以看到有些主题 他有选择使用的页面模板&#xff0c;可以自定义模板&#xff0c;但是有些主题却没有选择主题这个功能&#xff0c;那这个自定义模板的功能是如何实现的呢&#xff1f;以下分两种情况&#xff1a;Page页面和…

FFmpeg 4.3 音视频-多路H265监控录放C++开发十四,总结编码过程,从摄像头获得数据后,转成AVFrame,然后再次转成AVPacket,

也就是将摄像头采集到的YUV 的数据换成 AVFrame&#xff0c;然后再次转成 AVPacket&#xff0c;那么这AVPakcet数据要怎么办呢&#xff1f;分为三种情况&#xff1a; 一种是将AVPacket存储成h264文件&#xff0c;由于h264编码器在将avframe变成avpacket的时候就是按照h264的格…

SQL Server 查询设置 - LIKE/DISTINCT/HAVING/排序

目录 背景 一、LIKE - 模糊查询 1. 通配符 % 2. 占位符 _ 3. 指定集合 [] 3.1 表示否定 ^ 3.2 表示范围 - 4. 否定 NOT 二、DISTINCT - 去重查询 三、HAVING - 过滤查询 四、小的查询设置 1. ASC|DESC - 排序 2. TOP - 限制 3. 子查询 4. not in - 取补集&…

动态规划-完全背包问题——322.零钱兑换

1.题目解析 题目来源 322.零钱兑换——力扣 测试用例 2.算法原理 1.状态表示 这里需要寻找硬币使总面值等于一个值求出所需硬币的最小个数&#xff0c;所以不妨设置一个二维dp表&#xff0c;即dp[i][j]&#xff1a;在[1,i]个硬币中选择的硬币总面值完全等于j时所需要的最小硬…

从零到一:利用 AI 开发 iOS App 《震感》的编程之旅

在网上看到一篇关于使用AI开发的编程经历&#xff0c;分享给大家 作者是如何在没有 iOS 开发经验的情况下&#xff0c;借助 AI&#xff08;如 Claude 3 模型&#xff09;成功开发并发布《震感》iOS 应用。 正文开始 2022 年 11 月&#xff0c;ChatGPT 诞生并迅速引发全球关注。…

【Linux庖丁解牛】—Linux基本指令(下)!

目录 1、grep指令 2、zip/unzip指令 3、sz/rz指令 4、tar指令 ​编辑 5、scp指令 6、bc指令 7、uname –r指令 8、重要的几个热键 9、关机 10、完结撒花 1、grep指令 grep是文本过滤器&#xff0c;其作用是在指定的文件中过滤出包含你指定字符串的内容&#xff0c;…