首页 > 编程知识 正文

共享内存实现原理(docker容器与容器之间通信)

时间:2023-05-04 14:20:33 阅读:82073 作者:692

前面介绍了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#

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。