linux 下共享内存
一、共享内存相关知识
所谓共享内存,就是多个进程间共同地使用同一段物理内存空间,它是通过将同一段物理内存映射到不同进程的 虚拟空间来实现的。由于映射到不同进程的虚拟空间中,不同进程可以直接使用,不需要像消息队列那样进行复制,所以共享内存的效率很高。共享内存可以通过mmap()映射普通文件机制来实现,也可以System V共享内存机制来实现,System V是通过映射特殊文件系统shm中的文件实现进程间的共享内存通信,也就是说每个共享内存区域对应特殊文件系统shm中的一个文件。
二、共享内存原理
System V共享内存把所有共享数据放在共享内存区,任何想要访问该数据的进程都必须在本进程的地址空间新增一块内存区域,用来映射存放共享数据的物理内存页面。System V共享内存通过shmget函数获得或创建一个IPC共享内存区域,并返回相应的标识符,内核在保证shmget获得或创建一个共享内存区,初始化该共享内存区相应的shmid_kernel结构,同时还将在特殊文件系统shm中创建并打开一个同名文件,并在内存中建立起该文件的相应的dentry及inode结构,新打开的文件不属于任何一个进程,所有这一切都是系统调用shmget函数完成的。
三、sysctl.conf 配置文件
以上两段说明部分是从互联网中找到的理解的内容。而做为Linux系统维护人员,能接触到的与共享内存相关的设置主要在/etc/sysctl.conf中的几个配置项。具体如下:
- kernel.shmmax = 4398046511104
- kernel.shmall = 1073741824
- kernel.shmmni = 4096
以下是redhat6官方提供的一份安装oracle的文档关于共享内存的部分介绍,如下:
完整版的redhat官方文档可以查看这里。
注:需要注意的是free -m命令的输出里也有一项shared,不过通过查看多台主机发现,这项都是0,后来查找资料确认在free命令里共享内存这项已经废弃,没有什么用了。所以共享内存的查看不可以通过该项确认。
四、ipcs与ipcrm
ipcs
ipcs是Linux下显示进程间通信设施状态的工具。可以显示消息队列、共享内存和信号量的信息。对于程序员非常有用,普通的系统管理员一般用不到此指令。
- $ipcs -m 查看系统使用的IPC共享内存资源
- $ipcs -q 查看系统使用的IPC队列资源
- $ipcs -s 查看系统使用的IPC信号量资源
- $ipcs -l 查看系统参数配置
- 默认不加参数时,使用的参数是 -a (all,显示所有)
输出示例如下:
- # ipcs
- ------ Message Queues --------
- key msqid owner perms used-bytes messages
- ------ Shared Memory Segments --------
- key shmid owner perms bytes nattch status
- 0x6c04c831 294912 zabbix 600 219056 6
- 0x0112be9b 458753 root 600 1000 7
- 0x0112be9d 491522 root 600 1200712 7
- ------ Semaphore Arrays --------
- key semid owner perms nsems
- 0x7a04c831 1245184 zabbix 600 13
- 0x00000000 1802241 apache 600 1
- 0x00000000 1835010 apache 600 1
ipcrm
使用ipcrm 命令来清除IPC资源:这个命令同时会将与ipc对象相关联的数据也一起移除。当然,只有root用户,或者ipc对象的创建者才有这项权利;
- ipcrm -M shmkey 移除用shmkey创建的共享内存段
- ipcrm -m shmid 移除用shmid标识的共享内存段
- ipcrm -Q msgkey 移除用msqkey创建的消息队列
- ipcrm -q msqid 移除用msqid标识的消息队列
- ipcrm -S semkey 移除用semkey创建的信号
- ipcrm -s semid 移除用semid标识的信号
ipcs与ipcrm配合清理使用的资源的示例如下:
- ipcs -q | awk '{ print "ipcrm -q "$2}' | sh > /dev/null 2>&1;
- ipcs -m | awk '{ print "ipcrm -m "$2}' | sh > /dev/null 2>&1;
- ipcs -s | awk '{ print "ipcrm -s "$2}' | sh > /dev/null 2>&1;
ipcs的其他应用
使用ipcs还可以用以确认某个用户是否存在消息队列的堆积:
1、查询消息队列
- $ipcs -q
- ------ Message Queues --------
- key msqid owner perms used-bytes messages
- 0x49060005 58261504 user1 660 0 0
- 0x4f060005 58294273 user1 660 0 0
2、找出messages大于0的队列
- $ ipcs -q |grep user1 |awk '{if($5>0) print $0}'
- 0x00000000 1071579324 user1 644 1954530 4826
- 0x00000000 1071644862 user1 644 1961820 4844
- 0x00000000 1071677631 user1 644 1944810 4802
- 0x00000000 1071710400 user1 644 1961820 4844
五、为什么需要手动释放共享内存
Linux中通过API函数shmget创建的共享内存一般都是在程序中使用shmctl来释放的,但是有时为了调试程序,开发人员可能通过Ctrl + C等方式发送中断信号来结束程序,此时程序申请的共享内存就不能得到释放,当然如果程序没有改动的话,重新运行程序时仍然会使用上次申请的共享内存,但是如果我们修改了程序,由于共享内存的大小不一致等原因会导致程序申请共享内存错误。因此,我们总是希望每次结束时就能释放掉申请的共享内存。
有两种方法可以用来释放共享内存:
第一种:如果总是通过Crtl+C来结束的话,可以做一个信号处理器,当接收到这个信号的时候,先释放共享内存,然后退出程序。
第二种:不管你以什么方式结束程序,如果共享内存还是得不到释放,那么可以通过linux命令ipcrm shm shmid来释放,在使用该命令之前可以通过ipcs -m命令来查看共享内存。
linux 下共享内存的更多相关文章
- linux下共享内存mmap和DMA(直接访问内存)的使用 【转】
转自:http://blog.chinaunix.net/uid-7374279-id-4413316.html 介绍Linux内存管理和内存映射的奥秘.同时讲述设备驱动程序是如何使用“直接内存访问” ...
- 学习笔记:Linux下共享内存的方式实现进程间的相互通信
一.常用函数 函数系列头文件 #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> ft ...
- windows 下共享内存使用方法示例
windows下共享内存使用方法较 linux 而言微微复杂 示例实现的功能 有一个视频文件,一块内存区域 : 程序 A,将该视频写入该内存区域 : 程序 B,从该内存区域读取该视频 : 代码模块实现 ...
- Linux进程间通信—共享内存
五.共享内存(shared memory) 共享内存映射为一段可以被其他进程访问的内存.该共享内存由一个进程所创建,然后其他进程可以挂载到该共享内存中.共享内存是最快的IPC机制,但由于linux本身 ...
- Linux IPC 共享内存
共享内存 共享内存(shared memory)是最简单的Linux进程间通信方式之一. 使用共享内存,不同进程可以对同一块内存进行读写. 由于所有进程对共享内存的访问就和访问自己的内存空间一样,而不 ...
- 转:linux下共享库的注意点之-fpic
转: http://www.cnblogs.com/leo0000/p/5691483.html linux下共享库的注意点之-fpic 在编译共享库必须加上-fpic.这是为什么呢? 首先看一个简单 ...
- Linux下清理内存和Cache方法 /proc/sys/vm/drop_caches
Linux下清理内存和Cache方法 /proc/sys/vm/drop_caches 频繁的文件访问会导致系统的Cache使用量大增 $ free -m total used free shared ...
- Linux下清理内存和Cache方法见下文:
暂时目前的环境处理方法比较简单: 在root用户下添加计划任务: */10 * * * * sync;echo 3 > /proc/sys/vm/drop_caches; 每十分钟执行一次,先将 ...
- Linux下清理内存和Cache方法
暂时目前的环境处理方法比较简单: 在root用户下添加计划任务: */10 * * * * sync;echo 3 > /proc/sys/vm/drop_caches; 每十分钟执行一次,先将 ...
随机推荐
- JS - Array.prototype.sort(compare)
function compare(a, b) { return -1; // a 在 b 前面 return 1; // a 在 b 后面 return 0; // 并列排序,保持在源数组中的先后顺序 ...
- linux关于进程、内存和cpu情况
1.load average: 2.03, 1.76, 1.80 1分钟.5分钟.15分钟平均负载 2.%Cpu(s):100.0 us, 0.0 sy, 0.0 ni, 0.0 id, 0.0 wa ...
- 如何用纯 CSS 创作一个文本淡入淡出的 loader 动画
效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/ERwpeG 可交互视频 ...
- i2c drivers
Linux设备驱动程序架构分析之一个I2C驱动实例 转载于:http://blog.csdn.net/liuhaoyutz 内核版本:3.10.1 编写一个I2C设备驱动程序的工作可分为两部分 ...
- Spring boot 中Spring data JPA的应用(一)
最近一直在研究Spring Boot,今天为大家介绍下Spring Data JPA在Spring Boot中的应用,如有错误,欢迎大家指正. 先解释下什么是JPA JPA就是一个基于O/R映射的标准 ...
- 同一条sql在mysql5.6和5.7版本遇到的问题。
之前用的是mysql 5.6版本,执行select * from table group by colunm 是可以出结果的, 但是切换的5.7版本,这条sql就报错, Expression #1 o ...
- STM8时基单元
STM8时基单元 时基单元包含: 16位向上/向下计数器 16位自动重载寄存器 重复计数器 预分频器 (图29:STM8 时基单元) 16位计数器,预分频器,自动重载寄存器和重复计数器寄存器都可以通过 ...
- python基础学习笔记——类的约束
⾸先, 你要清楚. 约束是对类的约束. 用一个例子说话: 公司让小明给他们的网站完善一个支付功能,小明写了两个类,如下: class QQpay: def pay(self,money): print ...
- 2019年北航OO第四次博客总结<完结撒花>
一.UML单元架构设计 1. 类图解析器架构设计 1.1 UML类图 这次作业的目标是要解析一个UML类图,首先为了解耦,我新建了一个类UmTree进行解析工作,而Interaction类仅仅作为实现 ...
- 【Netty】Netty入门之WebSocket小例子
服务端: 引入Netty依赖 <!-- netty --> <dependency> <groupId>io.netty</groupId> <a ...