菜鸟nginx源码剖析数据结构篇(十一) 共享内存ngx_shm_t[转]
菜鸟nginx源码剖析数据结构篇(十一) 共享内存ngx_shm_t
Author:Echo Chen(陈斌)
Email:chenb19870707@gmail.com
Date:Nov 14th, 2014
1.共享内存
共享内存是Linux下提供的最基本的进程通信方法,它通过mmap或者shmget系统调用在内存中创建了一块连续的线性地址空间,而通过munmap或者shmdt系统调用释放这块内存,使用共享内存的好处是多个进程使用同一块内存时,在任何一个进程修改了共享内存中的内容后,其它进程通过访问这段内存就能够得到内存变化。
2.源代码位置
头文件:http://trac.nginx.org/nginx/browser/nginx/src/core/ngx_shmtx.h
源文件:http://trac.nginx.org/nginx/browser/nginx/src/core/ngx_shmtx.c
3.数据结构定义
ngx_shm_t : 用于描述一块共享内存:
1: typedef struct {2: u_char *addr; //指向共享内存的起始地址
3: size_t size; //共享内存的长度
4: ngx_str_t name; //这块共享内存的名称
5: ngx_log_t *log; //记录日志的ngx_log_t对象
6: ngx_uint_t exists; //表示共享内存是否分配过的标志位,为1表示已经存在
7: } ngx_shm_t;
4.Linux 共享内存接口
共享内存申请mmap:
1: #include<sys/mman.h>
2: void*mmap(void* start,size_t length,int prot,int flags,
3: int fd,off_t offset);
mmap可以将磁盘文件映射到内存中,直接操作内存时Linux内核将负责同步内存和磁盘文件中的数据,fd参数就执行需要同步的磁盘文件,而offset则代表从文件的这个偏移量处开始共享,Nginx没有使用这一特性。当flags参数中加入MAP_ANON或者MAP_ANONYMOUS参数时表示不适用文件映射方式,这时fd和offset参数就都没意义了,不需要传递了。Nginx中就不需要同步到磁盘。
length参数就是将要在内存中开辟的线性地址空间大小
port参数表示操作这段共享内存的方式(只读或者可读可写)
start参数说明希望的共享内存起始地址,通常设为NULL
共享内存释放munmap:
1: #include<sys/mman.h>
2: int munmap(void *start,size_t length);
start所指的映射内存起始地址,参数length则是欲取消的内存大小
5.共享内存的主要操作
共享内存的主要操作有以下几种:
共享内存的分配 ngx_shm_alloc 共享内存的释放 ngx_shm_free 5.1 共享内存的分配 ngx_shm_alloc
1: ngx_int_t ngx_shm_alloc(ngx_shm_t *shm)
2: {3: //开辟一shm->size大小并且可读可写的共享内存,内存首地址放在shm->addr中
4: shm->addr = (u_char *) mmap(NULL, shm->size,
5: PROT_READ|PROT_WRITE,
6: MAP_ANON|MAP_SHARED, -1, 0);
7:
8: if (shm->addr == MAP_FAILED) {9: ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,
10: "mmap(MAP_ANON|MAP_SHARED, %uz) failed", shm->size);
11: return NGX_ERROR;
12: }
13:
14: return NGX_OK;
15: }
5.2 共享内存释放 ngx_shm_free
1: void
2: ngx_shm_free(ngx_shm_t *shm)
3: {4: //使用ngx_shm_t中的addr和size调用munmap释放共享内存
5: if (munmap((void *) shm->addr, shm->size) == -1) {6: ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,
7: "munmap(%p, %uz) failed", shm->addr, shm->size);
8: }
9: }
6.参考
《深入理解Ngxin》
菜鸟nginx源码剖析数据结构篇(十一) 共享内存ngx_shm_t[转]的更多相关文章
- 菜鸟nginx源码剖析数据结构篇(十) 自旋锁ngx_spinlock[转]
菜鸟nginx源码剖析数据结构篇(十) 自旋锁ngx_spinlock Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csd ...
- 菜鸟nginx源码剖析数据结构篇(九) 内存池ngx_pool_t[转]
菜鸟nginx源码剖析数据结构篇(九) 内存池ngx_pool_t Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csdn. ...
- 菜鸟nginx源码剖析数据结构篇(八) 缓冲区链表ngx_chain_t[转]
菜鸟nginx源码剖析数据结构篇(八) 缓冲区链表 ngx_chain_t Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.c ...
- 菜鸟nginx源码剖析数据结构篇(七) 哈希表 ngx_hash_t(下)[转]
菜鸟nginx源码剖析数据结构篇(七) 哈希表 ngx_hash_t(下) Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.c ...
- 菜鸟nginx源码剖析数据结构篇(六) 哈希表 ngx_hash_t(上)[转]
菜鸟nginx源码剖析数据结构篇(六) 哈希表 ngx_hash_t(上) Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.c ...
- 菜鸟nginx源码剖析数据结构篇(五) 基数树 ngx_radix_tree_t[转]
菜鸟nginx源码剖析数据结构篇(五) 基数树 ngx_radix_tree_t Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blo ...
- 菜鸟nginx源码剖析数据结构篇(四)红黑树ngx_rbtree_t[转]
菜鸟nginx源码剖析数据结构篇(四)红黑树ngx_rbtree_t Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csdn ...
- 菜鸟nginx源码剖析数据结构篇(三) 单向链表 ngx_list_t[转]
菜鸟nginx源码剖析数据结构篇(三) 单向链表 ngx_list_t Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csd ...
- 菜鸟nginx源码剖析数据结构篇(一)动态数组ngx_array_t[转]
菜鸟nginx源码剖析数据结构篇(一)动态数组ngx_array_t Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csdn ...
随机推荐
- pathlib生成文件的软链接
在训练深度网络时,保存模型,想要维护一个latest.t7的文件,想到给最好的模型创建一个软链接到latest.t7 这样模型不占地,还能便于后续脚本加载最好模型 起初是看到mmdetection中是 ...
- jmeter 实战
JMeter 接口测试 什么是接口测试 概念 内部接口 方法与方法之间的交互 模块与模块之间的交互 一种调用对外包装的接口 Web接口分类 web接口分类:https.http.webService ...
- USACO2012 Broken necklace /// DP oj10103
题目大意: 项链最长的纯色连续段,“w”即white白色珠子,可任意涂为红或蓝,“r” “b”即红 蓝. Input Line 1: N, the number of beads Line 2: ...
- 【2018ACM/ICPC网络赛】徐州赛区
呃.自闭了自闭了.我才不会说我写D写到昏天黑地呢. I Characters with Hash 题目链接:https://nanti.jisuanke.com/t/31461 题意:给你一个字符串 ...
- 事务和JDBC事务隔离级别
与事务相关的理论 mysql事物隔离级别:http://mj4d.iteye.com/blog/1744276 事务(Transaction): 是并发控制的单元,是用户定义的一个操作序列.这些操作要 ...
- 2018-12-25-C#-7.2-通过-in-和-readonly-struct-减少方法值复制提高性能
title author date CreateTime categories C# 7.2 通过 in 和 readonly struct 减少方法值复制提高性能 lindexi 2018-12-2 ...
- 解决 php Call to undefined function shm_attach()
学习php 多进程的时候,运行脚本报错 Call to undefined function shm_attach() ,搜了一下,看到stack overflow 里面提示需要配置这些扩展 exte ...
- JavaScript 数据值校验工具类
/** * 数据值校验工具类 */ var checkService = { // 不校验 none: function () { return true; }, //非空校验 isEmpty: fu ...
- CSS3——过渡
过渡(transition)是CSS3中具有颠覆性的特征之一,我们可以在不使用 Flash 动画或 JavaScript 的情况下,当元素从一种样式变换为另一种样式时为元素添加效果. 帧动画:通过一帧 ...
- type元类创建类的方法
一.代码 class_name='car' dict_name={} bases=(object,) class_body=''' def __init__(self,name): self.name ...