03-系统篇-内存碎片

一.常见的malloc内存分配原理

1内存分配原理
linux中应用层动态分配内存一般是用的malloc函数,而malloc在glibc中实现时,是用sbrk()来分内存.
在前面的章节中,我们了解到了堆的概念,堆在内存中,是一断连续的内存,并且上往上增长的,而sbrk()的作用是根据指定的size大小,对堆末尾指针进行往上移动或往下移动,从而实现内存的分配与释放。
size>0   分配内存,size<0   释放内存

2常见malloc和free内存管理逻辑
操作系统的堆内存是连续的,而我们释放内存时,只能对堆末尾的内存进行释放,由于先分配的内存并不一定会先释放,因而,通过sbrk()下移来释放内存在实际中存在问题。
在malloc分配内存时,分配长度=header+用户需要的大小size,header是一个链表节点,包含此段内存是否空闲,此段内存大小,下一个内存的指针。
struct header_t{
     size_t size;
     unsigned int is_free;
     struct header_t *next;
}
若我们调用了free函数,先确认要释放的内存是否在堆的末尾,若在堆末尾,直接操作系统释放,若不在末尾就将is_free;标为空闲,下次使用。
而下一次malloc时,先找一下已存在有链表中,是否有空闲的并且大小合适的内存分配,若有,直接使用,若存在的空闲内存不够大,再调用sbrk()进行分配。

二.内存池原理

实际系统中,由于malloc和free分配内存大小或者分配与释放的时机并不确定,加上内存本身而言就是线性结构,因而肯定会存在正在使用的内存之间有一些内存空闲,但使用不了,这种小的空闲的内存,叫做内存碎片,随着系统分配和释放的频繁,内存碎片会越来越多。
为了减少内存碎片的产生,本节描述了常见解决内碎片的方法,也就是内存池。下面介绍常见的内存池(Apache)的结构。
(1)内存单元结点
struct apr_memnode_t {
  apr_memnode_t*next;           /**< next:指向下一个结点的指针; */
    apr_memnode_t**ref;           /**< 本结点自身 */
    apr_uint32_t  index;              /**< 结点的大小 */
    apr_uint32_t  free_index;       /**< 内存块中未被占用的空间 */
    char         *first_avail;          /**< 可用空间开始位置的指 */
    char         *endp;                 /**< 可用空间结尾位置的指针 */
};

(2)空闲内存管理结点
struct apr_allocator_t {
    apr_uint32_t        max_index;   //free指针数组的最大内存块链表下标
    apr_uint32_t        max_free_index;  //内存分配器所能容纳的最大内存空间数值
    apr_uint32_t        current_free_index;  //内存分配器中还能接收的空间大小
    apr_pool_t          *owner;    //属于哪个内存池
    apr_memnode_t  *free[MAX_INDEX];  //指向一组链表的头结点, MAX_INDEX为20
};

(3)内存池结点
struct apr_pool_t {
    ……
    apr_allocator_t      *allocator;  //空闲内存管理
    apr_memnode_t   *active;//正在使用的内存链表
    ……
};


内存池由上述(1)、(2)、(3)三个节点所构成,下面讲述一下原理。
 

如上图所示,首先内存池结点有两个主要成员,一个是空闲内存管理节点allocator。另外一个是active链表。
allocator可以理解成此内存池剩余的空间,而active表示此内存池正在运行的空间。

1.active:由上图可以知道active是由apr_memnode_t结构体组成的链表,当用户要分配内存时,比如分配内存的大小是size,内存池实际会分配total_size = sizeof(apr_memnode_t)+size,total_size为结构体加上用户需要使用的内存大小。若其中在分配内存时结构体中的index可以取值为0-20,MAX_INDEX为20.   分配内存时,最小分配内存为8K(对应该index=1),超过8K后会以4K为单位累计分配内存,malloc_size = (index-1)*4K+8K  (1 <= index <= 20),因而分配内存的取值最小8K,最大84K,粒度为4K。

若要分配的内存大于84K时,对应的index取值为0。    total_size在哪一个区间,就会对应的分配多少内存从而锁定出对应的index。

2.allocator:由上图可以知道allocator对应apr_allocator_t管理器,其中free是一个数组链表,free的下标的索引就是对应的index,apr_allocator_t管理器是管理空闲内存的,也就是暂时没有使用的内存,根据index可以将空闲的内存放在对应free[index]的所在链表中,从而实现了空闲内存的管理。

3.用户要分配内存,首先可以确认分配内存的index, 然后在allocator管理器查看有没空闲内存,若存在空闲内存,则将空闲的apr_memnode_t 内存节点放在active链表,若没有空闲内存,则从系统中malloc内存。

同样用户释放内存,可以将apr_memnode_t 内存节点从active链表改到allocator管理器上并将内存结点置为空闲。

4.那什么时候将内存返还给系统呢?

(1).整个内存池注销时,所有的内存会一次性全部返还free给系统。

(2).另外需要分配的内存大于apr_allocator_t ->max_free_index时,管理器会在此块内存使用完后,直接还给系统,而不放allocator管理器。 

另外基础篇06-基础篇-缓存与内存泄露讨论的环形缓存也是一种减少内存碎片的办法,内存碎片的解决,实际上就是减少频繁的malloc和free。

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

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

相关文章

语音识别数据的采集方法:基本流程数据类型

“人工智能是一种模仿人类功能的产品。数据采集的方法需要针对特定的场景需求。”—–Mark Brayan (澳鹏CEO) 我们一直说&#xff0c;对于一个高质量的人工智能产品离不开高质量的训练数据。对于不同的人工智能我们需要不同的数据对其训练。要采集正确的数据去训练特定的模型才…

【Apollo】自动驾驶技术的介绍

阿波罗是百度发布的名为“Apollo&#xff08;阿波罗&#xff09;”的向汽车行业及自动驾驶领域的合作伙伴提供的软件平台。 帮助汽车行业及自动驾驶领域的合作伙伴结合车辆和硬件系统&#xff0c;快速搭建一套属于自己的自动驾驶系统。 百度开放此项计划旨在建立一个以合作为中…

SQL语言的分类:DDL(数据库、表的增、删、改)、DML(数据的增、删、改)

数据库管理系统&#xff08;数据库软件&#xff09;功能非常多&#xff0c;不仅仅是存储数据&#xff0c;还要包含&#xff1a;数据的管理、表的管理、库的管理、账户管理、权限管理等。 操作数据库的SQL语言&#xff0c;基于功能&#xff0c;划分为4类&#xff1a; 1、数据定…

单片机第三季-第一课:STM32基础

官方网址&#xff1a;STMCU中文官网 STM32系列分类&#xff1a; 型号命名原则&#xff1a; STM32F103系列&#xff1a; 涉及到的几个概念&#xff1a; DMA&#xff1a;Direct Memory Access&#xff0c;直接存储器访问。DMA传输将数据从一个地址空间复制到另一个地址空间&…

最近

深圳近日经历了一场暴雨&#xff0c;周四夜晚&#xff0c;很多下晚班的同事因为雨水没法顺利打车回家。有个朋友&#xff0c;因为打车的等待时间太长&#xff0c;索性直接在公司过夜了。 早上因为磅礴的大雨我搁浅在家&#xff0c;也是因为下雨&#xff0c;本来要和龙哥一起去广…

Mac电脑怎么使用NTFS磁盘管理器 NTFS磁盘详细使用教程

Mac是可以识别NTFS硬盘的&#xff0c;但是macOS系统虽然能够正确识别NTFS硬盘&#xff0c;但只支持读取&#xff0c;不支持写入。换句话说&#xff0c;Mac不支持对NTFS硬盘进行编辑、创建、删除等写入操作&#xff0c;比如将Mac里的文件拖入NTFS硬盘&#xff0c;在NTFS硬盘里新…

网络原理(一)网络基础,包括IP ,网络相关的定义

网络基础&#xff0c;包括IP &#xff0c;网络相关的定义 网络基础冲突域广播域DNSNATNAPT 网络基础 以下图片是书上的网图。 什么是IP地址&#xff1f; IP地址&#xff08;Internet Protocol Address&#xff09;是指互联网协议地址&#xff0c;又译为网际协议地址。P地址是…

Springboot+druid

1.Druid是Java语言中最好的数据库连接池。Druid能够提供强大的监控和扩展功能。 2.配置maven <dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>${druid-version}</version></dependency>…

【C++基础】实现日期类

​&#x1f47b;内容专栏&#xff1a; C/C编程 &#x1f428;本文概括&#xff1a; C实现日期类。 &#x1f43c;本文作者&#xff1a; 阿四啊 &#x1f438;发布时间&#xff1a;2023.9.7 对于类的成员函数的声明和定义&#xff0c;我们在类和对象上讲到过&#xff0c;需要进行…

数学建模--K-means聚类的Python实现

目录 1.算法流程简介 2.1.K-mean算法核心代码 2.2.K-mean算法效果展示 3.1.肘部法算法核心代码 3.2.肘部法算法效果展示 1.算法流程简介 #k-means聚类方法 """ k-means聚类算法流程: 1.K-mean均值聚类的方法就是先随机选择k个对象作为初始聚类中心. 2.这…

AR工业远程巡查系统:实时监控设备状态,及时发现潜在问题

随着工业4.0的到来&#xff0c;先进的技术和创新的解决方案正在改变着工业生产的方式。其中&#xff0c;增强现实&#xff08;AR&#xff09;技术带来的工业巡检系统就是一个典型的例子。这种系统通过在现实世界中添加虚拟信息&#xff0c;使得操作人员能够更有效地进行检查和维…

LeetCode 49题: 字母异位词分组

题目 给你一个字符串数组&#xff0c;请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 输入: strs ["eat", "tea", "tan", "ate", "nat&qu…

MATLAB实现函数拟合

目录 一.理论知识 1.拟合与插值的区别 2.几何意义 3.误差分析 二.操作实现 1.数据准备 2.使用cftool——拟合工具箱 三.函数拟合典例 四.代码扩展 一.理论知识 1.拟合与插值的区别 通俗的说&#xff0c;插值的本质是根据现有离散点的信息创建出更多的离散点&#xf…

立晶半导体Cubic Lattice Inc 专攻音频ADC,音频DAC,音频CODEC,音频CLASS D等CL7016

概述&#xff1a; CL7016是一款高保真USB Type-C兼容音频编解码芯片。可以录制和回放有24比特音乐和声音。内置回放通路信号动态压缩&#xff0c; 最大42db录音通路增益&#xff0c;PDM数字麦克风&#xff0c;和立体声无需电容耳机驱动放大器。 5V单电源供电。兼容USB 2.0全速工…

问道管理:华为产业链股再度拉升,捷荣技术6连板,华力创通3日大涨近70%

华为产业链股6日盘中再度拉升&#xff0c;到发稿&#xff0c;捷荣技能涨停斩获6连板&#xff0c;华映科技亦涨停收成3连板&#xff0c;华力创通大涨超19%&#xff0c;蓝箭电子涨约11%&#xff0c;力源信息涨超4%。 捷荣技能盘中再度涨停&#xff0c;近7日已累计大涨超90%。公司…

【zookeeper】ZooKeeper的特点及应用场景

ZooKeeper 的特点/设计目标 ZooKeeper&#xff08;动物园管理员&#xff09; &#xff0c;顾名思义&#xff0c;是用来管理Hadoop&#xff08;大象&#xff09;、Hive&#xff08;蜜蜂&#xff09;、Pig&#xff08;小猪&#xff09;的管理员&#xff0c;同时Apache HBase、Ap…

天津web前端培训班 前端是否适合零基础学?

随着HTML 5和ECMAScript 6的正式发布&#xff0c;大量的前端业务逻辑&#xff0c;极大地增加了前端的代码量&#xff0c;前端代码的模块化、按需加载和依赖管理势在必行&#xff0c;因此Web前端越来越被人们重视。 Web前端的就业前景 Web前端开发工程师薪资持续走高&#xff…

汇编语言Nasmide编辑软件

用来编写汇编语言源程序&#xff0c;Windows 记事本并不是一个好工具。同时&#xff0c;在命令行编译源程序也令很多人迷糊。毕竟&#xff0c;很多年轻的朋友都是用着 Windows 成长起来的&#xff0c;他们缺少在 DOS和 UNIX 下工作的经历。 我一直想找一个自己中意的汇编语言编…

CSS中如何实现一个自适应正方形(宽高相等)的元素?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐利用padding百分比⭐2. 利用::before伪元素⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为那些对W…

“系统的UI”——SystemUI

SystemUI的实现 以StatusBar为例&#xff0c;来分析下Android系统具体是如何实现它们的。 相关代码分为两部分&#xff0c;即&#xff1a; Service部分 代码路径&#xff1a;frameworks/base/services/java/com/android/server。 应用部分 代码路径&#xff1a;frameworks…