• 聊聊内存分配器(Memory Allocator)


    为什么需要内存分配器

      系统的物理内存是有限的,而对内存的需求是变化的, 程序的动态性越强,内存管理就越重要,选择合适的内存管理算法会带来明显的性能提升。
      比如nginx, 它在每个连接accept后会malloc一块内存,作为整个连接生命周期内的内存池。 当HTTP请求到达的时候,又会malloc一块当前请求阶段的内存池, 因此对malloc的分配速度有一定的依赖关系。(而apache的内存池是有父子关系的,请求阶段的内存池会和连接阶段的使用相同的分配器,如果连接内存池释放则请求阶段的子内存池也会自动释放)。

      内存分配如果分配不好就会浪费了大量空间,导致产生内存碎片(Memory Fragmentation),这些内存碎片是在系统中不可使用的空闲内存,因为内存分配器不能把这些内存分配使用虽然有大量零散的可用空间,却无法合并提供出来使用。

      所以使用内存分配器就是为了更加高效地更加安全地利用内存

    malloc和free

      通常我们所知道使用的内存分配器,即malloc()/free()函数并不是系统提供的,而是C标准库提供的,也被称为动态内存分配器。分配器从操作系统拿内存(虚拟内存)时是以页为单位(通常是4KB,调用sbrk或mmap), 然后再自行管理。

      这两个函数的作用分别:

    malloc是申请一段内存空间,free就是释放指定的内存空间。

      1. malloc()

        malloc函数的函数原型为:void* malloc(unsigned int size),它根据参数指定的尺寸来分配内存块,并且返回一个void型指针,指向新分配的内存块的初始位置。如果内存分配失败(内存不足),则函数返回null。

      2. free()

        free函数的函数原型为:free(void* pointer)。free函数中的参数必须要不为空,不然就必须是malloc,calloc,realloc中返回值。

  • 相关阅读:
    LOJ10092半连通子图
    LOJ104 普通平衡树
    LOJ10145郁闷的出纳员
    LOJ10144宠物收养所
    LOJ10043
    洛谷P3850 书架
    codevs 1814 最长链
    洛谷 P2022 有趣的数
    codevs 1312 连续自然数和
    noip 2010 引水入城
  • 原文地址:https://www.cnblogs.com/songgj/p/14670721.html
Copyright © 2020-2023  润新知