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

你可能感兴趣的文章
python | huey,一个非常厉害的 任务调度 Python 库!
查看>>
python | hypothesis,一个有趣的 Python 库!
查看>>
python | Indico,一个超酷的 Python 库!
查看>>
python | isort,一个有趣的 自动整理导入语句 的Python 库!
查看>>
python | jinja,一个超酷的 Python 库!
查看>>
python | joblib,一个强大的 Python 库!
查看>>
python调用git bash_Python学习第70课-用Git Bash在命令行打开sublime
查看>>
python | jsonschema,一个实用的 验证 JSON 数据结构 Python 库!
查看>>
python课程的中期报告范文_课题研究中期总结报告范文
查看>>
python | lxml,一个超酷的 关于XML/HTML 文档 Python 库!
查看>>
python | mplfinance,一个有趣的金融数据可视化 Python 库!
查看>>
python | nipy,一个强大的关于 神经影像数据分析 的Python 库!
查看>>
python | NLTK,一个强大的 自然语言处理 Python 库!
查看>>
python | nupic,一个强大的 处理时间序列的Python 库!
查看>>
python | orange3,一个神奇的 Python 库!
查看>>
python | pdfminer,一个神奇的 关于PDF 文件的 Python 库!
查看>>
python | pendulum,一个有趣的 日期和时间 Python 库!
查看>>
python | pluginbase,一个神奇的 关于插件框架 的Python 库!
查看>>
python | ply,一个无敌的 词法和语法分析工具 的Python 库!
查看>>
python | py2exe,一个超酷的 Python 库!
查看>>