博客
关于我
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/

你可能感兴趣的文章
OpenCV与AI深度学习 | OpenCV常用图像拼接方法(四):基于Stitcher类拼接
查看>>
OpenCV与AI深度学习 | OpenCV快速傅里叶变换(FFT)用于图像和视频流的模糊检测(建议收藏!)
查看>>
OpenCV与AI深度学习 | PaddleOCR 2.9 发布, 正式开源文本图像智能分析利器
查看>>
OpenCV与AI深度学习 | SAM2(Segment Anything Model 2)新一代分割一切大模型介绍与使用(步骤 + 代码)
查看>>
OpenCV与AI深度学习 | T-Rex Label !超震撼 AI 自动标注工具,开箱即用、检测一切
查看>>
OpenCV与AI深度学习 | YOLO11介绍及五大任务推理演示(目标检测,图像分割,图像分类,姿态检测,带方向目标检测)
查看>>
OpenCV与AI深度学习 | YOLOv10在PyTorch和OpenVINO中推理对比
查看>>
OpenCV与AI深度学习 | YOLOv11来了:将重新定义AI的可能性
查看>>
OpenCV与AI深度学习 | YOLOv8自定义数据集训练实现火焰和烟雾检测(代码+数据集!)
查看>>
OpenCV与AI深度学习 | YOLOv8重磅升级,新增旋转目标检测,又该学习了!
查看>>
OpenCV与AI深度学习 | 一文带你读懂YOLOv1~YOLOv11(建议收藏!)
查看>>
OpenCV与AI深度学习 | 五分钟快速搭建一个实时人脸口罩检测系统(OpenCV+PaddleHub 含源码)
查看>>
OpenCV与AI深度学习 | 什么是 COCO 数据集?
查看>>
OpenCV与AI深度学习 | 低对比度缺陷检测应用实例--LCD屏幕脏污检测
查看>>
OpenCV与AI深度学习 | 使用 MoveNet Lightning 和 OpenCV 实现实时姿势检测
查看>>
OpenCV与AI深度学习 | 使用 OpenCV 创建自定义图像滤镜
查看>>
OpenCV与AI深度学习 | 使用 SAM 和 Grounding DINO 分割卫星图像
查看>>
OpenCV与AI深度学习 | 使用OpenCV图像修复技术去除眩光
查看>>
OpenCV与AI深度学习 | 使用OpenCV检测并计算直线角度
查看>>
OpenCV与AI深度学习 | 使用OpenCV轮廓检测提取图像前景
查看>>