Linux:共享内存
1.共享内存的原理
- 在物理内存中开辟一块空间;
- 不同进程通过页表将该空间映射到字节的进程虚拟地址空间中;
- 不同进程通过操作自己进程虚拟地址空间当中的虚拟地址,来操作共享内存;
2.使用共享内存步骤:
- 创建共享内存;
- 附加,将进程附加该共享内存上(将进程虚拟地址和物理地址通过页表建设映射关系);
- 分离,将虚拟地址和物理地址的映射关系从页表中删除
共享内存映射到物理地址空间时 ,是映射在共享区中(在栈区和堆区中间)
3.共享内存接口:
1.创建或者获取共享内存shmget
- key_t称为IPC(叫进程间通信)通信标识符,通过ftok函数获取
- ftok函数的作用就是通过两个给出的参数算出一个IPC(进程间通信英文缩写)标识符,
该标识符在整个操作系统中是唯一的(key_t是一个16进制数)- 也可以不用该函数计算,我们自己可以直接指定
- 算出的IPC标识符在整个操作系统中是唯一的
- 搭配使用是要获得自己创建的共享内存,不使用别人的
- 共享内存创建时也需要设置权限信息,需要按位或上共享内存的权限(八进制数字)表示
2.附加接口:将共享内存附加到当前内存上
3.分离:将共享内存从进程中分离出来,分离时需告诉shmdt函数刚附加共享内存到进程后,进程虚拟地址的位置
4.删除共享内存:
4.函数使用:
左边先写,右边再读
删除函数使用:
5.共享内存的相关命令
ipcs:输出消息队列,共享内存,信号量信息
ipcs -m:只输出共享内存信息
key | 共享内存标识符 |
---|---|
shimd | 共享内存操作句柄 |
owner | 内存创建者 |
perms | 内存权限 |
bytes | 内存大小 |
nattch | 附加进程数量 |
statu | 没有显式表示该共享内存正常 |
ipcrm -m +shmid 删除共享内存:
只要使用该命令,就将共享内存从物理内存中删除
- 内核中有一个结构体维护着在物理空间的共享内存
- 删除0附加进程的共享内存,则内核当中的结构体和物理空间也被删除
- 删除有附加进程的共享内存,则将该共享内存的key(标识符)变成0x 0000 0000;
表示当前共享内存不能被其它进程附加,共享内存的状态被置就被置为dest;
该现象是因为内核中描述共享内存的结构体没有被删除(如下图所示);
删除后产生了两种结果的原因:
- 共享内存的物理空间没有被其它内存使用,则能正常运行;
- 如果该空间被别的进程使用就会崩溃;
描述共享内存的结构体内部的引用计数一旦为0(mywrite进程停止),则共享内存结构体被释放
共享内存的特性:
共享内存是写的时候是覆盖写,读的时候是拷贝(也就是数据访问)
- 将字符串写入共享内存后,写操作进程结束,在多次读取依旧能多次读取成功;
- 所以共享内存的生命周期跟随操作系统内核,不主动删除则一直存在;
Linux:共享内存相关推荐
- linux的共享内存,linux共享内存实际在哪里?
我只想知道共享内存驻留在Linux系统中的位置?它在物理内存还是虚拟内存中?linux共享内存实际在哪里? 我知道有关进程的虚拟内存发送信箱,他们从不同的工艺处理和流程没有看到对方的记忆,但我们可以利 ...
- Linux共享内存(二)
Linux共享内存编程实例 原文链接:http://blog.csdn.net/pcliuguangtao/article/details/6526119 /*共享内存允许两个或多个进程进程共享同一块 ...
- c++ 共享内存_关于Linux共享内存的实验 [二] - 原因
关于Linux共享内存的实验 [一] 上文采用的"删文件"和"杀进程"的方法主要是为了快速演示实验现象,但这种做法不利于通过调试手段进一步探究其内在的逻辑.为此 ...
- 【Linux共享内存】
Linux共享内存 一.基本概念 二.常用函数 1. shm_open 2. mmap 3. munmap 4. shm_unlink 5. ftruncate 三.使用示例 四.share内存不足解 ...
- linux 共享内存操作(shm_open、mmap、编译链接库:-lz -lrt -lm -lc都是什么库)
文章目录 linux 共享内存操作(shm_open) 一.背景 二.函数使用说明 shm_open ftruncate(改变文件大小) mmap共享内存 三.示例代码 创建内存共享文件并写入数据 打 ...
- linux 共享内存 查看和删除
在使用共享内存的程序异常退出时,由于没有释放掉共享内存,在调试时会出现错误.您可以使用shell命令来查看与释放已经分配的共享内存,下面将详细说明如何进行查看和释放分配的共享内存的方法. 预备知识 L ...
- Linux共享内存编程实例
/*共享内存允许两个或多个进程进程共享同一块内存(这块内存会映射到各个进程自己独立的地址空间)从而使得这些进程可以相互通信.在GNU/Linux中所有的进程都有唯一的虚拟地址空间,而共享内存应用编程接 ...
- LINUX共享内存使用常见陷阱与分析(转)
所谓共享内存就是使得多个进程可以访问同一块内存空间,是最快的可用IPC形式.是针对其他通信机制运行效率较低而设计的.往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥.其他进程能把同一段共 ...
- linux 共享内存_盘点那些linux 后台开发类常见问题及知识点
一.linux和os: netstat :显示网络状态 tcpdump:主要是截获通过本机网络接口的数据,用以分析.能够截获当前所有通过本机网卡的数据包.它拥有灵活的过滤机制,可以确保得到想要的数据. ...
- linux 共享内存_什么是物理/虚拟/共享内存——Linux内存管理小结一
物理内存和虚拟内存到底有什么区别? 提到内存,我们会想到经常接触的三个词:虚拟内存.物理内存.共享内存.它们分别对应top输出中的VIRT.RES.SHR三列. 1. 物理内存 系统的物理内存被划分为 ...
最新文章
- flower.php,flowerlist.php
- 第五周-第11章节-Python3.5-内置模块详解之Xml模块
- vue双向数据绑定原理分析--Mr.Ember
- SqlServer在安装时提示:需要Microsoft.NET Framework 3.5 Service Pack 1 规则失败
- 【CVPR2020论文解读】300米远程深度估计:港科大重磅开源自动驾驶深度感知新技术,远超现有雷达...
- CSS 编码中超级有用的工具集合
- 单例模式懒汉式(线程安全写法)
- Linux—文件命令之touch命令
- 基于上下文的访问控制与基于区域策略的防火墙
- 【读书笔记《Android游戏编程之从零开始》】14.游戏开发基础(Bitmap 位图的渲染与操作)
- 关于OpenCV for Python入门-face_recognition实现人脸识别
- VS2013中关于gets函数使用问题的解决方案(搬运“尼古拉斯罗本”的部分文章,)
- webpack4.0 css压缩js压缩 css 样式添加前缀
- 【Word】Word更改默认模板样式——使用自定义模板【以Windows10+Word2019为例】
- 062_《Delphi7完美经典》
- 关于0X000000该内存不能为read或者written的解决方法
- Unity案例---愤怒的小鸟
- 百度地图开发之——百度地图鹰眼轨迹管理台DEMO-v3部署到服务器上
- 威纶通触摸屏技巧总结
- 2019最火的程序员必看微小说《竹叶青》转载