分享
 
 
 

Apache内存池内幕(4)

王朝system·作者佚名  2006-01-10
窄屏简体版  字體: |||超大  

2.4 内存池2.4.1内存池概述在了解了内存分配子的概念之后,我们其实已经了解了Apache中内存分配的细节了。不过Apache中内存的层次结构关系则是由内存池负责组织,其数据结构apr_pool_t定义在apr_pools.c中,定义如下:

struct apr_pool_t {

apr_pool_t *parent;

apr_pool_t *child;

apr_pool_t *sibling;

apr_pool_t **ref; //用于指向内存池本身

cleanup_t *cleanups;

apr_allocator_t *allocator;

struct process_chain *subprocesses;

apr_abortfunc_t abort_fn;

apr_hash_t *user_data;

const char *tag;

#if !APR_POOL_DEBUG

apr_memnode_t *active;

apr_memnode_t *self; /* The node containing the pool itself */

char *self_first_avail;

#else /* APR_POOL_DEBUG */

debug_node_t *nodes;

const char *file_line;

apr_uint32_t creation_flags;

unsigned int stat_alloc;

unsigned int stat_total_alloc;

unsigned int stat_clear;

#if APR_HAS_THREADS

apr_os_thread_t owner;

apr_thread_mutex_t *mutex;

#endif /* APR_HAS_THREADS */

#endif /* APR_POOL_DEBUG */

#ifdef NETWARE

apr_os_proc_t owner_proc;

#endif /* defined(NETWARE) */

};

Apache中存在的内存池个数通常多于一个,它们之间形成树型层次结构。每个内存池所存储的内容以及其存储周期都不一样,比如连接内存池在整个HTTP连接期间存在,一旦连接结束,内存池也就被释放;请求内存池则周期要相对短,它仅仅在某个请求周期内存存在,一旦请求结束,请求内存池也就释放。不过每个内存池都具有一个apr_pool_t结构。

整个内存池层次树通过parent、child以及sibling三个变量构建起来。parent指向当前内存池的父内存池;child指向当前内存池的子内存池;而sibing则指向当前内存池的兄弟内存池。因此整个内存池树结构可以用图3.3描述:

图3.3 内存池层次树结构图

在上面的图中,我们只是表示了层次结构,因此只是用了child和sibling两个成员,而忽略的parent的变量。从上面的图中我们可以看出根结点具有n个孩子结点:child1,child2,child3…childn。而child1,child2,child3以及childn它们属于同一个父亲,而且处于层次树的同一层次,因此它们通过链表连接,互为兄弟结点。同样child10和child11都是child1的子内存池结点,互为兄弟结点。child21是child2的唯一的子结点。其余结点类似。

除此之外apr_pool_t结构中最重要的成员变量无非就是active了。

图3.4

Apache中提供了大量的内存池管理函数,它们的功能和名称归纳在表格3.2中。

内存池操作

函数名称

函数功能简单描述

初始化

apr_pool_initialize

对内存池使用中需要的内部变量进行初始化

销毁

apr_pool_terminate

主要在终止内存池使用时销毁内部的结构

创建

apr_pool_create_ex

apr_pool_create_ex_debug

创建一个新的内存池,另外还包括一个调试版本

清除

apr_pool_clear

apr_pool_clear_debug

清除内存池中的所有的内存,另外包括一个调试版本

apr_pool_destroy

2.4.2内存池的初始化内存池的初始化是通过函数apr_pool_initialize实现的,在内部函数完成了下面几件事情:

APR_DECLARE(apr_status_t) apr_pool_initialize(void)

{

apr_status_t rv;

if (apr_pools_initialized++)

return APR_SUCCESS;

(1)、确保Apache中只创建一个全局内存池,为此,Apache中使用apr_pools_initialized进行记录。apr_pools_initialized初始值为0,初始化后该值更改为1。每次初始化之前都检查该值,只有值为0的时候才允许继续执行初始化操作,否则直接返回。通过这种手段可以确保只有一个全局内存池存在。

if ((rv = apr_allocator_create(&global_allocator)) != APR_SUCCESS) {

apr_pools_initialized = 0;

return rv;

}

if ((rv = apr_pool_create_ex(&global_pool, NULL, NULL,

global_allocator)) != APR_SUCCESS) {

apr_allocator_destroy(global_allocator);

global_allocator = NULL;

apr_pools_initialized = 0;

return rv;

}

apr_pool_tag(global_pool, "apr_global_pool");

(2)、创建了全局的分配子global_allocator,并使用全局分配子global_allocator创建了全局内存池global_pool,该内存池是所有的内存池的祖先。所有的内存池都从该内存池继承而来。它在整个Apache的生存周期都存在,即使重启机器,该内存池也不会释放。除非你把Apache彻底关闭。该内存池在系统中命名为“apr_gloabl_pool”。

if ((rv = apr_atomic_init(global_pool)) != APR_SUCCESS) {

return rv;

}

#if APR_HAS_THREADS

{

apr_thread_mutex_t *mutex;

if ((rv = apr_thread_mutex_create(&mutex,APR_THREAD_MUTEX_DEFAULT,global_pool)) != APR_SUCCESS) {

return rv;

}

apr_allocator_mutex_set(global_allocator, mutex);

}

#endif /* APR_HAS_THREADS */

apr_allocator_owner_set(global_allocator, global_pool);

(3)、如果当前的操作系统允许多线程,为了确保内存池结构被多线程访问的时候的线程安全性,还必须设置apr_pool_t结构内的互斥锁变量mutex。最后的任务就是将内存分配子和内存池进行关联。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有