菜鸟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 ...
随机推荐
- Java & 架构硬核福利,速度上车!
极客时间福利时间! 最近,栈长每周都会给大家带来极客时间的专栏拼团优惠,给错过优惠的朋友一个再次优惠上车的机会. <从0开始学架构>和<Java核心技术36讲>,这两个专栏很火 ...
- 通过快递100获取快递单号,结合c-lodop热敏纸打印 – 通过菜鸟ISV/自研ERP使用菜鸟电子面单
https://www.1024cc.cn/index.php/2019/04/29/%E6%89%93%E5%8D%B0%E7%94%B5%E5%AD%90%E9%9D%A2%E5%8D%95/ 打 ...
- JS事件 文本框内容改变事件(onchange)通过改变文本框的内容来触发onchange事件,同时执行被调用的程序。
文本框内容改变事件(onchange) 通过改变文本框的内容来触发onchange事件,同时执行被调用的程序. 如下代码,当用户将文本框内的文字改变后,弹出对话框"您改变了文本内容!&quo ...
- 通讯录查询(Profile Lookup)——freeCodeCamp
- BlueHost主机建站方案怎样选择?
BlueHost是知名美国主机商,近年来BlueHost不断加强中国市场客户的用户体验,提供多种主机租用方案,基本能够满足各类网站建设需求.下面就和大家介绍一下建站应该怎样选择主机. 1.中小型网站 ...
- Android开发 retrofit入门讲解
前言 retrofit基于okhttp封装的网络请求框架,网络请求的工作本质上是 OkHttp 完成,而 retrofit 仅负责网络请求接口的封装.如果你不了解OKhttp建议你还是先了解它在来学习 ...
- AM8互联设置方法
Am8互联设置 这个只需要部署在一个总部的AM8的 Oiorg所在机器上就可以 环境: Windows 2012 or windows 2008,IIS ,.Net4 AM8 数据库必须升级到:201 ...
- python相关软件安装流程图解——MySQL 8.0.13安装教程(windows 64位)——MYSQL依赖的软件——MYSQL必须的系统DLL插件——MYSQL真正的安装
https://www.mysql.com/https://www.mysql.com/downloads/https://dev.mysql.com/downloads/windows/https: ...
- springboot跨域问题解决
package com.qif.xdqdm.config; import org.springframework.context.annotation.Bean; import org.springf ...
- Android Matrix理论与应用详解
转:http://zensheno.blog.51cto.com/2712776/513652 Matrix学习——基础知识 以前在线性代数中学习了矩阵,对矩阵的基本运算有一些了解,前段时间在使用GD ...