博客
关于我
05Nginx源码分析之数组结构(ngx_array.c)
阅读量:224 次
发布时间:2019-03-01

本文共 1265 字,大约阅读时间需要 4 分钟。

05Nginx源码分析之数组结构ngx_array.c

05Nginx源码分析之数组结构ngx_array.c

前面一章我们介绍了Nginx的内存池的数据结构。Nginx的内存管理都是围绕内存池来实现的,包括array数组类型也是基于Nginx的pool来实现数据结构。

Nginx的Array结构设计得非常小巧,主要用于存储小块内存。该数组存储在内存池数据域中,因为该数据域本来就主要存储小块内存的,并且内存池的大小被上篇讲到的宏NGX_MAX_ALLOC_FROM_POOL给限制。存储大内存的话会被nginx的开发人员人为放在nginx的large中处理。Nginx的数组每个元素的大小是固定的。

1 数据结构定义

ngx_array_t的结构定义如下:

typedef struct {void elts; / 指向数组第一个元素指针 /ngx_uint_t nelts; / 已使用元素的索引 /size_t size; / 每个元素的大小,元素大小固定 /ngx_uint_t nalloc; / 一共分配了多少个元素 */ngx_pool_t pool; / 内存池 */} ngx_array_t;

2 数据结构图

Nginx的数组在内存池中占用的空间非常小巧。数组的元素数量在创建时就固定,但可以动态扩容以满足需求。数组的数据结构和元素内存都会分配在内存池中。数组销毁时会尝试将内存回收给内存池,但只有在特定条件下才能做到。

3 具体函数实现

1)创建数组 ngx_array_create

ngx_array_create函数用于在指定内存池中创建一个数组。该函数首先分配空间给数组结构体,然后初始化数组的大小和元素数量。分配内存时会将数组和元素的内存分开申请,以便更好地管理内存池。

2)数组销毁 ngx_array_destroy

ngx_array_destroy函数用于销毁数组。它会尝试将数组所占的内存回收给内存池。如果数组的末尾恰好与内存池的末尾重合,则将内存池的末尾指针调整到数组的开始地址。同时,也会减少数组结构体的大小。

3)往数组中增加一个元素的空间 ngx_array_push

ngx_array_push函数用于在数组中增加一个元素的空间。它首先检查数组是否已满,如果满了则需要扩容。扩容时会先尝试在当前内存池中扩容,如果不行则会移动到其他内存池。在扩容时,数组的元素数量和内存块的大小都会相应调整。扩容完成后,函数会返回新分配的元素地址。

4)往数组中增加n个元素的空间 ngx_array_push_n

ngx_array_push_n函数与ngx_array_push类似,但支持增加多个元素的空间。它同样会检查数组是否已满,如果需要扩容则会按照同样的逻辑进行扩容操作。扩容完成后,函数会返回新分配的元素地址。

转载地址:http://gjfv.baihongyu.com/

你可能感兴趣的文章
NodeJS 导入导出模块的方法( 代码演示 )
查看>>
nodejs 开发websocket 笔记
查看>>
nodejs 的 Buffer 详解
查看>>
nodejs 读取xlsx文件内容
查看>>
nodejs 运行CMD命令
查看>>
Nodejs+Express+Mysql实现简单用户管理增删改查
查看>>
nodejs+nginx获取真实ip
查看>>
nodejs-mime类型
查看>>
NodeJs——(11)控制权转移next
查看>>
NodeJS、NPM安装配置步骤(windows版本)
查看>>
NodeJS、NPM安装配置步骤(windows版本)
查看>>
nodejs与javascript中的aes加密
查看>>
nodejs中Express 路由统一设置缓存的小技巧
查看>>
nodejs中express的使用
查看>>
Nodejs中的fs模块的使用
查看>>
NodeJS使用淘宝npm镜像站的各种姿势
查看>>
nodejs包管理工具对比:npm、Yarn、cnpm、npx
查看>>
NodeJs单元测试之 API性能测试
查看>>
nodejs图片转换字节保存
查看>>
nodejs在Liunx上的部署生产方式-PM2
查看>>