毫无疑问,内存池使用的总的流程是:首先创建一个内存池,在创建的过程中指定它的父内存池,并需要将其挂接到对应的内存池树层次结构上;其次,使用内存池,刚开始使用时内存池中除了本身结点的一点空间外,没有其他的空间了,如果需要的内存较大,则需要从分配子中分配内存,并挂接到内存池的active 链表上,然后直接使用;最后,内存池的销毁,内存池的销毁同时内存也都会重新释放到分配子中,由分配子进行管理。
下面从整个过程详细介绍一下内存的全流程使用,主要是以Apache的main函数中对内存的使用为例。
(1)apr_pool_create函数
main函数中最开始涉及到内存使用的地方在init_process函数中,在函数中,使用内存时,调用的便是apr_pool_create(&cntx, NULL),以此创建第一个全局内存池cntx,我们来看apr_pool_create函数的工作过程:
apr_pool_create实际调用的是apr_pool_create_ex函数来创建,继续往下,
1.首先判断创建的内存池有没有设定父内存池,如果没有则默认的将其设置为其父内存池为根内存池,即全局内存池。
2.然后,函数首先创建apr_pool_t结构,其方法是首先通过分配子分配一个最小内存空间为8K的内存结点,然后将apr_pool_t结构放在apr_memnode_t结构的下面,并对各个字段初始化。结构如下:
2.然后,函数首先创建apr_pool_t结构,其方法是首先通过分配子分配一个最小内存空间为8K的内存结点,然后将apr_pool_t结构放在apr_memnode_t结构的下面,并对各个字段初始化。结构如下: