没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
目录
1. 内存池概述 .................................................................................................................................................... 2
2. 内存池分配结点 ............................................................................................................................................ 3
3. 内存池分配子
ALLOCATOR ...................................................................................................................... 6
3.1. 分配子概述....................................................................................................................................................6
3.2. 分配子创建与销毁........................................................................................................................................8
3.3. 分配子内存分配..........................................................................................................................................10
3.4. 分配子内存释放..........................................................................................................................................13
3.5. 分配子内存管理流程..................................................................................................................................15
4. 内存池 .......................................................................................................................................................... 16
4.1. 内存池概述..................................................................................................................................................16
4.2. 内存池的初始化..........................................................................................................................................18
5. APACHE
内存池中分配结点补充说明 ...................................................................................................... 20
6. 内存池中
CURRENT_FREE_INDEX
的作用的解释 .............................................................................. 23
7. 内存分配子的
CURRENT_FREE_INDEX
成员作用 .............................................................................. 24
7.1. 背景.............................................................................................................................................................. 24
7.2. 历史.............................................................................................................................................................. 24
7.3. CURRENT_FREE_INDEX 与 MAX_FREE_INDEX 的作用.............................................................................24
7.4. 关于 CURRENT_FREE_INDEX 溢出的问题................................................................................................25
7.5. 溢出问题的解决..........................................................................................................................................27
8. 简单应用 ...................................................................................................................................................... 27
Apache 内存池内幕
对于 中的所有的对象中,内存池对象应该是其余对象内存分配的基础,不仅是
中的对象,而且对于整个 中的大部分对象的内存都是从内存池中进行分配的,因此
我们将把内存池作为整个 的基础。
内存池概述
在 语言中,内存管理的问题臭名昭著,一直是开发人员最头疼的问题。对于小型程序
而言,少许的内存问题,比如内存泄露可能还能忍受,但是对于 这 种大负载量的服
务器而言,内存的问题变得尤其重要,因为丝毫的内存泄露以及频繁的内存分配都可能导致
服务器的效率下降甚至崩溃。
通常情况下,内存的分配和释放通常都是 和 显式进行的。这样做显得单调
无味,同时也可能充满各种令人厌恶的问题。对同一块内存的多次释放通常会导致页面错误
而一直不释放又导致内存泄露,并且使得服务器性能大大下降。
为了在大而且复杂的 中避免内在的内存管理问题, 的开发者创建了一
套基于池概念的内存管理方案,最后这套方法移到 中成为通用的内存管理方案。
在这套方案中,核心概念是池的概念。 中的内存分配的基本结构都是资源池,
包括线程池,套接字池等等。内存池通常是一块很大的内存空间,一次性被分配成功,然后
需要的时候直接去池中取,而不需要重新分配,这样避免的频繁的 操作,而且另一
方面,即时内存的使用者忘记释放内存或者根本就不想分配,那么这些内存也不会丢失,它
们仍然保存在内存池中,当内存池被销毁的时候这些内存将自动的被销毁。
由于 中的大 部分资源 的分配都是从 内存池中分配 的,因此 对于大部分的
函数,如果其内部需要进行资源分配,那么它的函数参数中总是会带有一个内存池
参数,该内存池参数指明分配内存来自的内存池,比如下面的两个函数:
!"!#$%&%'(&%'
由 于 在 函 数 的 内 部 需 要 进 行 内 存分 配 , 因 此 这 两 个 函 数 的 参 数 中 都 指 定 了 一 个
的结构,用以指明函数内存分配来自的内存池。在后面的大部分过程中我们对于
该参数将不再做多余的解释。
中的内存池并不是仅仅一个内存池,相反而是存在多个内存池,这些内存池之
间形成层次结构。如果 中仅仅存在一个内存池的话,潜在的问题是所有的内存分配
都来自这个池,而且最要命的这些内存必须在整个 关闭时候才被释放,这一点显然
不是那么合情合理,为此 中根据处理阶段的周期长短又引出了子内存池的概念,与
之对应的是父内存池以及根内存池的概念,它们的唯一区别就是存在的周期的不同而已。比
如对于 )$$ 连接而言,包括两种内存池:连接内存池和请求内存池。由于一个连接可能包
含多个请求,因此连接的生存周期总是比一个请求的周期长,为此连接处理中所需要的内存
则从连接内存池中分配,而请求则从请求内存池中分配。而一个请求处理完毕后请求内存池
被释放,一个连接处理后连接内存池被释放。根内存池在整个 运行期间都存在。
中一个内存池的层次结构图可以大致如下描述:
内存池层次图
* 内存池分配结点
在了解内存池的概念之前,我们首先了解一些内存池分配结点的概念。为了能够方便的
对分配的内存进行管理, 中使用了内存结点的概念来描述每次分配的内存块。其结
构类型则描述为 ,该结构定义在文件 中,其定义如下:
+&(%%+
%,
-+.-+
+.+
%(/*(-+.(0+
%(/*(-+.1%+
23(+.(2+
+.(+
4
该结点类型是整个 内存管理的基石,在后面的部分我们将其称之为“内存结点类型”
或者简称为“内存结点”或者“结点”。在该结构中,不同的结点之间通过 - 指针形成结点链
表;另外当在结点内部的时候为了方便引用结点本身,成员变量中还引入了 ,该变量主要
用来记录当前结点的首地址,即使身在结点内部,也可以通过 指针得到该结点并对该结
点进行操作。
从上面的结构中可以看出事实上在 结构内部没有任何的“空闲空间”来
容纳实际分配的内存,事实上,它从来不单独存在,总是依附于具体的分配的内存单元。通
常情况下,一旦分配了实际的空间之后, 总是将该结构置于整个单元的最顶部,如
下图所示。
内存结点示意图
在上图中,我们可能调用 函数分配了 56 大小的空间,为了能够将该空间用
的结点进行记录,我们将 置于整个空间的头部,此时剩下的可用
空 间 大 小 应 该 为 567(0 , 同 时 结 构 中 还 提 供 了 23( 和
指 针 分 别 指 向 这 块 可 用 空 间 的 首 部 和 尾 部 。 当 这 块 可 用 空 间 被 不 断 利 用 时 ,
23( 和 指针也不断随之移动,不过723(之间则永远是当前的空
闲空间。上图的右边部分演示了这种布局。
通常情况下,其分配语句大致如下:
8(0
79-8!
79(-8(-
7923(8:;;!"$#<=
798:(0
中对内存的分配大小并不是随意的,随意的分配可能会造成更多的内存碎片。
为此 采取的则是“规则块”分配原则。 所支持的分配的最小空间是 >6,如果
分配的空间达不到 >6 的大小,则按照 >6 去分配;如果需要的空间超过 >6,则将分配的空
间往上调整为 ?6 的倍数。为此我们在程序中很多地方会看到下面的宏 <@!,其定义
如下:
+<@!(&%(A1*&%+
B2<@!(0&%C
(0:&%7DE&%7
该宏所做的无非就是计算出最接近 (0 的 &% 的整数倍的整数。通常情况下 (0 大
小 为 整 数 即 可 , 而 &% 则 必 须 保 证 为 * 的 倍 数 。 比 如 <@!F? 为 > ;
<@!*>为 *?;<@!*5则为 /*。不过 中用的最多的还是
<@!G $,其实际上是 <@!(0>。在以后的地方,我们将这种处
理方式称之为“>6 对齐”或者“?6 对齐”或者类似。
因 此 如 果 对 于 <@!G $(0 , 其 等 同 于
<@!(0>。与之对应, 中为了处理方便,同时也将
结 构 的 大 小 从 (0 调 整 为
<@)G $(0。在前面的部分我们曾经描述过,对于
一块 56 的内存区域,如果其用 进行记录的话,实际的可用空间大小并
不 是 567(0 , 更 精 确 地 则 应 该 是 567
<@!G $(0。
因此如果我们看到 中的下面的语句,我们就没有什么好惊讶的了。
(08<@!(0:;;!"$#<=?HI5
((0.>I*
(08>I*
在上面的代码中我们将实际的常量都替换成实际的整数。 ;;!"$ 是对
(0进行调整后的值。上面的语句所作的正是我们前面所说的分配策
略:如果需要分配的空间累计结点头的空间总和小于 >6,则以 >6 进行分配,否则调整为
?6 的整数倍。按照这种分配策略,如果我们要求分配的 (0 大小为 ?I*,其按照最小单元
分配,实际分配大小为 >I*;如果我们要求分配的空间为 >I*,由于其加上内存结点头,
大 于 >I* , 此 时 将 按 照 最 小 单 元 分 配 ?' , 此 时 实 际 分 配 的 空 间 大 小 为
>I*:?II58*6。这样,每个结点的空间大小都不完全一样,为此分配结点本身必须了
解本结点的大小,这个可以使用 (- 进行记录。
不过 记录内存的大小有自己的独特的方法。如果空间为 *6,那么 并
不会直接将 *6 赋值给 (- 变量。相反,(- 只是记录当前结点大小相对于 ?6 的倍数,
剩余29页未读,继续阅读
资源评论
Y_jiuweiyinhu
- 粉丝: 0
- 资源: 24
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功