本章我们主要讲述一下ngx_radix_tree的实现。
1. 函数ngx_radix_tree_create()
本函数用于创建基数树,失败时返回NULL指针。preallocate是预分配的基数树节点数,该值为-1时表示根据当前操作系统中一个页面大小来预分配radix tree节点。下面简要介绍一下本函数的实现:
1) 创建ngx_radix_tree_t数据结构
2) 计算当前的预分配节点数
当前ngx_pagesize
大小为4096,ngx_radix_node_t
结构体的大小为32,因此计算出preallocate=6,其实就是计算一个页面可以分配多少个预留节点。
从函数的注释中,我们了解到:预分配的节点的key(隐含,因为节点中并未有此字段)分别为0、1、00、01、10、11等,这样是为了提高查询时的TLB命中。在32-bit平台上,preallocate的值一般为7,即一页可以分配254个节点; 在64-bit平台上,preallocate的值一般为6,即一页可以分配126个节点; 否则默认分配510个节点。
3) 向radix tree中插入预分配的节点
2. 函数ngx_radix32tree_insert()
本函数用于向radix tree中插入节点,首先查找相应的插入位置,然后再从此位置插入mask中剩余位为1的节点。下面我们给出当preallocate
为6和5时构造radix tree的过程:
3. 函数ngx_radix32tree_delete()
此函数用于删除radix tree中的一个节点。下面我们简要介绍一下删除的实现:
4. 查找ngx_radix32tree_find()
这里查找节点较为简单,不详细介绍。
5. 函数ngx_radix128tree_insert()
与ngx_radix32tree_insert()类似,这里不再赘述。
6. 函数ngx_radix128tree_delete()
与ngx_radix32tree_delete()类似,这里不再赘述。
7. 函数
与ngx_radix32tree_find()类似,这里不再赘述。
8. 函数ngx_radix_alloc()
分配一页(page)大小的空间,然后从该空间中分配出一个ngx_radix_not_t
节点,剩余的空间保存在tree->start中。
[参看]
-
基数树结构ngx_radix_tree_t
-
nginx 学习八 高级数据结构之基数树ngx_radix_tree_t