Nginx之进程间通信-共享内存篇
off999 2025-01-05 19:30 26 浏览 0 评论
前面我们介绍了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管理共享内存。 下篇继续
相关推荐
- 下载手机卫士(下载手机卫士官方版)
-
360手机卫士苹果版来自奇虎360推出的一款iPhone手机管理软件,360手机卫士苹果版推为iOS用户提供专业、完善和高效的移动设备管理服务,360手机卫士手机版可以实现流量监控、电池管家、隐私空间...
- 免费破解软件下载网站(免费破解版软件)
-
可以用腾讯手机管家的小火箭,它的功能很好用。安装完成以后,手机屏幕上就有那个加速圈--小火箭。使用小火箭加速平均提升手机速度35%。按住小火箭移到最下方,释放升空,即可轻松清理多余后台进程,释放手机内...
- 应用管家下载(应用市场官方正版下载安装)
-
1、在手机桌面找到腾讯手机管家,点击打开。2、找到右上角的头像,点击进入个人界面。3、点击右上角的齿轮图标,点击进入设置界面。4、找到安全检测,点击进去。5、找到屏幕下方的恶意网址拦截6、这样就把网址...
-
- 联通网上营业厅官网(中国联通官网登录入口)
-
联通综合门户网站网上营业厅是中国联通推出的全国统一网上营业厅,中国联通网上营业厅为用户提供话费查询、话费充值、业务办理等服务,还提供3G号码、4G号码、3G套餐、4G套餐、5G套餐、手机、手机配件和充值卡购买等服务。还可以购买套餐,送手机等...
-
2026-02-02 14:43 off999
- 联盟平台app(联盟平台app下载)
-
英雄联盟除了wegame别的基本上不可以用,因为如果是非腾讯合作伙伴,运行英雄加盟应该是被判为外挂插件,或者是你直接启动客户端不用任何插件这样也可以。原来用的是tgp后来一点点被改成了wegame,...
-
- 炒股神器免费版(炒股神器是真的吗)
-
炒股,指倒买倒卖股票。炒股的核心内容就是通过证券市场的买入与卖出之间的股价差额,获取利润。现在越多越来的人都了闲钱,可以用来投资理财。而炒股是许多人以钱生钱的首要选择,炒股回报高但是风险也极高。我们需要一款好的手机炒股软件来辅助我们判断。下...
-
2026-02-02 14:03 off999
- 软件商店oppo官方下载(软件商店oppo官方下载最新版安装newwear)
-
在桌面找到软件商店在oppo的桌面上找到软件商店,也就是应用商店。打开商店看到软件打开商店之后,能够看到有很多的软件。下载软件看详细信息在此界面可以进行下载软件,看到软件的详细信息。OPPO手机...
- 红警下载(红警下载中文版下载)
-
网上直接搜可以找到很多下载资源,但是这些资源不一定能用!如果真想玩,建议直接在某宝花几块钱购买资源,不仅方便而且会教给你怎么设置,出现什么问题怎么解决,很方便!这款游戏资源不是很好找,网上一搜确实能找...
- 申请qq号码官网(申请qq号码官方网站)
-
1、首先打开手机上的qq,然后点击新用户注册。2、在弹出的页面输入手机号码,并点击下一步。3、将手机收到的验证码输入下方的输入框内。4、在弹出的页面中点击继续注册。5、在弹出的页面中,点击不绑定。6、...
- 在哪里找软件开发公司(怎么找开发软件的公司)
-
建立一个软件开发公司一般需要有一个技术团队和一个业务团队,以及一个面向行业的成熟的框架。开发公司一般都有一个有相对有技术实力的团队为开发做支撑,另外现在快速开发也是越来越流行,快速开发依赖于一个相对成...
- 奇书网txt下载全文免费下载(余下全文免费阅读app下载)
-
奇书网创建于2006年09月25日,奇书网小说下载网是专业的TXT小说下载,TXT电子书下载,手机小说下载网站。每日更新最新,最热门全集全本完结小说的TXT电子书免费下载。该站已收录小说39000多部...
- 养成类单机游戏(养成类手游排行榜前十名)
-
经营类:1、游戏发展国2、吃货大食堂3、冒险迷宫村4、和风物语5、口袋商业街6、二战风云7、蘑菇园8、模拟人生系列角色扮演类:1、艾亚迪诺32、艾亚迪诺43、泽诺尼亚34、刺客信条动作类:1、蜘蛛侠2...
-
- 下载会声会影免费版(下载会声会影免费版软件)
-
会声会影X5安装步骤:1、首先要进行会声会影下载,下载完成后双击运行“会声会影x5.exe”文件,等待安装。2、认真阅读最终用户许可协议,勾选“我接受许可协议中的条款”,点击下一步。3、在城市/区域中选择“中国”,视频标准选择“PAL/SE...
-
2026-02-02 12:15 off999
- qq飞车官方正版下载(qq飞车官方正版下载手机版)
-
这得看LZ家是什么电脑,如果是笔记本就要2个小时左右,苹果只要20分钟,,,大电脑的话就得看宽带了,电脑性能也很重要,不过差不多要1个小时左右下载QQ飞车体验服需要按照以下步骤进行:在手机应用商店搜...
欢迎 你 发表评论:
- 一周热门
-
-
抖音上好看的小姐姐,Python给你都下载了
-
全网最简单易懂!495页Python漫画教程,高清PDF版免费下载
-
飞牛NAS部署TVGate Docker项目,实现内网一键转发、代理、jx
-
win7系统还原步骤图解(win7还原电脑系统的步骤)
-
Python 3.14 的 UUIDv6/v7/v8 上新,别再用 uuid4 () 啦!
-
python入门到脱坑 输入与输出—str()函数
-
16949认证费用是多少(16949审核员太难考了)
-
linux软件(linux软件图标)
-
Python三目运算基础与进阶_python三目运算符判断三个变量
-
(新版)Python 分布式爬虫与 JS 逆向进阶实战吾爱分享
-
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
