nginx源码分析-共享内存
本文主要为分析nginx的共享内存机制,以及在对nginx进行hack的过程中如何使用共享内存.权当笔记,如有不正确之处,敬请留言!
因为nginx对于请求是统一分配和统一释放,同时为多进程程序,在很多情况下需要使用到共享内存,包括访问控制、负载均衡、健康检查等。而使用nginx的核心源码结构开发应用服务器程序时,共享内存的使用也非常的重要,幸好nginx已经为我们实现得很好了,我们只需明白它的机制就可以轻松拿来使用了。
与共享内存相关的几个结构体:
ngx_cycle.h:
typedef struct ngx_shm_zone_s ngx_shm_zone_t; typedef ngx_int_t(*ngx_shm_zone_init_pt)(ngx_shm_zone_t *zone,void *data); struct ngx_shm_zone_s { void *data; ngx_shm_t shm; ngx_shm_zone_init_pt init; ngx_str_t name; void *tag; };
对于ngx_shm_zone_s结构体说明如下:
void *data; ― 为共享内存的存储地址,多数情况下该数据段与ngx_shm_t.addr存在关系,可以使用该项做为该共享内存是否初始化标记使用。
ngx_shm_zone_init_pt init; -共享内存初始化时调用,一般用于将分配到的共享内存进行初始化按照要求进行初始化.
ngx_shm_t shm; -指向物理分配到的内存.后续做详细说明
ngx_str_t name; -该段共享内存的名字,nginx对于name相同的内存段会视为同一段,因此,对于不同的共享内存,应当使用不同的名字.
void *tag; -与name具有一样的功能,但可以做为数据存储,用于检测name是否重复使用,一般指向模块的ngx_module_t.
ngx_shmem.h:
typedef struct { u_char *addr; size_t size; ngx_log_t *log; } ngx_shm_t; ngx_int_t ngx_shm_alloc(ngx_shm_t *shm); void ngx_shm_free(ngx_shm_t *shm);
u_char *addr; ― 通过ngx_shm_alloc分配到的共享内存块的地址。
size_t size; -该块共享内存的大小,一般在init函数中进行初始化.
ngx_log_t *log; -指向log句柄.
ngx_shm_alloc与ngx_shm_free分别为内存分配和释放的处理函数.在*unx平台下,还可以通过mmap创建共享内存.具体可参见ngx_shmem.c.
共享内存使用一个ngx_list_t进行存储,具体流程如下:
1、调用ngx_shared_memory_add,申请共享内存,函数原型如下:
ngx_shm_zone_t * ngx_shared_memory_add(ngx_conf_t *cf, ngx_str_t *name, size_t size, void *tag);
在调用ngx_shared_memory_add的过程中,nginx会对当前存在的共享内存list进行遍历,如果存在相关的申请则直接返回。
2、ngx_shared_memory_add函数调用会ngx_list_push往全局的cycle->shared_memory加入.
3、对申请到的共享内存进行相应的初始化,如下代码:
shm_zone->init = ngx_some_init; shm_zone->data = ctx;
以上操作在nginx进行conf文件解析的过程中会进行处理,当conf文件分析完成后,对于cycle->shared_memory这个list进行遍历并调用ngx_some_init,进行处理,至此,其它代码段中就可以使用该段共享内存了。
末完待续,后续添加共享内存使用的样例代码.
另外对于共享内存的使用还可以参考:Shared memory in nginx,对于slab和锁相关的机制,该文有详细介绍。
建议继续学习:
- 配置Nginx+uwsgi更方便地部署python应用 (阅读:105382)
- 搜狐闪电邮箱的 Nginx/Postfix 使用模式 (阅读:32506)
- 解析nginx负载均衡 (阅读:14457)
- Nginx模块开发入门 (阅读:9835)
- 检查nginx配置,重载配置以及重启的方法 (阅读:9060)
- Cacti 添加 Nginx 监控 (阅读:8897)
- Nginx+FastCgi+Php 的工作机制 (阅读:8825)
- nginx的配置文件 (阅读:8793)
- 奇怪的 Nginx 的 upstream timed out 引起响应 502 (阅读:8085)
- 解决IE6从Nginx服务器下载图片不Cache的Bug (阅读:7082)
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:libing 来源: 记录&分享
- 标签: nginx 共享内存
- 发布时间:2009-11-15 19:18:23
- [66] Oracle MTS模式下 进程地址与会话信
- [65] Go Reflect 性能
- [64] 如何拿下简短的域名
- [60] android 开发入门
- [59] 图书馆的世界纪录
- [59] 【社会化设计】自我(self)部分――欢迎区
- [58] IOS安全–浅谈关于IOS加固的几种方法
- [54] 视觉调整-设计师 vs. 逻辑
- [48] 界面设计速成
- [48] 读书笔记-壹百度:百度十年千倍的29条法则