Nginx源码分析-数组

来源:互联网 发布:ubuntu安装lrzsz 编辑:程序博客网 时间:2024/04/30 20:05

转载申明:本文可以任意转载,但需注明原文地址,谢谢!

 

俄罗斯大牛在nginx中给我们封装了非常好用的数组,在做nginx模块开发的时候,不必再使用原始的数组了。

 

 

nginx使用以下结构来维护数组

 

 

 

  1. elts指向一块向系统申请的内存;在nginx中,这块内存是通过malloc或者其他类似操作从内存池中申请而来的。
  2. nelts记录了数组中已存放元素的个数。
  3. size是数组元素的大小,可以通过sizeof()求得。
  4. nalloc是整个数组可存放元素的单元数。
  5. pool当然就是内存池了,用其保存分配此数组的内存池地址。

通过对数组结构成员的了解,可以得之:elts所指的内存大小 = size * nalloc。

 

 

 nginx给我们提供了5个接口函数,方便进行数组的操作,分别是:

 

此函数即是用来创建一个可以存储n个元素,每个元素大小为size的数组。返回值是维护数组的结构的地址。

 

 

 

此函数顾名思义就是释放内存、销毁数组,但nginx并没有真正的释放内存,而是将内存归还给内存池(a->pool)。

 

 

 

此函数的功能就是取得下一个可以存放元素的单元地址。由于nginx封装的数组可以根据需求动态扩展,所以此函数必须处理预分配的内存不足的情况。nginx在ngx_array_push函数内存采用了两种策略来动态增加内存。

  • 预分配的内存不足了,但数组所在的内存池槽还有可以分配一个元素的空闲内存,那就在数组末端分配一个元素的空间来暂时满足当前需求。
  • 预分配的内存不足,同时数组所在的内存池槽的空闲内存也不足以分配一个元素的空间了,那就向内存池申请一个原数组2倍大小的新内存空间,再将原数组复制到新的位置,最后返回下一个空闲元素位置给我们使用。

此接口函数是nginx模块开发中,使用最多的数组操作接口了,列举一个简单的使用例子:

nginx数组的用法就是先申请内存,然后再向内存中填充数据;这是俄罗斯大牛在整个nginx中的编码手法。

 

 

从函数名也可以猜到它是用来获得n个元素的内存空间地址,然后从获得的地址向数组中填入n个元素。好像使用得比较少。此操作面临数组空间不足的时候,也是采用了类似ngx_array_push的两个动态增加内存的策略。但存在略微的不同之处。读源码可以了解到。

 

此接口函数用来为我们初始化一个定义的数组。用法举例:

 

 

到此,nginx所封装的数组也就学习完了,鼓励自己继续努力研究nginx。

 

 

 

 

原创粉丝点击