17 空闲空间管理

news2024/11/15 17:57:52

目录

假设

底层机制

分割与合并

  追踪已分配空间的大小

嵌入空闲列表

让堆增长

基本策略

最优匹配

首次匹配

下次匹配

其他方式

  分离空闲列表

伙伴系统

小结


分页是将内存成大小相等的内存块,这样的机制下面,很容易去管理这些内存,但是又出现了一点问题,就是无法保证一直分配的时候是大小相等的,比如malloc函数,或者操作系统分段,这些都会将内存分为大小不一的,所以也就是出现了内存碎片,导致后续的请求可能失败。那么就是要学会空闲空间的管理才是最好的。

假设

这些库的空间被称为堆,这个堆上管理空闲空间的数据结构被称为空闲列表,用来管理内存区域中所有空闲块的引用。

在讨论问题之前,先做出一些假设:

  1. 基本接口就是malloc和free那样,需要void * malloc(size),需要一个size,然后的到一个指针,free也就通过这个指针来释放空间。

  2. 在这种分配的情况下,也可能会产生内部碎片,这个时候不做考虑,只需要关注的是外部碎片

  3. 内存一旦被分配,那么就不能再重定向,就属于这个程序了,但是操作系统可以使用分段通过紧凑来减少碎片。

  4. 用户级的空间快要使用完的时候,可以向内核进行申请,请求增加堆的空间,但是这里是在整个生命周期内大小固定。

底层机制

这里首先来介绍分割和合并的基础知识,然后可硬跟踪已经分配的空间,最后讨论如何维护一个列表,来观察这些空间。

分割与合并

假设这里有30字节的堆:

暂时无法在飞书文档外展示此内容

这个就是基本的,通过图的描述可以理解。

如果申请大于10字节的内存会失败,刚好等于10的话,其中每一个都可以满足,但是小于10,就需要使用分割了:

如果要申请一字节,那可以选择第二块空闲地方,将其中开始的第一个字节地址返回给用户,其他的给空闲列表中。

那么也还有一个机制,是叫合并:

  在释放空间的时候,会仔细检查空闲列表,方便在归还后,让空间中有一个较大的空闲块,

  追踪已分配空间的大小

  在释放空间的时候,只需要传入一个指针 ,但是怎么知道大小呢?所以基本有的分配程序都是有一个头,

  1. 这个头中有这个指针的大小,其中可能还会包含一些其他的东西,

  2. 比如额外的指针来加速空间的释放,

  3. 还有幻数来检查完整性

  所以这里需要注意的是,释放空间的时候需要释放头和整个指针的空间,那么在申请的时候也就是要去找这两个和的空闲块去申请。

嵌入空闲列表

书中讲的很多,这里简单的总结一下:目前认识的空闲列表就是一个简单列表,用来描述堆中的空闲内存块。首先需要考虑的是这个空闲列表在哪里?那肯定是在空闲空间中的,所以,如果是4KB的堆的话,要用来分配空间,肯定无法分配到4KB,可以通过mmap()去看到后面剩多少,那么要分小一点的空间的话,就需要用分割,申请内存,也需要注意到头的请求,在归还的时候需要注意合并,不能随意释放,那么整个内存看起来就是一团糟。

让堆增长

在很多内存分配库中都有堆增长的机制,当堆的空间快分完的时候,可以使用某种系统调用,让堆增长,操作系统找到空闲的物理内存页,然后通过映射到请求的进程中的地址空间去,返回新的堆的末尾地址。

基本策略

通过上面的知识可以了解到管理空闲空间的底层机制,接下来就了解以下基本策略。

最优匹配

这个很简单,就是遍历一次,然后找到符合条件最小的那块空间返回用来分配。这个导致了大量的碎片还有就是开销

首次匹配

找到第一个足够大的空间返回,具有速度优势,但是可能会导致开头有很多的小块,那么可以通过基址排序,保持空闲块有序合并操作比较容易,较少内存碎片。

下次匹配

和首次匹配比较像,多维护一个指针,不需要每次都从头开始遍历。

其他方式

  分离空闲列表

拿出来一些空间作为列表,专门给一个应用程序来分配一种或几种内存,其他的用通用的内存分配程序,这些内存可以很快的被释放,使用起来速度等方面也是比较快的。

厚块分配程序(Slab Allocator)是一种用于管理内存分配的技术,常见于操作系统的内核中以及许多网络服务的实现中。它的基本思想是将内存分配成一系列大小固定的块,称为slab,每个slab中包含若干个相同大小的内存块。当需要分配内存时,分配器直接从slab中分配一个内存块,而不是像传统的内存分配器那样分配任意大小的内存块。

这种方式有几个优势:

  1. 减少碎片化:传统的内存分配器在频繁地分配和释放内存时容易产生内存碎片。而slab allocator通过将内存分配成固定大小的块,可以减少内存碎片的产生,提高内存的利用率。

  2. 提高性能:由于slab allocator预先分配了一系列大小固定的块,因此可以减少内存分配时的开销。相比传统的内存分配器,slab allocator通常有更好的性能表现。

  3. 缓存效果:slab allocator通常会为不同大小的slab维护一个slab链表,这样可以更好地利用缓存。例如,可以为常用大小的数据结构(如文件描述符、网络连接等)维护一个slab链表,从而提高缓存的命中率。

  4. 简化管理:由于slab allocator将内存分配成固定大小的块,因此可以更容易地管理内存。例如,可以通过简单的链表操作来管理slab,而不需要复杂的数据结构和算法。

尽管slab allocator有诸多优点,但也有一些限制和缺点。例如,它可能会浪费一些内存空间,因为每个slab都会预先分配一定数量的内存块,而这些内存块可能并不会全部被使用。此外,slab allocator也可能会导致内存分配不均匀,特别是在面对大小不一的内存请求时。

总的来说,slab allocator是一种高效的内存分配技术,特别适用于需要频繁分配和释放相同大小内存块的场景,如操作系统内核和网络服务。

数据结构的初始化和销毁的开销很大[B94]。通过将空闲对象保持在初始化状态,厚块分配程序避免了频繁的初始化和销毁,从而显著降低了开销。

伙伴系统

合并操作是比较重要的,所以为了方便,想出来了一个比较好的方法,当有内存分配请求的时候,将空间一分为2,知道刚好满足需求,然后在释放的时候,可以找到这个最后的,然后一点点回溯,将其合并,这样就比较好。

小结

讨论了最基本的内存分配程序形式。这样的分配程序存在于所有地方,与你编写的每个 C 程序链接,也和管理其自身数据结构的内存的底层操作系统链接。与许多系统一样,在构建这样一个系统时需要这许多折中。对分配程序提供的确切工作负载了解得越多,就越能调整它以更好地处理这种工作负载。在现代计算机系统中,构建一个适用于各种工作负载、快速、空间高效、可扩展的分配程序仍然是一个持续的挑战。

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

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

相关文章

内外网文件传输摆渡工具大全|企业跨网文件交换解决方案

有许多文件传输工具可以用于内外网之间的安全文件传输。以下是一些常用的文件传输工具: 1、FileLink FileLink跨网文件传输系统提供一系列功能,包括文件传输审批、审计、敏感文件检查以及文件操作管控等。这些功能旨在确保文件传输的安全性和合规性&am…

Relaxed MemoryConsistency

SC和TSO都被称之为强(strong)保序模型; because the global memory order of each model usually respects (preserves) per-thread program order;回想一下,对于load和store的所有四种组合(Load -> Lo…

python-dict序列化的数据为啥前后不一致

前情提要及背景:流式数据的二次处理终结篇-CSDN博客 假如直接将dict进行str,那么编码数据都是一致的,但是在postman上就表现不那么好看,如下: 而之前的显示如下: 其中的差别就是单引号与双引号的差别了。 采用如下方案无疑是最笨的方法了: 在Python中,如果你想将处理…

CMakeLists.txt语法规则:数学运算 math

一. 简介 前面几篇文章学习了 CMakeLists.txt语法中的一些常用变量,常用命令,双引号的作用。条件判断语句,循环语句等等。 本文简单学习一下 CMakeLists.txt语法中数学运算 match。 二. CMakeLists.txt语法规则:数学运算 math 在…

倍思|西圣开放式耳机哪个好用?热门机型深度测评!

在数字化生活的浪潮中,耳机已成为我们不可或缺的伴侣。然而,长时间佩戴传统的耳机容易导致的耳道疼痛等问题,严重的话将影响听力。许多人开始寻找更为舒适的佩戴体验。开放式耳机因为不需要需直接插入耳道的设计,逐渐受到大众的青…

创新指南|共创B2B独立站出海“效果”护城河

B2B 共同创造是一种通过在整个创新过程中紧密迭代来与最重要的客户共同创造新业务价值的强大方式。我们的方法是将设计思维、精益创业和商业模式创新的方法与面向客户的特定格式相结合,以激励参与者,同时融入用户、业务和技术合作伙伴-买家视角的关键价值…

LLMs:《Better Faster Large Language Models via Multi-token Prediction》翻译与解读

LLMs:《Better & Faster Large Language Models via Multi-token Prediction》翻译与解读 目录 《Better & Faster Large Language Models via Multi-token Prediction》翻译与解读 Abstract 2、Method方法 Memory-efficient implementation 高效内存实…

鸿蒙OpenHarmony开发板【快速入门】大合集

快速入门 快速入门概述 基于IDE入门 搭建开发环境 搭建Windows环境搭建Ubuntu环境配置远程访问环境创建工程并获取源码 轻量系统(基于Hi3861开发板) 编写“Hello World”程序编译烧录运行 小型系统(基于Hi3516开发板) 编写“Hell…

照片生成ai漫改头像生成漫画全套教程免费(自取)

今天给大家分享一一个AI漫改头像,轻松日增1000,简单操作好上手的一个互联网新项目,哈那其实AI漫改头像也火了差不多有半年左右了, 那其实利用AI软件将真人的照片生成漫画的形象,这个看起来很简单的方法却在小红书上大…

【全开源】Java同城信息付费系统家政服务房屋租赁房屋买卖房屋装修信息发布平台小程序APP公众号源码

同城信息付费小程序是一个集合了本地信息服务的平台,用户可以通过该平台获取各种同城信息,并支付相应的费用以享受特定服务。 信息分类与展示:小程序会根据不同的服务类型对信息进行分类,如家政服务、二手交易、房屋租赁、求职招…

node.js 下载安装 配置环境变量

1 官网下载 需要的版本https://nodejs.org/dist 下载 .msi的文件 2 根据安装向导,安装 3 检查安装 是否成功,winr 输入cmd,输入node --version 回车,查看版本 4 配置换进变量 node路径是 安装时 的安装路径 5 vscode 启动项目…

HTTP/1.1、HTTP/2、HTTP/3 的演变

HTTP/1.1、HTTP/2、HTTP/3 的演变 HTTP/1.1 相比 HTTP/1.0 提高了什么性能?HTTP/2 做了什么优化?HTTP/3 做了哪些优化? HTTP/1.1 相比 HTTP/1.0 提高了什么性能? HTTP/1.1 相比 HTTP/1.0 性能上的改进: 使用长连接的…

【数据结构】详解栈

今天我们主要来了解栈!如果对知识点有模糊,可翻阅以往文章哦! 个人主页:小八哥向前冲~-CSDN博客 所属专栏:数据结构【c语言版】_小八哥向前冲~的博客-CSDN博客 c语言专栏:c语言_小八哥向前冲~的博客-CSDN博…

【ARM】ARM寄存器和异常处理

目录 1.指令的执行过程 2. ARM处理器概述 3.ARM指令集 4.ARM存储模型 5. ARM工作模式 6.ARM寄存器组织 (1)寄存器 (2) ARM寄存器 (3)CPSR寄存器​​​​​​​ 7. ARM异常处理 (1&am…

26 | 备库为什么会延迟好几个小时?

在官方的 5.6 版本之前,MySQL 只支持单线程复制,由此在主库并发高、TPS 高时就会出现严重的主备延迟问题。 coordinator 就是原来的 sql_thread, 不过现在它不再直接更新数据了,只负责读取中转日志和分发事务。真正更新日志的,变成了 worker 线程。而 work 线程的个数,就是…

IDEA远程连接Docker服务

1.确保你的服务器已经安装docker docker安装步骤可查看:CentOS 9 (stream) 安装 Docker 2.安装完docker后开启远程连接 默认配置下,Docker daemon只能响应来自本地Host的客户端请求。如果要允许远程客户端请求,需要在配置文件中打开TCP监听…

CCF-Csp算法能力认证,202206-1归一化处理(C++)含解析

前言 推荐书目,在这里推荐那一本《算法笔记》(胡明),需要PDF的话,链接如下 「链接:https://pan.xunlei.com/s/VNvz4BUFYqnx8kJ4BI4v1ywPA1?pwd6vdq# 提取码:6vdq”复制这段内容后打开手机迅雷…

抖音小店保证金真的能退回吗?内行人的真实情况大揭秘!

哈喽~我是电商月月 新手开抖音小店都会纠结于保证金的缴纳,不同类目保证金金额不同,不同营业执照办理的店铺,保证金收费也不同,具体的缴纳金额大家可以去浏览器搜索抖店官网进行查询 当然找不到的,也可以直接问我&am…

C++程序设计:C++的内存分布与管理

C的内存分布与管理 栈区堆区全局区代码区常量区 栈区 (1)什么是栈区? 栈区(Stack) 是用于存储函数调用,局部变量和函数参数的一种内存区域,它的特性就是先进后出(FILO)。…

揭秘抖音快速涨10000粉的方法:巨量千川投流让你轻松快速增粉

抖音已经成为了当今社交平台的热门之一,而如何快速涨粉已经成为了很多人关注的焦点。本文将揭秘一种高效的方式——巨量千川投流,通过官方真实流量和真实粉丝,每天快速涨关注,实现快速增粉1000~10万。 巨量千川投流是一种专业的抖…