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

news2024/11/17 21:20:36

文章目录

  • 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.coloradmin.cn/o/2242404.html

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

相关文章

vue内置指令和自定义指令

常见的指令: v-bind : 单向绑定解析表达式, 可简写为 :xxx v-model : 双向数据绑定 v-for : 遍历数组/对象/字符串 v-on : 绑定事件监听, 可简…

蓝桥杯备赛(持续更新)

16届蓝桥杯算法类知识图谱.pdf 1. 格式打印 %03d:如果是两位数,将会在前面添上一位0 %.2f:会保留两位小数 如果是long,必须在数字后面加上L。 2. 进制转化 2.1. 十进制转任意进制: 十进制转任意进制时&#xff…

vue 项目使用 nginx 部署

前言 记录下使用element-admin-template 改造项目踩过的坑及打包部署过程 一、根据权限增加动态路由不生效 原因是Sidebar中路由取的 this.$router.options.routes,需要在计算路由 permission.js 增加如下代码 // generate accessible routes map based on roles const acce…

TensorFlow 2.0 环境配置

官方文档:CUDA Installation Guide for Windows 官方文档有坑,windows的安装指南直接复制了linux的指南内容:忽略这些离谱的信息即可。 可以从官方文档知悉,cuda依赖特定版本的C编译器。但是我懒得为了一个编译器就下载整个visua…

【计算机网络】【传输层】【习题】

计算机网络-传输层-习题 文章目录 10. 图 5-29 给出了 TCP 连接建立的三次握手与连接释放的四次握手过程。根据 TCP 协议的工作原理,请填写图 5-29 中 ①~⑧ 位置的序号值。答案技巧 注:本文基于《计算机网络》(第5版)吴功宜、吴英…

HarmonyOS本地存储-Preferences(用户首选项)的使用

一,用户首选项简述 ohos.data.preferences (用户首选项) 用户首选项为应用提供Key-Value键值型的数据处理能力,支持应用持久化轻量级数据,并对其修改和查询。 数据存储形式为键值对,键的类型为字符串型,值的存储数据…

基于Java Web 的家乡特色菜推荐系统

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…

【售前方案】工业园区整体解决方案,智慧园区方案,智慧城市方案,智慧各类信息化方案(ppt原件)

基于云计算、物联网、移动通信计算的智慧园区集中运营管理平台是一个高度集成化、智能化的管理系统,它利用先进的技术手段对园区进行全方位的监控和管理。 软件资料清单列表部分文档清单:工作安排任务书,可行性分析报告,立项申请审…

Vue2+ElementUI:用计算属性实现搜索框功能

前言: 本文代码使用vue2element UI。 输入框搜索的功能,可以在前端通过计算属性过滤实现,也可以调用后端写好的接口。本文介绍的是通过计算属性对表格数据实时过滤,后附完整代码,代码中提供的是死数据,可…

CSS实现炫酷的水波纹效果

炫酷的水波纹效果 看好了&#xff0c;下面是我最后的波纹了 实现代码 HTML&#xff1a; <div class"container"></div> <script src"https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.js"></script>CSS: body{height: 1…

【会话文本nlp】对话文本解析库pyconverse使用教程版本报错、模型下载等问题解决超参数调试

前言&#xff1a; 此篇博客用于记录调用pyconverse库解析对话文本时遇到的问题与解决思路&#xff0c;以供大家参考。 文章目录 pycoverse介绍代码github链接问题解决1 [cannot import name ‘cached_download‘ from ‘huggingface_hub‘ 问题解决](https://blog.csdn.net/wei…

单元测试时报错找不到@SpringBootConfiguration

找到问题出现原因&#xff1a; 错误表示 Spring Boot 在运行测试时无法找到 SpringBootConfiguration 注解。 通常&#xff0c;SpringBootTest注解用于加载 Spring Boot 应用上下文&#xff0c;但它需要找到一个带有SpringBootConfiguration&#xff08;或者Configuration&am…

【数据结构】11.哈夫曼树哈夫曼编码

一、哈夫曼树的基本概念 哈夫曼&#xff08;Huffman&#xff09;树又称最优树&#xff0c;是一类带权路径长度最短的树&#xff0c;在实际中有广泛的用途。 路径&#xff1a; 从树中一个节点到另一个节点之间的分支构成这两个节点之间的路径。路径长度&#xff1a; 路径上的分…

AntD表单自定义组件

前言 表单可以说是前端最常见的一种组件&#xff0c;特别是在进行搜索的时候使用的最频繁&#xff0c;自定义表单组件&#xff0c;丰富了搜索框的类型&#xff0c;使数据展现的更灵活 内容讲解 1、官方介绍 AntD-Formhttps://ant.design/components/form-cn#form-demo-cust…

day-83 最少翻转次数使二进制矩阵回文 II

思路 关键在于1的个数要为4的倍数&#xff0c;首先镜像的四个位置肯定一定为4的倍数&#xff0c;如果行和列为奇数则需要单独考虑&#xff0c;如果行和列皆为奇数&#xff0c;那么中心的那个数一定为0 解题过程 再单独考虑如果行和列为奇数&#xff0c;具体参考灵神。如果diff…

Gitcode文件历史记录查看和还原

文件历史记录 文件历史记录用于记录代码文件的更改历史&#xff0c;它允许用户查看文件的不同版本&#xff0c;了解每个版本的修改内容、作者和提交消息。这对于跟踪文件演进、恢复错误更改、审查代码以及了解项目进展都非常有用。 文件历史记录功能提供了以下核心功能&#…

WebSocket协议在Java中的整合

1. 常见的消息推送方式 2.WebSocket API 3.基于WebSocket的实战&#xff08;实时聊天室&#xff09; 这里以解析后端代码为主&#xff0c;前端不作为重点&#xff0c;若想复现项目&#xff0c;请从作者的仓库中拉取代码 WebSocket-chatRoom: 基于WebSocket协议实现一个简单的…

http自动发送请求工具(自动化测试http请求)

点击下载《http自动发送请求工具(自动化测试http请求)》 前言 在现代软件开发过程中&#xff0c;HTTP 请求的自动化测试是确保应用程序稳定性和可靠性的关键环节。为了满足这一需求&#xff0c;我开发了一款功能强大且易于使用的自动化 HTTP 请求发送工具。该工具基于 C# 开发…

【小白可懂】微信小程序---课表渲染

结果展示&#xff1a;&#xff08;代码在最后&#xff09; WeChat_20241116174431 项目简介 在数字化校园建设的大背景下&#xff0c;为了更好地服务于在校师生&#xff0c;我们开发了一款基于微信小程序的课表管理系统。该系统采用了现代化的前端技术和优雅的设计风格&#x…

WinDefender Weaker

PPL Windows Vista / Server 2008引入 了受保护进程的概念&#xff0c;其目的不是保护您的数据或凭据。其最初目标是保护媒体内容并符合DRM &#xff08;数字版权管理&#xff09;要求。Microsoft开发了此机制&#xff0c;以便您的媒体播放器可以读取例如蓝光&#xff0c;同时…