【C 数据结构-动态内存管理】3. 伙伴系统管理动态内存

文章目录

  • 【 1. 伙伴系统的结构设计 】
  • 【 2. 分配算法 】
  • 【 3. 回收算法 】

  • 伙伴系统 本身是一种动态管理内存的方法,和边界标识法的区别是:使用伙伴系统管理的存储空间,无论是空闲块还是占用块,大小都是 2 的 n 次幂(n 为正整数)。
    例如,系统中整个存储空间为 2 m 2^m 2m 个字。那么在进行若干次分配与回收后,可利用空间表中只可能包含空间大小为: 2 0 2^0 20 2 1 2^1 21 2 2 2^2 22、…、 2 m 2^m 2m 的空闲块。

【 1. 伙伴系统的结构设计 】

  • 伙伴系统中可利用空间表中的结点构成如下图所示:
    header 域表示为头部结点,由 4 部分构成:
    • llinkrlink 为结点类型的指针域,分别用于指向直接前驱和直接后继结点。
    • tag :用于标记内存块的状态,是占用块(用 1 表示)还是空闲块(用 0 表示)
    • kval :记录该存储块的容量。由于系统中各存储块都是 2 的 m 幂次方,所以 kval 记录 m 的值。
      在这里插入图片描述
  • 伙伴系统节点的 C 实现:
typedef struct WORD_b{struct WORD_b *llink;//指向直接前驱int tag;//记录该块是占用块还是空闲块int kval;//记录该存储块容量大小为2的多少次幂struct WORD_b *rlink;//指向直接后继OtherType other;//记录结点的其它信息
}WORD_b,head;
  • 在伙伴系统中,由于系统会不断地接受用户的内存申请的请求,所以会产生很多大小不同但是容量都是为 2 m 2^m 2m 的内存块,所以为了在分配的时候查找方便,系统将大小相同的内存块建立一个链表。对于初始容量为 2 m 2^m 2m 的一整块存储空间来说,形成的链表就有可能有 m+1 个,为了更好的对这些链表进行管理,系统将这 m+1 个链表的表头存储在数组中,就类似于邻接表的结构,如下图所示:
    在这里插入图片描述
  • 可利用空间表的 C 实现:
#define m 16//设定m的初始值
typedef struct HeadNode {int nodesize;//记录该链表中存储的空闲块的大小WORD_b * first;//相当于链表中的next指针的作用
}FreeList[m+1];//一维数组

【 2. 分配算法 】

  • 伙伴系统的分配算法很简单。假设用户向系统申请大小为 n 的存储空间,若 2 k − 1 < n ≤ 2 k 2^{k-1} < n \leq 2^k 2k1<n2k,此时就需要查看可利用空间表中大小为 2 k 2^k 2k 的链表中有没有可利用的空间结点:
    • 如果该链表不为 NULL,可以直接采用头插法从头部取出一个结点,提供给用户使用;
    • 如果大小为 2k 的链表为 NULL,就需要依次查看比 2 k 2^k 2k 大的链表,找到后从链表中删除,截取相应大小的空间给用户使用,剩余的空间,根据大小插入到相应的链表中。
  • 例如,用户向系统申请一块大小为 7 个字的空间,而系统总的内存为 24 个字,则此时按照伙伴系统的分配算法得出: 2 2 2^2 22 < 7 < 2 3 2^3 23,所以此时应查看可利用空间表中大小为 2 3 2^3 23 的链表中是否有空闲结点:
    • 如果有,则从该链表中摘除一个结点,直接分配给用户使用;
    • 如果没有,则需依次查看比 2 3 2^3 23 大的各个链表中是否有空闲结点。假设,在大小 2 4 2^4 24 的链表中有空闲块,则摘除该空闲块,分配给用户 2 3 2^3 23 个字的空间,剩余 2 3 2^3 23 个字,该剩余的空闲块添加到大小为 2 3 2^3 23 的链表中,如下图所示:
      在这里插入图片描述
  • 使用伙伴系统进行存储空间的管理过程中,在用户申请空间时,由于大小不同的空闲块处于不同的链表中,所以 分配完成的速度会更快,算法相对简单

【 3. 回收算法 】

  • 无论使用什么内存管理机制,在内存回收的问题上都会面临一个共同的问题:如何把回收的内存进行有效地整合,伙伴系统也不例外。
  • 当用户申请的内存块不再使用时,系统需要将这部分存储块回收,回收时需要判断是否可以和其它的空闲块进行合并。在寻找合并对象时,伙伴系统和边界标识法不同,在伙伴系统中每一个存储块都有各自的 伙伴当用户释放存储块时只需要判断该内存块的伙伴是否为空闲块,如果是则将其合并,然后合并的新的空闲块还需要同其伙伴进行判断整合,反之直接将存储块根据大小插入到可利用空间表中即可
  • 判断一个存储块的伙伴的位置时,采用的方法为:如果该存储块的起始地址为 p,大小为 2 k 2^k 2k,则其伙伴所在的起始地址为:
    { p + 2 k ,若 p 取余 2 k + 1 = 0 p − 2 k ,若 p 取余 2 k + 1 = 2 k \begin{cases} p+2^k,若p取余2^{k+1}=0\\\\ p-2^k,若p取余2^{k+1}=2^k\end{cases} p+2k,若p取余2k+1=0p2k,若p取余2k+1=2k
  • 例如,当大小为 2 8 2^8 28 ,起始地址为 512 的伙伴块的起始地址的计算方式为:
    由于 512 取余 2 9 2^9 29=0,所以,512+ 2 8 2^8 28=768,即如果该存储块回收时,只需要查看起始地址为 768 768 768 的存储块的状态,如果是空闲块则两者合并,反之直接将回收的释放块链接到大小为 2 8 2^8 28 的链表中。
  • 回收存储空间时,对于 空闲块的合并,不是取决于该空闲块的相邻位置的块的状态;而是 完全取决于其伙伴块。所以即使其相邻位置的存储块时空闲块,但是由于两者不是伙伴的关系,所以也不会合并。这也就是该系统的缺点之一:由于 在合并时只考虑伙伴,所以容易产生存储的碎片

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

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

相关文章

新火种AI|挑战谷歌,OpenAI要推出搜索引擎?

作者&#xff1a;一号 编辑&#xff1a;美美 在AI革新的浪潮下&#xff0c;谷歌搜索迎来了越来越多的“挑战者”。 最近&#xff0c;据多家外媒的消息&#xff0c;有知情人士透露&#xff0c;OpenAI正计划上线一款基于ChatGPT的大型产品&#xff0c;将提供一个新的搜索引擎&…

[译]Elasticsearch _source Doc_values And Store Performance

原文地址 https://sease.io/2021/02/field-retrieval-performance-in-elasticsearch.html 在这篇博文中&#xff0c;我想从性能的角度探讨 Elasticsearch 为我们存储字段和查询时检索字段提供了哪些可能性。 事实上&#xff0c;Lucene&#xff08;Elasticsearch 和 Solr 构建的…

【WEB前端2024】开源智体世界:乔布斯3D纪念馆-第16课-跳转私信

【WEB前端2024】开源智体世界&#xff1a;乔布斯3D纪念馆-第16课-跳转私信 使用dtns.network德塔世界&#xff08;开源的智体世界引擎&#xff09;&#xff0c;策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编写的智体世界引擎&am…

Map集合的实现类~HashMap

存储结构&#xff1a;哈希表 键重复依据是hashCode和equals方法&#xff08;键不能重复&#xff09; 添加&#xff1a; 先创建Student类&#xff0c;那么往HashSet添加的就是Student对象作为键值&#xff0c;后面的作为值 删除&#xff1a; 判断&#xff1a; 遍历&#xff1a…

就业班 第三阶段(redis) 2401--5.7 day2 redis2 哨兵(前提是做好了主从)+redis集群

1、设置密码&#xff08;redis&#xff09; 先在redis.conf里面找到这个 后面写上要设置的密码即可 2、哨兵模式 监控redis集群中master状态的的工具 在做了主从的前提下 主 从1 从2 作用 1)&#xff1a;Master状态检测 2)&#xff1a;如果Master异常&#xff0c;则会进行…

(四)JSP教程——request内置对象

request对象是将客户端浏览器数据提交给服务器端JSP页面的唯一数据通道&#xff0c;通过该通道JSP页面能够获取浏览器信息、form表单信息、URL参数信息等。 1.from表单向JSP文件传递数据 form表单是浏览器向服务器传递数据的一种基本机制&#xff0c;包含两种方式&#xff1a;…

C/C++开发环境配置

配置C/C开发环境 1.下载和配置MinGW-w64 编译器套件 下载地址&#xff1a;https://sourceforge.net/projects/mingw-w64/files/mingw-w64/mingw-w64-release/ 下载后解压并放至你容易管理的路径下&#xff08;我是将其放在了D盘的一个software的文件中管理&#xff09; 2.…

快速找出存(不存在)在某个(或多个)文件的文件夹

首先&#xff0c;需要用到的这个工具&#xff1a; 度娘网盘 提取码&#xff1a;qwu2 蓝奏云 提取码&#xff1a;2r1z 想要找出有下面这个文件存在的文件夹 切换到批量文件复制版块&#xff0c;快捷键Ctrl5 右侧&#xff0c;搜索添加 选定范围&#xff0c;勾选搜索文件夹、包…

【牛客】值周

原题链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 差分。 因为l<100000000,所以数组开1e8。 唯一需要注意的点就是前面给b[0]单独赋值为1&#xff08;因为如果在循环中给b[0]赋值&…

网络基础(全)

协议 ”协议“就是一种约定。那么协议需要需要管理吗&#xff1f;答案是当然需要管理呀。 操作系统要进行协议管理——先描述&#xff0c;在组织协议本质就是软件&#xff0c;软件是可以进分层的协议在设计的时候&#xff0c;就是被层状的划分的为什么要划分为层状结呢&#…

Vue3专栏项目 -- 一、第一个页面(上)

一、ColumnList 组件&#xff08;专栏列表组件&#xff09;编码&#xff1a; 该组件要接收一个数组&#xff0c;数组中是一个个专栏数据&#xff0c;数据中包括id、title、avator、description。所以我们定义一个泛型&#xff0c;泛型为id为number类型title为string类型如下这…

远程服务器 docker XRDP 桌面访问 记录

需求描述: 我现在在远程连接 一台服务器&#xff0c;由于需要实验环境需要GUI 和 桌面系统&#xff0c;但是又想在 docker 中运行。因此&#xff0c;我现在首先需要通过 ssh 连接服务器&#xff0c;然后再服务器中连接 docker. REF: https://github.com/danielguerra69/ubuntu-…

如何全面规避医疗数据安全风险?“一中心三大管控域”打开新思路!

作为医院的核心基础设施&#xff0c;数据库已然演变成了一种具有“资产”属性的重要元素。而随着不断变化的医疗业务场景和日趋严格的合规性要求&#xff0c;如何让安全全方位贯穿医疗数据的生命周期&#xff0c;是一项系统性的建设工作&#xff0c;难点诸多。 基于多年的数据…

vue3专栏项目 -- 项目介绍以及准备工作

这是vue3TS的项目&#xff0c;是一个类似知乎的网站&#xff0c;可以展示专栏和文章的详情&#xff0c;可以登录、注册用户&#xff0c;可以创建、删除、修改文章&#xff0c;可以上传图片等等。 这个项目全部采用Composition API 编写&#xff0c;并且使用了TypeScript&#…

视频剪辑神器:批量高效处理,轻松锐化视频让影片焕然一新!

视频已经成为我们记录生活、分享故事、展示才华的重要形式。然而&#xff0c;面对大量的视频文件&#xff0c;如何批量高效剪辑并提升视频质量&#xff0c;成为了许多人的难题。现在&#xff0c;我们为您带来一款视频剪辑神器&#xff0c;让您轻松处理视频&#xff0c;让您的影…

北京大学-知存科技存算一体联合实验室揭牌,开启知存科技产学研融合战略新升级

5月5日&#xff0c;“北京大学-知存科技存算一体技术联合实验室”在北京大学微纳电子大厦正式揭牌&#xff0c;北京大学集成电路学院院长蔡一茂、北京大学集成电路学院副院长鲁文高及学院相关负责人、知存科技创始人兼CEO王绍迪、知存科技首席科学家郭昕婕博士及企业研发相关负…

leetCode81. 搜索旋转排序数组 II

leetCode81. 搜索旋转排序数组 II 题目思路 可以二分后的具体思路见我的上篇博客 搜索旋转排序数组 代码 class Solution { public:bool search(vector<int>& nums, int target) {if(nums.empty()) return false;int R nums.size() - 1;while(R > 0 &&…

【Three.js基础学习】15.scroll-based-animation

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 前言 课程要点 结合html等场景 做滚动动画 1.遇到的问题&#xff0c; 在向下滚动时&#xff0c;下方会显白&#xff08;部分浏览器&#xff09; 解决&#xff1a;alpha:true …

Finder Windows for Mac:双系统窗口,一键切换!

Finder Windows for Mac是一款专为Mac用户设计的实用工具&#xff0c;它模拟了Windows系统的窗口管理功能&#xff0c;让Mac用户也能享受到类似Windows的窗口操作体验。这款软件的主要功能是提供一个浮动面板&#xff0c;帮助用户随时即时访问打开的Finder窗口列表&#xff0c;…

某东抢购某台脚本——高版本

某东抢购某台脚本——高调 小白操作-学习参考 说明 这个脚本用于自动化京东的秒杀过程&#xff0c;特别是对于高需求商品如茅台。它展示了通过自动化工具模拟用户行为的能力&#xff0c;但同时也涉及到了使用自动化脚本可能违反网站使用条款的问题。使用此类脚本前应确保合…