[普通]APACHE 内存管理

作者(passion) 阅读(1134次) 评论(0) 分类( apache)

APACHE 内存管理方式:
第一种:
    直接调用APR的内存分配:mytype* myvar = apr_palloc(pool, sizeof(mytype)) ;不需要自己free,APR负责自动在pool上注册free,当pool被free的时候,自动执行free myvar.
第二种:
    自己调用malloc分配内存:mytype* myvar = malloc(sizeof(mytype)) ;再注册free到一个pool上面apr_pool_cleanup_register(pool, myvar, free,apr_pool_cleanup_null);然后当这个pool被free的时候,APR会调用free,然后自动释放这个myvar.
第三种:
    自己调用malloc分配内存:mytype* myvar = malloc(sizeof(mytype)) ;再注册free到一个pool上面apr_pool_cleanup_register(pool, myvar, free,apr_pool_cleanup_null);然后自己手动free掉myvar.这个时候,为了避免pool被free的时候,APR会调用free,而那片内存已经被free掉了,要调用apr_pool_cleanup_kill取消注册的free.
第四种:
    自己调用malloc分配内存:mytype* myvar = malloc(sizeof(mytype)) ;自己调用free.
    
APACHE 中一些pool的生命周期:
request pool :和HTTP Request的一样.
process pool :和Server的一样.
connection pool :和TCP连接的一样.

APR中的一些数据结构:
数组 :apr_array_header_t
    创建的时候有一个初始大小,但数组可以变大.
例子:

/* Allocate an array of type my_type */
apr_array_header_t* arr = apr_array_make(pool, sz, sizeof(my_type));
/* Allocate an uninitialized element on the array*/
my_type* newelt = apr_array_push(arr) ;
/* Now fill in the values of elt */
newelt->foo = abc ;
newelt->bar = "foo" ;
/* Pop the last-in element */
my_type* oldelt = apr_array_pop(arr) ;
/* Iterate over all elements */
for (i = 0; i < arr->nelts; i++) 
{
    /* A C++ reference is the clearest way to show this */
    my_type& elt = arr->elts[i] ;
}



表格:apr_table_t
    基于数组的key/value对.(high-level).有初始大小
注:apr_table_merge和apr_table_overlap是对于HTTP头和环境变量操作理想的实现.

哈希表:apr_hash_t
    key/value对.(low-level).没有初始大小.

队列:apr_queue_t

环:apr_ring,不是数据结构,而是一堆宏定义.
(bucket和brigade)

处理URL的 :apr_uri_t

« 上一篇:wifi共享上网(至尊版wifi)
« 下一篇:ASP.NET附加数据库文件的方式,如何发布到IIS7而不导致SQLServer出错
在这里写下您精彩的评论
  • 微信

  • QQ

  • 支付宝

返回首页
返回首页 img
返回顶部~
返回顶部 img