nginx 源码学习笔记(八)——基本容器——array数组

本文详细介绍了Nginx内部使用的ngx_array数据结构,包括其定义、创建、销毁及扩展过程。ngx_array是一种利用内存池进行分配的数组容器,能够高效地管理内存并支持在尾部添加元素。

对应文件为core/ngx_array.{c|h}

ngx_array是nginx内部封装的,使用ngx_pool_t对内存池进行分配的数组容器,其中的数据是在一整片内存区中连续存放的。更新数据时只能在尾部压入1个或多个元素。这里单纯的觉得和数组没有差别。

数组的实现结构为:

struct ngx_array_s { void *elts; //具体的数据区域的指针 ngx_uint_t nelts; //数组实际包含的元素数量 size_t size; //数组单个元素的大小 ngx_uint_t nalloc; //数组容器预先(或者重新)分配的内存大小 !!!这部分为预计的存储元素数量!!! ngx_pool_t *pool; //分配的内存池 };

常用操作有:

//创建数组 ngx_array_t * ngx_array_create(ngx_pool_t *p, ngx_uint_t n, size_t size) { ngx_array_t *a; a = ngx_palloc(p, sizeof(ngx_array_t)); //分配数组空间 if (a == NULL) { return NULL; } a->elts = ngx_palloc(p, n * size); //分配数据区域空间 if (a->elts == NULL) { return NULL; } a->nelts = 0; //初始化信息 a->size = size; a->nalloc = n; a->pool = p; return a; } //摧毁数组 void ngx_array_destroy(ngx_array_t *a) { ngx_pool_t *p; p = a->pool; if ((u_char *) a->elts + a->size * a->nalloc == p->d.last) { //如果有数据 判断总数据量是否等于p追后地址 p->d.last -= a->size * a->nalloc; //如果等于,指针迁移总数据量位数即可 } if ((u_char *) a + sizeof(ngx_array_t) == p->d.last) { //如果没有数据 p->d.last = (u_char *) a; //直接把指针移动到a的地址上 } } // void * ngx_array_push(ngx_array_t *a) { void *elt, *new; size_t size; ngx_pool_t *p; if (a->nelts == a->nalloc) { //数组已经存满 /* the array is full */ size = a->size * a->nalloc; p = a->pool; if ((u_char *) a->elts + size == p->d.last //如果总数据量等于last地址,并且新加的数据在可用范围内 && p->d.last + a->size <= p->d.end) { /* * the array allocation is the last in the pool * and there is space for new allocation */ p->d.last += a->size; //last后移 a->nalloc++; //总数据量增加 } else { /* allocate a new array */ //如果不是,创建新的内存空间 new = ngx_palloc(p, 2 * size); //创建一个两倍大小的内存空间 if (new == NULL) { return NULL; } ngx_memcpy(new, a->elts, size); //复制到新的内存空间 a->elts = new; //指向新地址 a->nalloc *= 2; //可容纳总数量*2 } } elt = (u_char *) a->elts + a->size * a->nelts; //新指针用于返回 a->nelts++; //实际数量增加 return elt; //返回指针指向的地址,这里只进行内存分配,还需要对返回的新指针进行赋值,等操作才可以实现数组的添加,这里要特殊注意 } //void * ngx_array_push_n(ngx_array_t *a, ngx_uint_t n) //对于这个函数就不多讲了

总结:

ngx_array_create 在未创建ngx_array_t结构体时创建数组
ngx_array_init 在创建ngx_array_t结构体后创建数组
ngx_array_destroy 销毁数组
ngx_array_push 在数组中压入一个数据,得到一个数据指针,在这里就不用再分配内存了,可以直接使用分配的内存

ngx_array_push_n 在数组中压入 n个数据,得到一个数据指针,在这里就不用再分配内存了,可以直接使用分配的内存

要在 Windows 下给 nginx 添加 gzip_static_module 模块,需要重新编译 nginx。以下是具体步骤: 1. 安装 Visual Studio 首先需要安装 Microsoft Visual Studio,官网下载地址:https://visualstudio.microsoft.com/zh-hans/downloads/ 2. 下载 nginx 源码nginx 官网下载最新的 nginx 源码:http://nginx.org/en/download.html 3. 解压 nginx 源码 解压下载的 nginx 源码到任意目录,如:C:\nginx-1.20.1 4. 安装 Perl nginx 的编译过程需要用到 Perl,需要安装 Perl。官网下载地址:https://www.perl.org/get.html 5. 安装 PCRE PCRE 是一个支持正则表达式的库,nginx 的编译过程需要用到。可以从这里下载最新的 PCRE:https://ftp.pcre.org/pub/pcre/ 将解压后的文件夹复制到 C 盘根目录,如:C:\pcre-8.44 6. 安装 zlib zlib 是一个压缩库,nginx 的编译过程需要用到。可以从这里下载最新的 zlib:https://zlib.net/ 将解压后的文件夹复制到 C 盘根目录,如:C:\zlib-1.2.11 7. 编辑 nginx 配置文件 在 C:\nginx-1.20.1 目录下找到 conf 目录,编辑 nginx.conf 文件,在 http 模块中添加以下内容: ``` gzip_static on; ``` 8. 编译 nginx 打开 Visual Studio,选择 “文件” -> “打开” -> “项目/解决方案”,找到 C:\nginx-1.20.1 目录下的 nginx.sln 文件,双击打开。 在 Visual Studio 中选择 “生成” -> “生成解决方案”,等待编译完成。 9. 替换旧的 nginx.exe 编译完成后,会在 C:\nginx-1.20.1\objs 目录下生成新的 nginx.exe 文件。将该文件替换旧的 nginx.exe 文件,重启 nginx 服务器即可。 注意:以上步骤仅适用于 Windows 平台下的编译和安装,Linux 平台下的编译和安装方法略有不同。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值