Nginx源码分析 - 基础数据结构篇 - 单向链表结构 ngx_list.c(06)

nginx 单向链表 事实上,ngx_list_part_t数组中的元素才是用户想要存储的东西,ngx_list_t链表能够容纳的元素数量由ngx_list_part_t数组元素的个数与每个数组所能容纳的元素相乘得到。这里,pool内存池为其分配了连续的内存,最前端内存存储的是ngx_list_t结构中的成员,紧接着是第一个ngx_list_part_t结构占用的内存,然后是ngx_list_part_t结构指向的数组,它们一共占用size*nalloc字节,表示数组中拥有nalloc个大小为size的元素。 阅读详情

目录

一、数据结构定义

1. ngx_list_part_t 链表节点定义

2. ngx_list_t 链表结构

二、数据结构图

三、具体函数实现

1. 创建一个list ngx_list_create

2. 使用一个list元素 ngx_list_push


Nginx的list单向链表的结构和Nginx的数组结构Array有点类似,总体来说,数据结构也是非常简单清晰的。

Nginx的单向链表也是固定了每个元素的大小,并且用单向链表的方式连接。

一、数据结构定义


1. ngx_list_part_t 链表节点定义


typedef struct ngx_list_part_s  ngx_list_part_t;

/**
 * 链表节点  每个节点大小 = size * nelts
 * 节点元素用完后,每次就会分配一个新的节点
 */
struct ngx_list_part_s {
    void             *elts;  	/* 节点的内存起始位置 */
    ngx_uint_t        nelts; 	/* 已经使用的元素*/
    ngx_list_part_t  *next;  	/* 指向下一个链表节点*/
};

2. ngx_list_t 链表结构


/**
 * 链表结构
 */
typedef struct {
    ngx_list_part_t  *last;		/* 指向最新的链表节点*/
    ngx_list_part_t   part;		/* 第一个链表节点*/
    size_t            size;		/* 这个链表默认的每个元素大小 */
    ngx_uint_t        nalloc;	        /* 每个节点part 可以支持多少个元素*/
    ngx_pool_t       *pool;		/* 线程池*/
} ngx_list_t;

二、数据结构图


三、具体函数实现


1. 创建一个list ngx_list_create


通过调用ngx_list_create创建一个list,并且可以指定每个元素的大小以及每个节点元素个数。

/**
 * 创建链表
 */
ngx_list_t *
ngx_list_create(ngx_pool_t *pool, ngx_uint_t n, size_t size)
{
    ngx_list_t  *list;

    /* 从内存池上面分配一块内存,存储ngx_list_t数据结构 */
    list = ngx_palloc(pool, sizeof(ngx_list_t));
    if (list == NULL) {
        return NULL;
    }

    /* 分配一个链表节点的内存块。内存大小  n * size*/
    list->part.elts = ngx_palloc(pool, n * size);
    if (list->part.elts == NULL) {
        return NULL;
    }

    list->part.nelts = 0; 		/* 使用的元素个数	*/
    list->part.next = NULL; 	/* 下一个节点		*/
    list->last = &list->part; 	/* 最后一个节点地址 	*/
    list->size = size;  		/* 每个元素的大小	*/
    list->nalloc = n;			/* 分配多少个 		*/
    list->pool = pool;			/* 线程池			*/

    return list;
}

2. 使用一个list元素 ngx_list_push


使用ngx_list_push方法可以使用一个元素,并且返回元素的指针地址。如果节点元素已经用完,则会创建一个新的链表

void *
ngx_list_push(ngx_list_t *l)
{
    void             *elt;
    ngx_list_part_t  *last;

    last = l->last;

    /* 如果最后一个链表节点的元素已经用完,则需要创建一个新的链表*/
    if (last->nelts == l->nalloc) {

        /* the last part is full, allocate a new list part */

    	/* 分配一块内存,存储ngx_list_part_t数据结构 */
        last = ngx_palloc(l->pool, sizeof(ngx_list_part_t));
        if (last == NULL) {
            return NULL;
        }

        /* 分配一个链表节点的内存块。内存大小  n * size*/
        last->elts = ngx_palloc(l->pool, l->nalloc * l->size);
        if (last->elts == NULL) {
            return NULL;
        }

        last->nelts = 0;
        last->next = NULL;

        l->last->next = last;
        l->last = last;
    }


    /* 返回元素指针 */
    elt = (char *) last->elts + l->size * last->nelts;
    last->nelts++;

    return elt;
}

 

 

数据结构之单链表非常详细介绍(适合小白) 数据结构深度学习之单链表非常详解解读~~~一万多字详解 阅读详情

相关推荐

3D点云处理:PointNet++与PointTransformer的对比

摘要: 3D点云处理中,PointNet++和PointTransformer是两种主流深度学习模型。PointNet++通过分层采样和分组策略提取局部特征,而PointTransformer利用自注意力机制捕捉全局上下文。实验表明,PointTransformer在分类(ModelNet40准确率92.1%)和分割(ShapeNet mIoU 85.7%)任务上性能更优,但计算开销较大(训练时间180秒/轮)。PointNet++在实时性场景更具优势(训练时间120秒/轮)。未来可结合两者优势,或优化Tr

shejizuopin的博客 1121

Nginx高效数据结构(2)——链表(ngx_list_t)

Nginx是我们学习编程的一个非常有参考价值的开源项目。良好的编码风格,高效的数据结构、架构设计。

JK-Cool的博客 1856

BIOS更新后PIN不可用怎么办?从原理到实操的完整修复指南

在计算机维护中,BIOS更新是常见的固件升级操作,但其引发的登录异常却常让用户措手不及。Windows Hello PIN并非传统密码,它通过TPM芯片与设备启动环境(PCR状态)强绑定,一旦主板固件或安全启动配置改变,TPM便会拒绝释放密钥,导致“由于此设备上的更改,你的PIN不再可用”。理解这一原理后,恢复路径清晰可控:优先尝试密码登录,或通过WinRE替换utilman.exe创建临时管理员,必要时还需处理BitLocker恢复密钥。本文面向系统维护与数据安全场景,系统梳理PIN失效的恢复流程与避坑方

weixin_31364787的博客 363

线性结构——单向链表基础知识(链表的概念、意义、建立、遍历、删除、插入)

也就是说为什么能在结构体的定义中,像递归函数一样,使用该结构体类型定义指针:首先,除了定义该结构体的指针以外,其他涉及到该结构体类型的定义都不成立(例如不可以在里面定义一个“linker example”)。理由是这个结构体定义还未完成,占用内存大小不确定,系统无法为变量分配内存。这个回答也是为什么指针可以的原因,因为任何类型的指针(包括int、char以及结构体)占用的空间都是确定且相等的八个字节,系统在分配内存时不会有任何疑惑。

2301_80080092的博客 542

电子工程师必看:dB与放大倍数快速换算表(附常见误区解析)

本文为电子工程师提供了dB与放大倍数快速换算的实战指南。文章深度解析了分贝的本质与核心价值,并提供了电压/电流与功率增益的速查表及心算技巧。重点剖析了混淆电压与功率dB、-3dB带宽理解等常见误区,并结合示波器、频谱仪测量及系统级应用,帮助工程师在实际工作中高效、准确地运用这一对数工具。

weixin_29214199的博客 655

手眼标定(EyeToHand)推导

Base为基坐标系(B),工具末端坐标系(T),标定板为Mark坐标系(M),相机坐标系(C)对于每两个姿态都存在上式,组成一个AX=XB的矩阵方程,X为。此时转换成AX=0的问题,单纯用SVD求奇异解便可得到。相机坐标系到Base基坐标系下的转换关系。已知标定板与机械臂末端的相对位置固定不变,,即。带入(2)式求,至此求解出需要的手眼矩阵。在眼在手外的时候,其实是要求解。

stevenreally6的博客 1143

数据结构——单向链表

链表(Linked List)是一种常见的数据结构,它属于线性表的一种链式存储结构,其逻辑上相邻的元素在物理存储位置并不相邻。它由一系列节点(Node)组成,每个节点包含数据部分和指向列表中下一个节点(或者上一个节点)的指针(链接)。链表中的节点通过指针相互连接,从而形成一个序列。链表可以分为几种不同的类型,但最常见的是单向链表和双向链表。

脑壳有点痒,好像要长脑子了! 2507

Coze离线部署实战:从镜像拉取到服务启动的完整避坑指南

本文提供了一份详尽的Coze平台离线部署实战指南。针对无外网的生产环境,详细讲解了从Docker镜像拉取、打包传输到内网服务器加载的完整流程,并重点剖析了使用docker-compose启动服务时常见的配置错误与权限问题,如文件挂载缺失、网络绑定错误等,提供了经过验证的避坑解决方案,旨在帮助运维和开发人员一次性成功部署。

weixin_29310605的博客 328

单向链表结构

本文简要介绍了单向链表的结构以及实现了一个单向链表类

qq_59750520的博客 972

采用了fluent模拟了平壁面结霜过程。udf,很经典,可以试试。

利用该模型作为FLUENT中的源项,模拟了在局部冷却下冷表面上的霜形成,以预测霜的形态、温度分布和霜的重量,结果与实验结果吻合良好。结果显示,霜首先围绕冷却块形成,然后逐渐向其他方向扩展,冷却块上方的霜密度最大。随着时间的推移,平均霜厚度逐渐增加,生长速率减慢,而平均霜密度随增长速率变快而增加。相变传递微观过程与机理、蒸发及冷凝换热、强化传热、高效传热管、热泵、制冷、节水节能新技术、电子元器件冷却、余热回收及梯级利用等。udf,很经典,可以试试。工程热物理、空调、热能、低温制冷、化工、物理等。

qq_15963745的博客 922

多模态论文笔记——CogVLM和CogVLM2

本文详细介绍LoRA版本的多模态模型——CogVLM和CogVLM2。在SD3中使用其作为captioner基准模型的原因和优势。

haopinglianlian的博客 2203

openresty shared api调用

通过 lua_shared_dict 指令可以声明一个共享内存区域,可以在多个 worker 进程间共享,单位支持 k、m,然后配合 ngx.shared.DICT api函数来操作。nginx -s reload 后共享内存的数据还在。 这个共享内存功能非常有用,极大的便利了worker 进程间的通信和协作,而且还提供了类似 redis 的数据结构,可以当做一个简易的数据库,而且没有通信开销。 共享内存在 Openresty 里用途很广,基于它可以实现流量统计、缓存、进程锁等高级功能。 http

Eric 1282

YOLOv11 改进 - C2PSA | C2PSA融合TSSA(Token Statistics Self-Attention)令牌统计自注意力,优化遮挡目标感知

本文介绍了Token Statistics Self-Attention(TSSA)机制,并将其集成到YOLOv11中。传统自注意力计算复杂度高,TSSA进行了范式转变,基于token统计特征实现高效注意力交互。它通过“算法展开”推导得出,以“最大编码率降低”为目标,实现特征学习。TSSA包含动态分组和低秩投影优化两步创新,具备线性复杂度。我们将TSSA代码集成到YOLOv11的C2PSA模块中。实验表明,改进后的YOLOv11在目标检测任务中表现良好,验证了TSSA机制的有效性。

魔改工程师的博客 669

openresty ngx_lua共享内存

openresty ngx_lua共享内存

weixin_43931625的博客 3701

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

nginx的list数据结构

nginx的list比较简单,主要在文件src/core/ngx_list.h和src/core/ngx_list.c两个文件中,可以说是麻雀虽小,五脏俱全。 1、ngx_list的结构 其定义如下: struct ngx_list_part_s { void *elts; //元素的首地址 ngx_uint_t nelts; //元素

多看多听多总结 1303

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Openresty(二十)ngx.shared共享内存操作

mgx.shared.DICT

wzj_110的博客 4371

【数据结构】超详细--单向链表

保姆级,超详细的C语言来实现数据结构的单向非循环链表功能

joes_ju的博客 959

数据结构—单向链表(详解)

基于C语言的链表基础,包括概念,链表的初始化,插入,删除,查找等操作。

梅山 1万+

数据结构 — 单向链表

链表是编程语言中常见的一种数据结构,它可以实现动态的创建和删除,只要内存足够,链表的数量和长度是可以无限多和无限长的。

weixin_43866583的博客 785

数据结构之链表---单向链表

单向链表,数据结构

weixin_55530858的博客 1732

菜鸟nginx源码剖析数据结构篇(三) 单向链表 ngx_list_t

ngx_list _t是一个顺序容器,它实际上是动态数组和单向链表的结合体,扩容起来比动态数组简单的多,可以一次扩容一个数组,所以说它结合了 链表插入删除不需要移动的 和 数组下标快速索引 的优势,设计非常让人叫绝,此外它还有以下特点: 链表中存储的元素是灵活的,可以是任何一种数据结构。 链表元素需要占用的内存由ngx_list_t管理,它已经通过数组分配好了。 小块的内存使用链表访问O(n)效率是低下的,可以使用数组通过直接通过偏移量来直接访问O(1)。

@Echo· 个人技术笔记 1万+

nginx源码分析—链表结构ngx_list_t

本博客(http://blog.csdn.net/livelylittlefish )贴出作者(阿波)相关研究、学习内容所做的笔记,欢迎广大朋友指正! Content 1.链表结构 1.2 ngx_list_t的逻辑结构 2.1创建链表 3.一个例子 3.2如何编译 4.小结 0. 序   本文继续介绍nginx的容器——链表。 链表实现文件:文件:.

学习,思考,记录,分享。 1万+

Nginx数据结构

Nginx数据结构 【人物1】 避免的一些葡萄冰糖分2节两地方,我们课时分几次排5次课已经够了,排5次课已经够了,那现在这里面分2个电话,等下又出现这种课安排不是很紧凑, 所以呢这次呢我们就跟大家核心的就跟大家讲讲这个恩吉斯的数据结构,首先我们来问一下,我想问一下各位,我们如果尽管上面几个大家有下载恩吉斯原貌的朋友可以看老师也双肩老板,他说你没有自己去看过恩迪斯原貌的朋友。 那我们再来问大家一个问题,就是历史原法里面该怎么去看里面有哪些东西?首先解释一下, 在温恩吉斯这个代码的话,他在面试的过程中间被问到的

qq_46118239的博客 3406

nginx 源码学习(五) 基本数据结构 ngx_list_t

ngx_list_t 介绍 ngx_list_t是nginx封装的单链表容器, 它在nginx中的应用比较频繁, 比如在nginx 源码中src/http/ngx_http_request.{h,c}的HTTP的头部就是使用 ngx_list_t来存储的。这个链表结构和我们常见的链表有所不同, 其不同点在于链表的每一个节点,它的节点不像我们常见的单链表的节点(即每 个节点只能存放一个元素

Daniel 的技术笔记 不积跬步无以至千里,不积小流无以成江海。 5511

SPSS中介效应分析:Process插件实现简单中介模型全流程

在统计建模与社科研究中,中介效应分析用于揭示自变量对因变量影响的内部传导机制,解释“如何”与“为何”的问题。其核心原理是将总效应分解为直接效应与间接效应,通过路径系数a、b及乘积项ab评估中间变量的传递作用。传统回归方法难以正确处理间接效应的非正态分布问题,而Bootstrap抽样技术则基于重采样构建置信区间,无需依赖正态假设,显著提升了小样本和偏态数据下的检验稳定性。该技术广泛应用于心理学、管理学、教育学等领域的机制探索。在实际操作中,SPSS搭配Process宏插件是实现简单中介效应检验的主流方案,本文

weixin_34221073的博客 703
上一篇: Nginx源码分析 - 基础数据结构篇 - 双向链表结构 ngx_queue.c(05)
下一篇: Nginx源码分析 - 基础数据结构篇 - hash表结构 ngx_hash.c(07)
老码农zhuli
老码农zhuli 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄14年 2456粉丝 312原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值