Nginx基础组件的使用
- 一、Nginx 的相关组件介绍
- 1.1、ngx_palloc相关源码
- 1.2、ngx_array组件的相关源码
- 1.3、ngx_array的数据结构
- 1.4、ngx_cycle简介和相关源码
- 1.5、ngx_list相关源码
- 1.6、ngx_list 的数据结构
- 二、Nginx 组件的使用
- 2.1、makefile的编写
- 2.2、ngx_palloc+ngx_array的使用
- 2.3、ngx_palloc+ngx_list的使用
- 总结
Nginx自己实现了一个内存池组件。Nginx作为服务器,当客户端 TCP连接 &HTTP请求 到来时,Nginx会为该连接创建一个专属的内存池;这个内存池的生命周期是连接建立时创建,连接断开时销毁。客户端和Nginx通信的所有数据和操作(HTTP协议解析、HTTP数据解析等)都在内存池中完成。
/src/core/ngx_palloc.h。(相关实现在/src/core/ngx_palloc.c文件)
/src/core/ngx_palloc.c
/src/core/ngx_core.h
/src/core/ngx_array.h
array在内存里的布局:
0 : size
1 : size
2 : size
... : size
nalloc -1 : size
ngx_array_t
Nginx的每个进程内部都有一个自己的ngx_cycle。
/src/core/ngx_cycle.h
/src/core/ngx_list.h
list 在内存里的布局:
part
part
ngx_list_t
part
part
*elts
nelts
*next
*elts
nelts
*next
*elts
nelts
*next
*last
size
nalloc
*pool
*elts
nelts
*next
Nginx的内存池分成大小块,小块是要么不释放要么全部释放。ngx_create_pool(size_t size, ngx_log_t *log)里的size就是用来区分大小块的,大于size的就是大块,否则就是小块。
注意nginx的源码路径以及所需库的路径,要写正确的。
示例代码:
使用makefile来编译,执行结果:
可以看到:
- 代码中分配的内存池是1024,分配之后只有944可以用,有80字节被使用了。这80字节其实是被内存池的头占用了(ngx_pool_t)。
- 分配完一个32的数组后,内存池还剩余的内存为648,也就是32*8=256被分配给了数据。
- 数组内存分配好之后,使用数组元素已经不会再去申请内存池的内存。
- 如果数组元素用完了,还调用ngx_array_push会怎么样?从ngx_array.c的源码中可以发现,它会动态扩容数组,重新分配2*size。
示例代码:
使用makefile来编译,执行结果:
可以发现,ngx_list相比ngx_array少了()字节,从源码的ngx_list_create()函数可以发现,是因为多了一个ngx_list_t的头数据。
这里对ngx_string、ngx_array、ngx_list做了简单介绍和提供使用示例,其他的nginx基础组件的使用(比如dequeue、hash、log等等)也是类似的。
到此这篇ifstream和ofstream和fstream(ifstream fail)的文章就介绍到这了,更多相关内容请继续浏览下面的相关 推荐文章,希望大家都能在编程的领域有一番成就!版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/rfx/33974.html