17 空闲空间管理

目录

假设

底层机制

分割与合并

  追踪已分配空间的大小

嵌入空闲列表

让堆增长

基本策略

最优匹配

首次匹配

下次匹配

其他方式

  分离空闲列表

伙伴系统

小结


分页是将内存成大小相等的内存块,这样的机制下面,很容易去管理这些内存,但是又出现了一点问题,就是无法保证一直分配的时候是大小相等的,比如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 程序链接,也和管理其自身数据结构的内存的底层操作系统链接。与许多系统一样,在构建这样一个系统时需要这许多折中。对分配程序提供的确切工作负载了解得越多,就越能调整它以更好地处理这种工作负载。在现代计算机系统中,构建一个适用于各种工作负载、快速、空间高效、可扩展的分配程序仍然是一个持续的挑战。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录Day 37|Leetcode|Python|● 1049. 最后一块石头的重量 II ● 494. 目标和 ● 474.一和零

1049. 最后一块石头的重量 II 有一堆石头&#xff0c;用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和 y&#xff0c;且 x < y。那么粉碎的可能结…

【C++】详解STL容器之一的deque和适配器stack,queue

目录 deque的概述 deque空间的结构 deque的迭代器 deque的数据设计 deque的优缺点 适配器的概念 ​编辑 stack的概述 stack的模拟实现 queue的概述 queue的模拟实现 deque的概述 deque的设计参考了另外两大容器vector和list。可参考下面两篇文章 详解vector&#x…

Java 语法 (杂七杂八的知识)

面向对象三大特性 封装, 多态, 继承 基本数据类型 一字节 (Byte) 占八位 (bit) JDK, JRE, JVM JDK (Java Development Kit) : Java 开发工具包, 包括了 JRE, 编译器 javac, 和调试工具 Jconsole, jstack 等 JRE (Java Runtime Environment) : Java 运行时环境, 包括了 JVM , …

ssm115乐购游戏商城系统+vue

毕业生学历证明系统 设计与实现 内容摘要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统毕业生学历信息管理难…

【Linux系统】进程控制

再次理解进程 进程&#xff1a;内核的相关管理数据结构(task_struct(进程控制块PCB)&#xff0c;mm_struct(地址空间)&#xff0c;页表) 代码和数据 那么如何理解进程具有独立性&#xff1f; 我们之前已经学习过进程控制块啊&#xff0c;地址空间啊&#xff0c;页表啊&…

什么是期货?期货的基础知识有哪些?

期货是一种标准化的远期合约&#xff0c;允许买卖双方在未来特定时间以预定价格交易货物或金融资产。也是一种金融衍生品&#xff0c;它为市场参与者提供了一种管理价格波动风险和进行投资的工具。 期货的基础知识有哪些 期货市场是一个复杂的金融环境&#xff0c;对于初学者来…

程序猿敲代码费脑掉头发?来看看铁打的便捷,Baidu Comate智能代码助手

前言&#xff1a;Baidu Comate 前世今生 Baidu Comate 安装教程 官网安装教程 手动安装教程 登录使用 插件功能初体验 代码生成指令板块 简易代码生成 代码解释 代码补充 代码注释 多种类智能问答&知识集调用 Paddle团队官方知识集 前言&#xff1…

设计模式(2)——工厂方法模式

目录 1. 摘要 2. 需求案例(设计一个咖啡店的点餐系统) 2.1 咖啡父类及其子类 2.2 咖啡店类与咖啡类的关系 3. 普通方法实线咖啡店点餐系统 3.1 定义Coffee父类 3.2 定义美式咖啡类继承Coffee类 3.3 定义拿铁咖啡继承Coffee类 3.4 定义咖啡店类 3.5 编写测试类 4. 简…

影响视频视觉质量的因素——各类视觉伪影

模糊效应&#xff08;Blurring Artifact&#xff09; 图像模糊&#xff08;blurring&#xff09;&#xff1a;平滑图像的细节和边缘产生的现象&#xff0c;模糊对于图像来说&#xff0c;是一个低通滤波器&#xff08;low-pass filter&#xff09;。一般而言&#xff0c;用户更…

VisualGDB:Linux静态库项目创建、编译及库的使用

接上篇《VisualGDB&#xff1a;Linux动态库项目创建、编译及库的使用》&#xff0c;静态库的创建和使用与动态库基本无差别&#xff0c;唯一需要做的就是指定项目生成静态库。 一、指定项目生成静态库 二、重新构建和编译项目 这里注意&#xff0c;同样要copy一个libxxx.so格式…

服务器数据恢复—RAID5磁盘阵列两块盘离线的数据恢复过程

服务器故障&#xff1a; 服务器中有一组由多块硬盘组建的raid5磁盘阵列&#xff0c;服务器阵列中2块硬盘先后掉线导致服务器崩溃。 服务器数据恢复过程&#xff1a; 1、将故障服务器中所有磁盘编号后取出&#xff0c;由硬件工程师对掉线的两块磁盘进行物理故障检测&#xff0c…

Linux 文件

文章目录 文件操作回顾(C/C)系统调用接口 管理文件认识一切皆文件C/C的文件操作函数与系统调用接口的关系……重定向与缓冲区 -- 认识重定向与缓冲区 -- 理解使用重定向缓冲区实现一个简单的Shell(加上重定向)标准输出和标准错误(在重定向下的意义) 磁盘文件磁盘存储文件操作系…

聊天框 - 微信加载历史数据的效果原来这样实现的

原文&#xff1a;https://juejin.cn/post/7337114587123335180?searchId20240509192958AF7D129567F92AD7E083 公众号&#xff1a;程序员白特&#xff0c;欢迎一起交流学习~ 前言 我记得2021年的时候做过聊天功能&#xff0c;那时业务也只限微信小程序 那时候的心路历程是&am…

win7开启远程桌面却连接不上,如何解决Win7系统开启远程桌面但无法连接的问题

在使用Win7系统时&#xff0c;有时候我们可能会遇到这样的问题&#xff1a;已经成功开启了远程桌面功能&#xff0c;但尝试连接时却总是失败。这可能是由于多种原因导致的&#xff0c;下面我们将详细分析并提供相应的解决方案。 确保本地网络连接正常 可以尝试通过Ping命令测试…

【start和run的区别(面试题)及创建线程的五种写法】

线程 1.start和run的区别2.创建线程的五种写法1.继承Thread,重写run2.实现runnable&#xff0c;重写run3.继承Thread,重写run,使用匿名内部类4.实现Runnable,重写run,使用匿名内部类5.使用lambda表达式 1.start和run的区别 1.start方法内部&#xff0c;是会调用到系统api&…

MATLAB 三维空间中在两点之间等间隔插入多个点 (67)

MATLAB 三维空间中在两点之间等间隔插入多个点 (67) 一、算法介绍二、算法实现1.代码2.结果一、算法介绍 用于加密直线点云,具体为根据给定的直线端点,沿着该直线方向,插入多个点,从而加密。具体方法和效果如下所示: 二、算法实现 1.代码 代码如下(示例): % 定…

融知财经:期货在哪里可以交易?期货交易有哪些交易规则?

作为当前金融市场的一种投资方式&#xff0c;期货只适合一些投资者&#xff0c;比如想获得高收益的投资者&#xff0c;因为期货的风险系数很高。但是很多投资者还不知道期货的意思&#xff0c;在一个固定的交易场所&#xff0c;期货是买卖标准化商品或金融资产的远期合约的交易…

SAP sq01,sq02,sq03创建query报表

步骤&#xff1a;1&#xff0c;SQ03创建用户组&#xff08;User Group&#xff09; 2&#xff0c;SQ02创建信息集&#xff08;InfoSet&#xff09; 3&#xff0c;SQ03分配用户和InfoSet 4&#xff0c;SQ01创建查询 5&#xff0c;SE93给Query分配Tcode 1&#xff0c;SQ03创建用…

pikachu靶场搭建(保姆级,手把手教学)

&#xff08;phpstudy安装pikachu配置&#xff09; 1.下载phpstudy&#xff08;以Windows系统为例&#xff09; 下载地址&#xff1a;https://www.xp.cn/download.html 1.打开网址 2.点击立即下载 3.选择适合自己的版本 查看自己电脑版本&#xff1a; 打开设置找到系统点击…

effective python学习笔记_函数

函数返回值尽量不要超过三个 局限性&#xff1a;当返回参数过多时&#xff0c;有时会搞混哪个是哪个&#xff0c;可能返回的两个值反了 解决方法&#xff1a;如果参数过多&#xff0c;可以组装*变量返回&#xff0c;或者自定义轻量类型或namedtuple返回 有意外情况时尽量抛异…