`
oolala
  • 浏览: 100026 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
09c341db-7f05-3f2b-a572-9ee69a5d8a77
unix环境高级编程
浏览量:21733
社区版块
存档分类
最新评论

malloc、free与内存碎片

 
阅读更多

malloc和free大量使用后回造成内存碎片,那么这种碎片形成的机理是什么?   
  如果机理是申请的内存空间大小(太小)所形成的,那么,申请多大的区域能够最大限度的避免内存碎片呢?(这里的避免不是绝对的避免,只是一种概率)

 

内存碎片一般是由于空闲的连续空间比要申请的空间小,导致这些小内存块不能被利用。   
  产生内存碎片的方法很简单,举个例:   
    
  假设有一块一共有100个单位的连续空闲内存空间,范围是0~99。如果你从中申请一块内存,如10个单位,那么申请出来的内存块就为0~9区间。这时候你继续申请一块内存,比如说5个单位大,第二块得到的内存块就应该为10~14区间。   
    
  如果你把第一块内存块释放,然后再申请一块大于10个单位的内存块,比如说20个单位。因为刚被释放的内存块不能满足新的请求,所以只能从15开始分配出20个单位的内存块。   
    
  现在整个内存空间的状态是0~9空闲,10~14被占用,15~24被占用,25~99空闲。其中0~9就是一个内存碎片了。如果10~14一直被占用,而以后申请的空间都大于10个单位,那么0~9就永远用不上了,造成内存浪费。   
    
    
  如果你每次申请内存的大小,都比前一次释放的内村大小要小,那么就申请就总能成功。   
    
  有的人喜欢自己编写内存管理模块,程序一开始就申请一大块内存,然后以后申请内存都在这个大内存中取,配合一定的技巧来减少内存碎片问题。

 

一般按页为单位,4k   
  不过说起来,malloc   ,operator   new   这些都有自己的分配策略,只要不是使用系统API,而是用库,则一般来说不用自己考虑

 

一般来说如果你申请的内存都是比较大,而且比较有规律的话(比如你只申请16k和4k两种大小的内存)就没问题。不过这样的话就要你自己加一个层次来处理这些大内存了。

分享到:
评论

相关推荐

    ESP32带 log 记录的 malloc 动态申请内存,用于debug 调试查找报错原因

    嵌入式C开发中,正确动态使用 malloc,资源中写了一个 ...以ESP32为依托,旨在解决在【嵌入式工程】开发过程中,在动态申请内存这部分,由于 malloc 之后,忘记 free 释放,造成内存溢出导致 MCU重启的问题 参考博文: ...

    stm32f103c8+mem-malloc代码

    使用单片机内存时容易导致内存碎片,且一般单片机的内存都比较小,而且没有MMU,malloc 与free的使用容易造成内存碎片。而且可能因为空间不足而分配失败,从而导致系统崩溃,因此应该慎用,或者自己实现内存管理。...

    用快速固定块内存分配器替换malloc / free

    用xmalloc / xfree替换malloc / free比全局堆快,并且可以防止堆碎片错误。

    内存池源代码,.net环境,便于大规模动态分配内存

    一般使用malloc和free动态开内存时,容易造成内存碎片,使用内存池可以解决内存碎片问题

    内存管理内存管理内存管理

    free:该函数获得指向由 malloc 分配的内存片段的指针,并将其释放,以便以后的程序或操作系统使用(实际上,一些 malloc 实现只能将内存归还给程序,而无法将内存归还给操作系统)。 物理内存和虚拟内存 要...

    为什么航空系统的嵌入式软件都禁止动态分配内存(含源码)

    C 库函数 - malloc() 函数简介 函数的声明 介绍一下用法 malloc的实现机制 虚拟内存地址与物理内存地址 页与地址构成 内存地址构成 ...正确使用free函数释放内存 自定义一套内存分配器 最后

    lockfree-malloc:世界上第一个Web级内存分配器

    与普通的libc分配器不同,它不会碎片化或泄漏内存。 它浪费更少的内存。 对于小型对象(大小小于8kb),开销约为0个字节。 (!) 它是专为64位体系结构而设计的。 雅致。 整个代码库只有大约700行相当干净的C +...

    操作系统(内存管理)

    free:该函数获得指向由 malloc 分配的内存片段的指针,并将其释放,以便以后的程序或操作系统使用(实际上,一些 malloc 实现只能将内存归还给程序,而无法将内存归还给操作系统)。 物理内存和虚拟内存 要理解...

    malloc:我使用系统mmap实现的libc malloc,realloc和free函数; 尺寸分割和优化的空间使用

    如果没有足够的空间来扩大ptr指向的内存分配,则realloc()创建一个新分配,复制“ ptr”指向的旧数据,使其与新分配的存储量一样多,释放旧分配,并返回指向已分配内存的指针。 free-释放“ ptr”指向的内存分配...

    C++动态内存分配(new/new[]和delete/delete[])详解

    当然,C已提供了动态内存分配函数malloc( )和free( ),以及malloc( )的变种(realloc:改变分配内存的大小,calloc:指针指向内存前初始化),这些函数在运行时从堆中(也称自由内存)分配存储单元,但是运用这些库函数...

    千万字肝翻Linux内核源码,对底层原理深耕深分析,从入门到入狱

    内存屏障、内存映射、同步机制、GDB基本功能、CPU缓存、内核启动流程、 syncookie、读写分析、NFS实现框架、网络新特性、skb核心操作、HASH算法、过滤...软硬中断区别、等待队列、字符设备驱动、系统调用、内存碎片。

    memcached全面剖析–2.理解memcached的内存存储

    但是,这种方式会导致内存碎片,加重操作系统内存管理器的负担,最坏的情况下, 会导致操作系统比memcached进程本身还慢。SlabAllocator就是为解决该问题而诞生的。下面来看看SlabAllocator的原理。下面是memcached...

    MCU动态内存管理

    基于C语言在单片机上实现的动态内存管理机制,该机制不会产生内存碎片,测试通过!

    tlsf:两级隔离Fit内存分配器实现

    malloc,free,realloc,memalign的O(1)成本 每次分配的开销极低(4个字节) 池的每个TLSF管理的开销很低(〜3kB) 低碎片化 仅编译为几kB的代码和数据 支持动态添加和删除内存池区域 注意事项 当前,假设体系...

    zmalloc-c:内存分配器

    公共接口包括标准的malloc , calloc , realloc和free 。例子# include < stdio># include " ../src/zmalloc.h "// gcc -Wall -Wextra hello.c ../src/zmalloc.c// prints "hello world" to stdoutint main (){ ...

    mysql实现本地keyvalue数据库缓存示例

    3、缓存是映射到文件中的,所以没有malloc、free的开销,以及带来的内存泄露、内存碎片等; 4、如果服务挂掉了,重启后缓存内容继续存在; 5、如果把缓存映射到磁盘文件就算机器挂了,缓存中内容还是会存在,当然有...

    C++堆和栈的区别与联系讲解

    自由存储区:是由malloc等分配的内存块,和堆十分相似,用free来释放。 全局/静态存储区:全局变量和静态变量被分配到同一块内存中(在C语言中,全局变量又分为初始化的和未初始化的,C++中没有这

    C/C++ 中堆和栈及静态数据区详解

    C/C++ 中堆和栈及静态数据区详解  五大内存分区  在C++中,内存分成5个区,他们分别是堆、栈、... 自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。   全

    libusbhost:嵌入式设备的开源USB主机堆栈

    这意味着没有分配和重新分配会影响性能(内存碎片的可能性,执行时间不确定)。 没有malloc(),realloc(),free() 不依赖任何操作系统支持的硬件stm32f4发现支持的设备驱动程序中心游戏手柄-XBox兼容控制器...

Global site tag (gtag.js) - Google Analytics