nginx 源代码分析 (一)

2021-06-16  本文已影响0人  RonZheng2010

1. ngx_pool_t

1.1 概述

ngx_pool_t提供内存分配接口。

ngx_pool_t对大块内存和小块内存的分配使用不同的策略。

对于大块内存(超过指定阈值,一般是内存的页大小4096),调用malloc()动态分配。

对于小块内存,则是先预分配大的内存块,然后根据需要从中动态分配小块的。

1.2 分配内存

ngx_create_pool()创建这个单向链表的第一个元素。

ngx_palloc()从指定的ngx_pool_t实例中分配内存。如果要求大块内存,则调用ngx_palloc_large(),否则调用ngx_palloc_small()。

对于ngx_palloc_small(),

对于ngx_palloc_large(),

1.3 释放内存

ngx_free()负责释放内存。它只是调用free()释放大块内存。实际上小块内存是不能一个一个释放的,nginx的策略是释放就释放全部。

ngx_reset_pool()释放所有大块内存,将ngx_pool_t链表置于未使用状态。

ngx_destroy_pool()释放所有大块内存,也释放ngx_pool_t链表自身占用的内存。

2. ngx_pool_cleanup_t

nginx_pool_t还用于保存“待清理的任务”,这个任务保存在ngx_pool_cleanup_t结构中,从预分配内存中分配。这也是一个单向链表,保存在ngx_pool_t的成员cleanup中。

ngx_pool_cleanup_t的成员handler是任务的处理函数,成员data是处理函数的参数。

3. ngx_array_t

ngx_array_t实现了数组。

ngx_array_create()创建数组。

ngx_array_push()从数组中得到一个可用的元素。

4. ngx_list_t

ngx_list_create()实现单向链表。与一般链表不同的是,它的链表中每一个元素中保存的是一个数组。下图是包含两个ngx_list_part_t元素的链表。

ngx_list_create()创建一个链表。

ngx_list_push()从链表中得到一个可用的位置。

5. ngx_queue_t

ngx_queue_t是一个双向链表。

使用ngx_queue_t的方式是,在结构中包含ngx_queue_t,就可以把结构串联起来。如下面的示意图。

ngx_queue_data()可以根据ngx_queue_t成员在结构中的位置偏移,从成员地址计算结构地址。

6. ngx_rbtree_t

ngx_rbtree_t实现红黑树,ngx_rbtree_node_t是树上的节点。

对于ngx_rbtree_node_t,

对于ngx_rbtree_t,

上一篇下一篇

猜你喜欢

热点阅读