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

你可能感兴趣的文章
PyQ5学习笔记——使用内部槽函数关闭窗口
查看>>
PyQ5学习笔记——使用自定义槽函数关闭窗口
查看>>
PyQt MimeData 文件名
查看>>
PyQt QML Material Design 按钮背景不会改变
查看>>
PyQt QString转成python stirng
查看>>
PyQt QToolButton在焦点时不更新图标
查看>>
PyQt 正确使用 emit() 和 pyqtSignal()
查看>>
PyQT-将文件复制到剪贴板
查看>>
PYQT.如何在QTableView中插入小部件
查看>>
PyQt4 代码在 PyQt5 (QHeaderView) 上不起作用
查看>>
PyQt4 到 PyQt5 ->mainFrame() 已弃用,需要修复才能加载网页
查看>>
PyQt4, class:mouseButtons用法
查看>>
PyQt4参考文档
查看>>
PyTorch Lightning:通过分布式训练扩展深度学习工作流
查看>>
PyQt5 - QThread:在线程仍在运行时被销毁
查看>>
PyQt5 - 如何从工作线程发出信号以通过 GUI 线程调用事件
查看>>
PyQt5 Designer 不工作:此应用程序无法启动,因为无法初始化 Qt 平台插件
查看>>
PyQt5 QLCNumber 没有更新
查看>>
PyQt5 TabWidget选项卡BarClicked TypeError:本机Qt信号不可调用
查看>>
PyQt5 从 PyQt4 转换信号代码
查看>>