前面介绍了Nginx的多进程模型,多个worker进程间通信主要通过共享内存实现。
今天我们来学习一下Nginx的共享内存吧。
那么,进程该如何创建共享内存呢?
如果使用我们的malloc分配内存,则只分配进程的专用内存,不能在多个工作器进程之间共享。 Linux封装了POSIX API,如mmap、munmap等。
Nginx封装了一个统一的接口来使用共享内存。
文件名:ngx_cycle.h
typedefstructngx _ shm _区域_ sngx _ shm _区域_ t;
typedef ngx _ int _ t (ngx _ shm _ zone _ init _ pt ) ngx_shm_zone_t *zone,音频*数据);
结构ngx _ shm _区域_ s
视频*数据; //
ngx_shm_t shm; //共享内存的重要结构
ngx_shm_zone_init_pt init;区域组织; //初始回调函数
void *标签; //标签通常将模块名称设置为软件包名称,以防止shm.name重复
虚拟同步;
ngx _ uint _ t无再使用;/*无符号资源:1; */
(;
文件名:ngx_shmem.h
类型结构
u _字符添加器; //分配存储器的起始地址
大小; //内存大小
NGX _ STR _ t名称; //共享内存名称
ngx _日志_ t *日志; //日志
ngx _ uint _ t现代化;/*无符号现代化:1; */
} ngx_shm_t;
//共享存储器的创建很快
ngx _ int _ tngx _ shm _ alloc (ngx _ shm _ t * shm );
//释放共享存储器很快
voidngx_shm_free(ngx_shm_t*shm );
Nginx主要使用共享内存模块:
在这里主要使用了两种数据结构:
红树:如限速、流量控制、高速缓存等。 因为这些场景需要快速增加删除节点。
链表:这样的场景只需要连接信息就可以了。
Nginx为了确保多个worker进程之间的同步,防止多个进程同时写入共享存储器块,引入了自旋锁。
如果进程1拥有锁定,则进程2将不断访问该锁定。 打个比方,就像过程1中蹲着一个洞,过程2来了就一直在门口敲门。 由于这种结构,在Nginx上,所有模块都必须迅速使用共享内存。 也就是说,需要迅速获取锁定,迅速解除锁定。 如果出现带着锁长时间放置的东西,性能会大幅下降。
让我们来看看有关Nginx锁的数据结构
文件名: ngx_shmtx.h
类型结构
ngx原子锁定;
} ngx_shmtx_sh_t;
类型结构
ngx原子锁定; 对ngx_shmtx_sh_t的锁定锁定
ngx _单元旋转; //自选次数
} ngx_shmtx_t;
//制作排他锁
ngx _ int _ tngx _ shm tx _ create (ngx _ shm tx _ t * MTX,ngx _ shm tx _ sh _ t *添加符号,u _ char *名称);
//放弃排他锁
void ngx _ shm tx _ destroy (ngx _ shm tx _ t * MTX );
//非阻塞尝试获取互斥
ngx _ uint _ tngx _ shm tx _ trylock (ngx _ shm tx _ t * MTX );
//通过块方式获取锁定
void ngx _ shm tx _ lock (ngx _ shm tx _ t * MTX );
//解除排他锁定
void ngx _ shm tx _解锁(ngx _ shm tx _ t * MTX );
Nginx锁定的操作方法:
Nginx还使用Slab管理共享内存。 下一篇继续
# #程序员##Nginx#