【Nginx源码剖析-数据结构】双向链表(queue)【未完】
来源:互联网 发布:如何安装apache服务器 编辑:程序博客网 时间:2024/06/05 04:36
Nginx的双向链表
一、双向链表的主要作用
链表是一种顺序容器,其主要优势在于可以高效的插入、删除、分割、合并。
在对链表进行移动时,不需要过多的操作,只需要修改指针域的指向。
双向链表是链表的加强版本,优势在于优化了单项链表向前操作时的问题。
二、适用范围
适用于频繁的对容器元素数量进行增删的场合
三、源码位置
src/core/ngx_queue.c
src/core/ngx_queue.h
四、Nginx中的数据结构
Nginx双向链表的实现类似Linux内核,只实现了指针域,没有实现data域,具体定义及实现如下:
/* * Copyright (C) Igor Sysoev * Copyright (C) Nginx, Inc. */#include <ngx_config.h>#include <ngx_core.h>#ifndef _NGX_QUEUE_H_INCLUDED_#define _NGX_QUEUE_H_INCLUDED_typedef struct ngx_queue_s ngx_queue_t;struct ngx_queue_s { ngx_queue_t *prev; // 前置指针域 ngx_queue_t *next; // 后置指针域};// 初始化双向链表#define ngx_queue_init(q) \ (q)->prev = q; \ (q)->next = q// 检测链表h是否为空,是空返回0,不是返回1#define ngx_queue_empty(h) \ (h == (h)->prev)// 将元素x插入链表h的头部#define ngx_queue_insert_head(h, x) \ (x)->next = (h)->next; \ (x)->next->prev = x; \ (x)->prev = h; \ (h)->next = x#define ngx_queue_insert_after ngx_queue_insert_head#define ngx_queue_insert_tail(h, x) \ (x)->prev = (h)->prev; \ (x)->prev->next = x; \ (x)->next = h; \ (h)->prev = x#define ngx_queue_head(h) \ (h)->next#define ngx_queue_last(h) \ (h)->prev#define ngx_queue_sentinel(h) \ (h)#define ngx_queue_next(q) \ (q)->next#define ngx_queue_prev(q) \ (q)->prev#if (NGX_DEBUG)#define ngx_queue_remove(x) \ (x)->next->prev = (x)->prev; \ (x)->prev->next = (x)->next; \ (x)->prev = NULL; \ (x)->next = NULL#else#define ngx_queue_remove(x) \ (x)->next->prev = (x)->prev; \ (x)->prev->next = (x)->next#endif#define ngx_queue_split(h, q, n) \ (n)->prev = (h)->prev; \ (n)->prev->next = n; \ (n)->next = q; \ (h)->prev = (q)->prev; \ (h)->prev->next = h; \ (q)->prev = n;#define ngx_queue_add(h, n) \ (h)->prev->next = (n)->next; \ (n)->next->prev = (h)->prev; \ (h)->prev = (n)->prev; \ (h)->prev->next = h;#define ngx_queue_data(q, type, link) \ (type *) ((u_char *) q - offsetof(type, link))ngx_queue_t *ngx_queue_middle(ngx_queue_t *queue);void ngx_queue_sort(ngx_queue_t *queue, ngx_int_t (*cmp)(const ngx_queue_t *, const ngx_queue_t *));#endif /* _NGX_QUEUE_H_INCLUDED_ */
阅读全文
0 0
- 【Nginx源码剖析-数据结构】双向链表(queue)【未完】
- 菜鸟nginx源码剖析数据结构篇(二) 双向链表ngx_queue_t
- 菜鸟nginx源码剖析数据结构篇(二) 双向链表ngx_queue_t
- 数据结构---nginx-1.7.12源码分析 (双向链表)
- nginx高级数据结构源码分析(一)-----双向链表
- vxworks源码剖析- 数据结构篇一(双向链表)_1(转)
- vxworks源码剖析- 数据结构篇一(双向链表)-转
- Nginx:双向队列(Queue)
- 菜鸟nginx源码剖析数据结构篇(三) 单向链表 ngx_list_t
- 菜鸟nginx源码剖析数据结构篇(三) 单向链表 ngx_list_t
- 菜鸟nginx源码剖析数据结构篇(八) 缓冲区链表ngx_chain_t
- 菜鸟nginx源码剖析数据结构篇(八) 缓冲区链表ngx_chain_t
- 菜鸟nginx源码剖析数据结构篇(八) 缓冲区链表ngx_chain_t
- 菜鸟nginx源码剖析数据结构篇(八) 缓冲区链表ngx_chain_t
- 【Redis源码剖析】 - Redis内置数据结构之双向链表list
- 【Nginx源码剖析-数据结构】数据结构梳理
- nginx源码分析2———基础数据结构二(链表和双向链表)
- Nginx源码分析 - 基础数据结构篇 - 双向链表结构 ngx_queue.c
- HTML标签meta在seo中的作用
- Gh0st通信协议解析
- 使用动态内存分配的通讯录实现
- python函数式编程之装饰器
- javascript设计模式之迭代器模式
- 【Nginx源码剖析-数据结构】双向链表(queue)【未完】
- SharePoint跨域访问
- BZOJ 2463 谁能嬴呢?
- 遭遇战(特长生准备)
- Linux并发控制——顺序锁(seqlock)
- 使用Redux和ngrx构建更好的Angular2应用(三)
- 关于cpu分段的段地址计算
- datagrid的文字换行与连续字符串换行处理,字符串三种截取方式
- 特长生模拟——侦察兵