为什么需要内存分配器
系统的物理内存是有限的,而对内存的需求是变化的, 程序的动态性越强,内存管理就越重要,选择合适的内存管理算法会带来明显的性能提升。
比如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中返回值。