Nginx源码研究四:NGINX的内存管理
关于nginx的内存使用,我们先看代码,下面是nginx_cycle.c中对全局数据结构cycle的初始化过程
pool = ngx_create_pool(NGX_CYCLE_POOL_SIZE, log); //申请16K的内存池
if (pool == NULL) {
return NULL;
}
pool->log = log; cycle = ngx_pcalloc(pool, sizeof(ngx_cycle_t));
if (cycle == NULL) {
ngx_destroy_pool(pool);
return NULL;
}
我们可以看到,nginx对内存分配做了封装,第一步:申请内存池;第二步:在内存池中分配内存。我们分别来看一下
1、内存池的申请
a、内存池的数据结构
我们先看一下内存池的数据结构
struct ngx_pool_s {
ngx_pool_data_t d;
size_t max; //申请的内存大小,不超过系统分页大小
ngx_pool_t *current; //当前申请的普通内存指针
ngx_chain_t *chain;
ngx_pool_large_t *large; //指向最新申请的large内存指针,最新申请的内存指针的*next指针指向前一申请的内存指针
ngx_pool_cleanup_t *cleanup;
ngx_log_t *log;
};
内存池定义了7个成员变量,这里先看内存池定义的max的成员变量,我们从后面使用内存池分配内存可以看到,这个max成员变量,实际上确定了该段申请的内存使用的大小。max的大小不 大于内存的分页大小,目的是优化内存的存取。同时程序一旦请求内存大于max时候,就不会在内存池中分配内存,会另外分配一块大的内存供程序使用。
typedef struct {
u_char *last; //所申请内存池大小的尾指针
u_char *end; //内存使用的尾指针
ngx_pool_t *next;
ngx_uint_t failed; //*last- *end 是该申请内存段中可使用内存大小(*last会做对齐优化),
//failed值用来统计当请求分配内存大于该值的次数,
//failed值大于4将不再考虑在该段内存分配。
} ngx_pool_data_t;
这里再看*current和 *next。*current指向的是可以使用的内存池,*next指针实际上将所有内存池构成一个内存池链。我们可以从下面的简图中看出
aaarticlea/png;base64,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" alt="" />
b、内存池的创建
下面看一下ngx_create_pool(NGX_CYCLE_POOL_SIZE, log) 函数,这是创建内存池的函数,过程不再细述:
ngx_pool_t *
ngx_create_pool(size_t size, ngx_log_t *log)
{
ngx_pool_t *p; p = ngx_memalign(NGX_POOL_ALIGNMENT, size, log); //实际分配size大小的内存
if (p == NULL) {
return NULL;
} p->d.last = (u_char *) p + sizeof(ngx_pool_t);
p->d.end = (u_char *) p + size;
p->d.next = NULL;
p->d.failed = ; size = size - sizeof(ngx_pool_t);
p->max = (size < NGX_MAX_ALLOC_FROM_POOL) ? size : NGX_MAX_ALLOC_FROM_POOL;
p->current = p;
p->chain = NULL;
p->large = NULL;
p->cleanup = NULL;
p->log = log; return p;
}
c、内存池的销毁
申请的一段内存构成内存池,分成两部分,一部分是ngx_pool_t结构头,一部分是数据区,next指针指向下一段申请的内存池。current指针指向可以尝试分配内存的内存池。
对于这样的一个内存池,建立之后,存在一个销毁过程。可以从下面的代码中看出内存池链的销毁过程
void
ngx_destroy_pool(ngx_pool_t *pool)
{
ngx_pool_t *p, *n;
ngx_pool_large_t *l;
ngx_pool_cleanup_t *c; //如果内存池有自己的清理句柄,就用自己的清理句柄做清理
for (c = pool->cleanup; c; c = c->next) {
if (c->handler) {
ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, ,
"run cleanup: %p", c);
c->handler(c->data);
}
} //释放申请的大内存
for (l = pool->large; l; l = l->next) {
ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, , "free: %p", l->alloc); if (l->alloc) {
ngx_free(l->alloc);
}
} //内存池的释放,两个指针,一个指向需要释放的内存,一个指向链表的下一个
for (p = pool, n = pool->d.next; /* void */; p = n, n = n->d.next) {
ngx_free(p); if (n == NULL) {
break;
}
}
}
2、内存池上分配内存
先看在内存池上分配内存的代码
void *
ngx_palloc(ngx_pool_t *pool, size_t size)
{
u_char *m;
ngx_pool_t *p; if (size <= pool->max) { p = pool->current; //找到可以分配内存的内存池 do {
m = ngx_align_ptr(p->d.last, NGX_ALIGNMENT); if ((size_t) (p->d.end - m) >= size) { //如果内存池容量不够,则查看下一块内存池,如果容量够,则直接返回申请的内存地址,将可用内存指针向后移动
p->d.last = m + size; return m;
} p = p->d.next; } while (p); return ngx_palloc_block(pool, size);
} return ngx_palloc_large(pool, size); //需要分配内存大于内存池的最大容量,则独立分配一块大内存供程序使用
}
这里面我们看一下 m = ngx_align_ptr(p->d.last, NGX_ALIGNMENT),目的是保证分配内存地址的后面几位为0,至于几位,由unsigned long的大小来决定,unsigned long如果是4位,则保证分配内存地址后两位为00
#define NGX_ALIGNMENT sizeof(unsigned long) /* platform word */ #define ngx_align_ptr(p, a) \
(u_char *) (((uintptr_t) (p) + ((uintptr_t) a - )) & ~((uintptr_t) a - ))
前面情况是在内存池链中,内存池的容量足够,而在不够的情况下,会新申请内存池。我们看一下申请过程
static void *
ngx_palloc_block(ngx_pool_t *pool, size_t size)
{
u_char *m;
size_t psize;
ngx_pool_t *p, *new, *current; psize = (size_t) (pool->d.end - (u_char *) pool); m = ngx_memalign(NGX_POOL_ALIGNMENT, psize, pool->log); //分配一块内存
if (m == NULL) {
return NULL;
} new = (ngx_pool_t *) m; new->d.end = m + psize;
new->d.next = NULL;
new->d.failed = ; m += sizeof(ngx_pool_data_t);
m = ngx_align_ptr(m, NGX_ALIGNMENT); //在新申请的内存池中分配内存
new->d.last = m + size; current = pool->current;
//由于前面的内存池链的容量不够,分配失败,会给failed标识值加1,failed次数大于4的时候,
//下次就不再考虑在该内存池上分配内存 for (p = current; p->d.next; p = p->d.next) {
if (p->d.failed++ > ) {
current = p->d.next;
}
} p->d.next = new; //将新申请的内存池,挂在内存池链的末尾
pool->current = current ? current : new; return m;
}
Nginx源码研究四:NGINX的内存管理的更多相关文章
- Nginx源码研究一:NGINX模块启动
Nginx 是一个轻量级,但是高性能的 HTTP 和 代理 服务器,也是一个 IMAP/POP3/SMTP代理服务器. 它的第一个版本0.1.0是由俄罗斯的工程师Igor Sysoev与2004年10 ...
- Chrome自带恐龙小游戏的源码研究(四)
在上一篇<Chrome自带恐龙小游戏的源码研究(三)>中实现了让游戏昼夜交替,这一篇主要研究如何绘制障碍物. 障碍物有两种:仙人掌和翼龙.仙人掌有大小两种类型,可以同时并列多个:翼龙按高. ...
- Nginx源码研究七:nginx的location指令分析
在nginx的配置文件nginx.conf中,我们在配置server的时候,会配置一下location指令,这个location指令是提供给用户来配置对于符合指令的http请求,采用该指令内部的处理方 ...
- Nginx源码研究六:NGINX的配置文件分析
上一篇写到nginx的各个模块的配置信息的存储结构,大体描述了对配置信息的配置项生成,定制,初始化过程.这里重点研究实现定制的过程,所谓实现定制,这里指的是,nginx系统提供使用者定义nginx的配 ...
- Nginx (一)Windows下编译Nginx源码以及安装 nginx for windows方法步骤
转载自: http://apps.hi.baidu.com/share/detail/11192699#content Nginx介绍: Nginx ("engine x")是一个 ...
- Spark源码分析之九:内存管理模型
Spark是现在很流行的一个基于内存的分布式计算框架,既然是基于内存,那么自然而然的,内存的管理就是Spark存储管理的重中之重了.那么,Spark究竟采用什么样的内存管理模型呢?本文就为大家揭开Sp ...
- LevelDB(v1.3) 源码阅读之 Arena(内存管理器)
LevelDB(v1.3) 源码阅读系列使用 LevelDB v1.3 版本的代码,可以通过如下方式下载并切换到 v1.3 版本的代码: $ git clone https://github.com/ ...
- innodb源码解析 - mem0_.c - 基本内存管理
The basic element of the memory management is called a memoryheap. A memory heap is conceptually ast ...
- Nginx源码研究五:NGINX的配置信息管理
配置信息是nginx系统重要的组成部分,配置信息的使用,实际上包含两层,一层是用户针对参数定义了值,例如下面nginx参数文件中的 keepalive_timeout 65,还有一部分是用户没有定义值 ...
随机推荐
- 【图论】【宽搜】【染色】NCPC 2014 A Ades
题目链接: http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1787 题目大意: N个点M条无向边(N,M<=200000),一个节点只能有一个 ...
- C#程序注销、重启、关机和锁定电脑
一:截图 二:源代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; usi ...
- 调用系统api修改系统时间
一:截图 二:代码 using System; using System.Collections.Generic; using System.ComponentModel; using System. ...
- Java---实现运行任意目录下class中加了@MyTest的空参方法(实现图形界面)
说明: 因为上个代码,总是要输入完整的绝对路径,比较麻烦,于是,就写了这个小程序,直接进入文件对话框选择需要运行的class文件. 只需要提前输入完整的类名. 注意:加的MyTest必须打个包,加上: ...
- Safecracker(搜索)
http://acm.hdu.edu.cn/showproblem.php?pid=1015 / 题意; 从所给的一串字符串中选出5个字母假如是(A B C D E)使得A-B^2+C^3-D^4+E ...
- 如何把textfield或者textview中长按出现的(全选,复制,粘贴)显示成中文
ios在配置文件info.plist 中添加Localiztion native development region (本地化设置) 设置为 china
- slides 带手势的图片滑动效果(用于移动终端)
slidesjs 是基于jQuery开发的一款功能强大,是简单的幻灯片插件,但是需要要应用于移动终端的话,还需要考虑手势滑动时候图片切换功能. 此次,我就在slidesjs基础上扩展了两个swipe属 ...
- 完整的站内搜索Demo(Lucene.Net+盘古分词)
前言 首先自问自答几个问题,以让各位看官了解写此文的目的 什么是站内搜索?与一般搜索的区别? 很多网站都有搜索功能,很多都是用SQL语句的Like实现的,但是Like无法做到模糊匹配(例如我搜索“.n ...
- Java程序员也应该知道的系统知识系列之(网卡,cpu,内存,硬盘,虚拟化)
https://yq.aliyun.com/articles/1718?spm=5176.100240.searchblog.16.UaGd04 https://yq.aliyun.com/artic ...
- [转] Linux文件系统之hard link&symbol link
这个图很清楚的表示出硬链接和软链接的方式. 1.硬链接: 基本定义:硬链接是有着相同inode号的仅文件名不同的文件(该文件名包含路径信息). 理解:如图,hard link和原始file通过同一个i ...