ITPub博客

首页 > > > 初探nginx-大块内存链

初探nginx-大块内存链

作者:longmanma 时间:2019-12-13 17:38:08 0 删除 编辑

对于被置于大块内存链,也就是被large字段管理的一列内存中的某块进行释放。该函数的实现是顺序遍历large管理的大块内存链表。所以效率比较低下。如果在这个链表中找到了这块内存,则释放,并返回NGX_OK。否则返回NGX_DECLINED。

由于这个操作效率比较低下,除非必要,也就是说这块内存非常大,确应及时释放,否则一般不需要调用。反正内存在这个pool被销毁的时候,总归会都释放掉的嘛!

ngx_pool_cleanup_t *ngx_pool_cleanup_add(ngx_pool_t *p, size_t size);

ngx_pool_t中的cleanup字段管理着一个特殊的链表,该链表的每一项都记录着一个特殊的需要释放的资源。对于这个链表中每个节点所包含的资源如何去释放,是自说明的。这也就提供了非常大的灵活性。意味着,ngx_pool_t不仅仅可以管理内存,通过这个机制,也可以管理任何需要释放的资源,例如,关闭文件,或者删除文件等等。下面我们看一下这个链表每个节点的类型:

typedef struct ngx_pool_cleanup_s ngx_pool_cleanup_t;

typedef void (*ngx_pool_cleanup_pt)(void *data);

struct ngx_pool_cleanup_s {

ngx_pool_cleanup_pt handler;

void *data;

ngx_pool_cleanup_t *next;

};

data:指明了该节点所对应的资源。

handler:是一个函数指针,指向一个可以释放data所对应资源的函数。该函数只有一个参数,就是data。

next:指向该链表中下一个元素。

看到这里,ngx_pool_cleanup_add这个函数的用法,我相信大家都应该有一些明白了。但是这个参数size是起什么作用的呢?这个 size就是要存储这个data字段所指向的资源的大小,该函数会为data分配size大小的空间。

比如我们需要最后删除一个文件。那我们在调用这个函数的时候,把size指定为存储文件名的字符串的大小,然后调用这个函数给cleanup链表中增加一项。该函数会返回新添加的这个节点。我们然后把这个节点中的data字段拷贝为文件名。把hander字段赋值为一个删除文件的函数(当然该函数的原型要按照void (*ngx_pool_cleanup_pt)(void *data))。

void ngx_destroy_pool(ngx_pool_t *pool);

该函数就是释放pool中持有的所有内存,以及依次调用cleanup字段所管理的链表中每个元素的handler字段所指向的函数,来释放掉所有该pool管理的资源。并且把pool指向的ngx_pool_t也释放掉了,完全不可用了。

void ngx_reset_pool(ngx_pool_t *pool);

该函数释放pool中所有大块内存链表上的内存,小块内存链上的内存块都修改为可用。但是不会去处理cleanup链表上的项目。

ngx_array_t(100%)

ngx_array_t是nginx内部使用的数组结构。nginx的数组结构在存储上与大家认知的C语言内置的数组有相似性,比如实际上存储数据的区域也是一大块连续的内存。但是数组除了存储数据的内存以外还包含一些元信息来描述相关的一些信息。下面我们从数组的定义上来详细的了解一下。ngx_array_t的定义位于src/core/ngx_array.c|h里面。

typedef struct ngx_array_s ngx_array_t;

struct ngx_array_s {

void *elts;

ngx_uint_t nelts;

size_t size;

ngx_uint_t nalloc;

ngx_pool_t *pool;

};

elts:指向实际的数据存储区域。

nelts:数组实际元素个数。

size:数组单个元素的大小,单位是字节。

nalloc:数组的容量。表示该数组在不引发扩容的前提下,可以最多存储的元素的个数。当nelts增长到达nalloc 时,如果再往此数组中存储元素,则会引发数组的扩容。数组的容量将会扩展到原有容量的2倍大小。实际上是分配新的一块内存,新的一块内存的大小是原有内存大小的2倍。原有的数据会被拷贝到新的一块内存中。

pool:该数组用来分配内存的内存池。

下面介绍ngx_array_t相关操作函数。

ngx_array_t *ngx_array_create(ngx_pool_t *p, ngx_uint_t n, size_t size);

创建一个新的数组对象,并返回这个对象。

p:数组分配内存使用的内存池;

n:数组的初始容量大小,即在不扩容的情况下最多可以容纳的元素个数。

size:单个元素的大小,单位是字节。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/2730/viewspace-3137207/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: linux服务-简介
请登录后发表评论 登录
全部评论

注册时间:2019-12-18

  • 博文量
    492
  • 访问量
    11992