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

你可能感兴趣的文章
Vue3+element plus+sortablejs实现table列表拖拽
查看>>
Nokia5233手机和我装的几个symbian V5手机软件
查看>>
non linear processor
查看>>
Non-final field ‘code‘ in enum StateEnum‘
查看>>