Linux堆内存管理
系统的物理内存是有限的,而对内存的需求是变化的,程序的动态性越强,内存管理就越重要,选择合适的内存管理算法会带来明显的性能提升。 比如nginx
, 它在每个连接accept
后会malloc
一块内存,作为整个连接生命周期内的内存池。 当HTTP请求到达的时候,又会malloc
一块当前请求阶段的内存池,因此对malloc
的分配速度有一定的依赖关系。而apache
的内存池是有父子关系的,请求阶段的内存池会和连接阶段的使用相同的分配器,如果连接内存池释放则请求阶段的子内存池也会自动释放。
内存管理可以分为三个层次,自底向上分别是:
操作系统内核的内存管理;
glibc
层使用系统调用维护的内存管理算法;应用程序从
glibc
动态分配内存后,根据应用程序本身的程序特性进行优化, 比如使用引用计数std::shared_ptr
,apache
的内存池方式等等。当然应用程序也可以直接使用系统调用从内核分配内存,自己根据程序特性来维护内存,但是会大大增加开发成本。
C语言中
Last updated