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

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两种大小的内存)就没问题。不过这样的话就要你自己加一个层次来处理这些大内存了。

分享到:
评论

相关推荐

    C语言实例-实现malloc与free函数完成内存管理.pdf

    这样的自定义内存管理虽然简单,但并不能完全替代标准的malloc和free,因为它缺乏一些高级特性,比如内存碎片管理、多线程安全等。在实际项目中,更复杂的内存管理系统可能会包含内存池、链表管理、锁同步等机制,以...

    C语言实现malloc和free

    4. **碎片控制**:长期使用`malloc`和`free`可能导致内存碎片,即内存中存在大量小的未使用区域,但不足以满足新的分配请求。自己实现时,可能需要考虑如何有效地重新组织内存以减少碎片。 5. **错误处理**:当内存...

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

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

    浅谈C中的malloc和free

    虽然很多初学者只知道如何使用`malloc()`分配内存然后用`free()`释放内存,但实际上这两个函数的理解与应用远不止于此。本文将对`malloc()`和`free()`进行深入解析,力求全面覆盖这两个函数的知识点。 #### malloc...

    cJSON_malloc_

    3. **内存碎片**:频繁的`malloc()`和`free()`操作可能导致内存碎片,影响程序性能。合理规划内存使用和适时的内存整理有助于减少碎片。 4. **内存越界**:避免超出分配的内存范围访问,这可能导致程序崩溃或数据...

    stm32f103c8+mem-malloc代码

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

    mem.rar_Free!_malloc_malloc和free_mem_free_mem_malloc

    然而,malloc和free在实际应用中可能存在效率问题,例如内存碎片、边界检查等。因此,有时候我们需要实现自己的内存管理函数,如“mem_malloc”和“mem_free”。这通常涉及到更复杂的设计,比如内存池、链表管理、...

    Malloc动态内存申请函数

    例如,提供的压缩包中的"Malloc.c"和"Malloc.h"可能是对标准malloc的优化实现,可能包含如内存碎片减少、内存分配性能提升等特性。 内存管理不仅涉及到malloc和free,还包括calloc(一次性初始化所有分配的字节)、...

    自己动手写malloc函数

    2. **内存碎片(Memory Fragmentation)**:连续的内存空间因分配和释放操作变得不连续,导致无法为大块内存分配空间,即使总的空闲内存足够。 3. **内存块(Memory Block)**:`malloc`分配的内存通常以块为单位,...

    内存分配方式及内存碎片

    内存碎片分为内部碎片和外部碎片。内部碎片是分配给进程的内存比实际需要的大,多余的那部分无法再利用。外部碎片则是多个小的空闲内存块无法合并成一个大块,导致大的内存需求无法满足。外部碎片可以通过内存整理...

    malloc 内存管理内幕

    - **Bitmapped算法**:这种算法通过位图来追踪内存的使用情况,相比First-Fit算法在内存分配上更为高效,但同样面临着内存碎片问题,尤其是在频繁的内存分配与释放过程中。 #### 嵌入式实时动态内存管理机制 为了...

    csapp的malloc实验分析

    5. **内存释放**:free函数与malloc相对应,负责释放不再使用的内存。正确地管理内存释放是防止内存泄漏的关键。 6. **内存重新分配**:realloc函数可以改变已分配内存的大小。如果需要扩展,malloc可能会尝试在...

    malloc_89.rar

    《malloc函数在C语言中的空间分配与管理》 在C语言编程中,内存管理是至关重要的环节,特别是在处理大量数据时。...在实际编程中,应结合free和realloc灵活运用,同时注意避免内存泄漏和内存碎片,以优化程序性能。

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

    传统的`malloc`和`free`函数在处理内存分配和释放时,虽然方便,但可能会导致效率问题和内存碎片。尤其是在频繁进行小块内存分配的场景下,全局堆的性能会显著下降,而且容易产生难以察觉的内存泄漏或内存碎片。因此...

    Malloc和mfree函数的实现原理

    - **合并相邻块**:`mfree`函数的一个关键特性是它能够合并相邻的空闲块,从而减少内存碎片并提高内存利用效率。 - **更新内存映射**:释放内存后,`mfree`函数会更新`coremap`或`swapmap`,标记该块为空闲,并可能...

    malloclab_malloclab_malloclab_c_

    在malloclab中,我们需要实现自己的`malloc`函数,考虑如何有效地管理内存池,处理内存碎片,以及确保内存的安全分配。 2. `calloc(size_t num, size_t size)`:与`malloc`类似,但它会分配指定数量的元素,每个...

    用户空间内存管理 Uclibc中的malloc机制分析

    在用户空间中,经常需要通过`malloc`与`free`函数来进行动态内存的申请与释放,这些操作通常发生在进程的堆空间中。在嵌入式Linux系统中,Uclibc是非常流行的C库之一,它提供了轻量级且高效的内存管理功能。 #### ...

    malloc实现源码

    本文将深入探讨malloc的实现原理,特别关注其内存碎片收集策略、高效分配机制以及良好的移植性。 内存管理的核心任务是为程序分配和回收内存。malloc的工作原理是在进程的堆区中寻找合适的空闲内存块来满足程序的...

    09丨深入理解堆:malloc和内存池是怎么回事?1

    glibc中的malloc实现采用了一些优化策略,如内存池技术,以减少内存碎片和提高分配速度。 malloc的基本功能是接收一个大小参数,然后在堆上分配相应大小的内存,并返回其地址。当不再需要内存时,使用free函数将其...

Global site tag (gtag.js) - Google Analytics