Nginx的源码主要分布在src/目录下,而src/目录下主要包含三部分比较重要的模块。
- core:包含一些基本的库和框架,包含内存池,链表等数据结构
- event:事件模块,Nginx自己实现了事件模型
- http:实现的HTTP模块
Nginx是多进程的软件,是Master—work的结构,不需要太多考虑并发锁
且其高度模块化,遵循高内聚低耦合的原则
一·内存池
使用malloc/alloc等函数来分配和释放内存,但是这些函数频繁使用会导致内存碎片和内存泄漏等问题
ngx_alloc和ngx_calloc来封装malloc
使用内存池的好处:
- 提升内存分配效率。不需要每次分配内存都执行malloc/alloc等函数
- 让内存的管理变得更加简单。内存的分配都会在一块大的内存上,回收的时候只需要回收大块内存就能将所有的内存回收
内存分配逻辑:
分配一块内存,如果分配的内存size小于内存池的pool->max的限制,走小内存块分配逻辑,反之走大内存分配逻辑
小内存分配逻辑:循环读取pool->d上的内存块,是否有足够的空间容纳需要分配的size,如果可以容纳,则直接分配内存;否则内存池需要申请新的内存块,调用ngx_palloc_block。
大内存分配逻辑:当分配的内存size大于内存池的pool->max的限制,则会直接调ngx_palloc_large方法申请一块独立的内存块,并且将内存块挂载到pool->large的链表上进行统一管理。