网站首页 > 技术教程 正文
前面我们介绍了Nginx的多进程模型,多个worker进程间通信 主要是用共享内存来实现的。
今天我们就来学习下Nginx的共享内存。
那么进程该如何创建共享内存呢?
如果按照使用我们的malloc来分配内存的话,只会分配出进程的私有内存,并不能在多个worker进程间共享。Linux为我们封装了POSIX API 如 mmap, munmap。
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; // 初始回调函数
void *tag; // 标签 一般设置为模块名 类似包名 防止shm.name重复
void *sync;
ngx_uint_t noreuse; /* unsigned noreuse:1; */
};
文件名:ngx_shmem.h
typedef struct {
u_char *addr; // 分配内存的起始地址
size_t size; // 内存大小
ngx_str_t name; // 共享内存名称
ngx_log_t *log; // 日志
ngx_uint_t exists; /* unsigned exists:1; */
} ngx_shm_t;
// 创建共享内存快
ngx_int_t ngx_shm_alloc(ngx_shm_t *shm);
// 释放共享内存快
void ngx_shm_free(ngx_shm_t *shm);
Nginx主要使用了共享内存的模块:
这里主要用到了2种数据结构:
红黑树:比如限速,流控,缓存等。 因为这些场景需要快速增加 删除节点。
单链表:这种场景只需要把信息串起来就可以了。
Nginx为了保证多个worker进程之间同步,防止多个进程同时写共享内存块,从而引入了自旋锁。
如果进程1持有了锁,那么进程2会不停地去访问这把锁。打个比喻的话,就类似一个坑已经被进程1蹲了,那么进程2来了就在门口一直敲门。正是由于这种机制,Nginx要求所有的模块都要快速使用共享内存,即:快速获得锁,快速释放锁。一旦出现有拿着锁 长时间不放的,就会严重降低性能。
我们来一起了解一下Nginx锁的相关数据结构
文件名:ngx_shmtx.h
typedef struct {
ngx_atomic_t lock;
} ngx_shmtx_sh_t;
typedef struct {
ngx_atomic_t *lock; // 指向ngx_shmtx_sh_t的lock锁
ngx_uint_t spin; // 自选次数
} ngx_shmtx_t;
// 创建互斥锁
ngx_int_t ngx_shmtx_create(ngx_shmtx_t *mtx, ngx_shmtx_sh_t *addr, u_char *name);
// 销毁互斥锁
void ngx_shmtx_destroy(ngx_shmtx_t *mtx);
// 无阻塞试图获取互斥锁
ngx_uint_t ngx_shmtx_trylock(ngx_shmtx_t *mtx);
// 阻塞方式获取锁
void ngx_shmtx_lock(ngx_shmtx_t *mtx);
// 释放互斥锁
void ngx_shmtx_unlock(ngx_shmtx_t *mtx);
Nginx锁的操作方法:
此外,Nginx还使用了Slab管理共享内存。 下篇继续
猜你喜欢
- 2024-10-15 Nginx学习笔记(03)配置文件events段核心参数用法
- 2024-10-06 推荐一款自动扫描nginx下ssl证书过期时间工具
- 2024-10-06 集群服务器时间同步(集群服务器文件同步)
- 2024-10-06 Nginx日志管理大揭秘:logrotate工具与配置,日志按日期精准分割
你 发表评论:
欢迎- 最近发表
-
- linux CentOS检查见后门程序的shell
- 网络安全工程师演示:黑客是如何使用Nmap网络扫描工具的?
- Linux中ftp服务修改默认21端口等(linux修改ftp配置文件)
- Linux系统下使用Iptables配置端口转发,运维实战收藏!
- 谈谈TCP和UDP源端口的确定(tcp和udp的端口号相同吗)
- Linux 系统 通过端口号找到对应的服务及相应安装位置
- 快速查找NAS未占用端口!Docker端口秒级排查+可视化占坑双杀技
- 【知识杂谈#2】如何查看Linux的(本地与公网)IP地址与SSH端口号
- 如何在Linux中查询 DNS 记录,这三个命令可谓是最常用、最经典的
- 【Linux系统编程】特殊进程之守护进程
- 标签列表
-
- 下划线是什么 (87)
- 精美网站 (58)
- qq登录界面 (90)
- nginx 命令 (82)
- nginx .http (73)
- nginx lua (70)
- nginx 重定向 (68)
- Nginx超时 (65)
- nginx 监控 (57)
- odbc (59)
- rar密码破解工具 (62)
- annotation (71)
- 红黑树 (57)
- 智力题 (62)
- php空间申请 (61)
- 按键精灵 注册码 (69)
- 软件测试报告 (59)
- ntcreatefile (64)
- 闪动文字 (56)
- guid (66)
- abap (63)
- mpeg 2 (65)
- column (63)
- dreamweaver教程 (57)
- excel行列转换 (56)
本文暂时没有评论,来添加一个吧(●'◡'●)