1.共享内存的原理

  1. 在物理内存中开辟一块空间;
  2. 不同进程通过页表将该空间映射到字节的进程虚拟地址空间中;
  3. 不同进程通过操作自己进程虚拟地址空间当中的虚拟地址,来操作共享内存;

2.使用共享内存步骤:

  1. 创建共享内存;
  2. 附加,将进程附加该共享内存上(将进程虚拟地址和物理地址通过页表建设映射关系);
  3. 分离,将虚拟地址和物理地址的映射关系从页表中删除

共享内存映射到物理地址空间时 ,是映射在共享区中(在栈区和堆区中间)

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:共享内存相关推荐

  1. linux的共享内存,linux共享内存实际在哪里?

    我只想知道共享内存驻留在Linux系统中的位置?它在物理内存还是虚拟内存中?linux共享内存实际在哪里? 我知道有关进程的虚拟内存发送信箱,他们从不同的工艺处理和流程没有看到对方的记忆,但我们可以利 ...

  2. Linux共享内存(二)

    Linux共享内存编程实例 原文链接:http://blog.csdn.net/pcliuguangtao/article/details/6526119 /*共享内存允许两个或多个进程进程共享同一块 ...

  3. c++ 共享内存_关于Linux共享内存的实验 [二] - 原因

    关于Linux共享内存的实验 [一] 上文采用的"删文件"和"杀进程"的方法主要是为了快速演示实验现象,但这种做法不利于通过调试手段进一步探究其内在的逻辑.为此 ...

  4. 【Linux共享内存】

    Linux共享内存 一.基本概念 二.常用函数 1. shm_open 2. mmap 3. munmap 4. shm_unlink 5. ftruncate 三.使用示例 四.share内存不足解 ...

  5. linux 共享内存操作(shm_open、mmap、编译链接库:-lz -lrt -lm -lc都是什么库)

    文章目录 linux 共享内存操作(shm_open) 一.背景 二.函数使用说明 shm_open ftruncate(改变文件大小) mmap共享内存 三.示例代码 创建内存共享文件并写入数据 打 ...

  6. linux 共享内存 查看和删除

    在使用共享内存的程序异常退出时,由于没有释放掉共享内存,在调试时会出现错误.您可以使用shell命令来查看与释放已经分配的共享内存,下面将详细说明如何进行查看和释放分配的共享内存的方法. 预备知识 L ...

  7. Linux共享内存编程实例

    /*共享内存允许两个或多个进程进程共享同一块内存(这块内存会映射到各个进程自己独立的地址空间)从而使得这些进程可以相互通信.在GNU/Linux中所有的进程都有唯一的虚拟地址空间,而共享内存应用编程接 ...

  8. LINUX共享内存使用常见陷阱与分析(转)

    所谓共享内存就是使得多个进程可以访问同一块内存空间,是最快的可用IPC形式.是针对其他通信机制运行效率较低而设计的.往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥.其他进程能把同一段共 ...

  9. linux 共享内存_盘点那些linux 后台开发类常见问题及知识点

    一.linux和os: netstat :显示网络状态 tcpdump:主要是截获通过本机网络接口的数据,用以分析.能够截获当前所有通过本机网卡的数据包.它拥有灵活的过滤机制,可以确保得到想要的数据. ...

  10. linux 共享内存_什么是物理/虚拟/共享内存——Linux内存管理小结一

    物理内存和虚拟内存到底有什么区别? 提到内存,我们会想到经常接触的三个词:虚拟内存.物理内存.共享内存.它们分别对应top输出中的VIRT.RES.SHR三列. 1. 物理内存 系统的物理内存被划分为 ...

最新文章

  1. flower.php,flowerlist.php
  2. 第五周-第11章节-Python3.5-内置模块详解之Xml模块
  3. vue双向数据绑定原理分析--Mr.Ember
  4. SqlServer在安装时提示:需要Microsoft.NET Framework 3.5 Service Pack 1 规则失败
  5. 【CVPR2020论文解读】300米远程深度估计:港科大重磅开源自动驾驶深度感知新技术,远超现有雷达...
  6. CSS 编码中超级有用的工具集合
  7. 单例模式懒汉式(线程安全写法)
  8. Linux—文件命令之touch命令
  9. 基于上下文的访问控制与基于区域策略的防火墙
  10. 【读书笔记《Android游戏编程之从零开始》】14.游戏开发基础(Bitmap 位图的渲染与操作)
  11. 关于OpenCV for Python入门-face_recognition实现人脸识别
  12. VS2013中关于gets函数使用问题的解决方案(搬运“尼古拉斯罗本”的部分文章,)
  13. webpack4.0 css压缩js压缩 css 样式添加前缀
  14. 【Word】Word更改默认模板样式——使用自定义模板【以Windows10+Word2019为例】
  15. 062_《Delphi7完美经典》
  16. 关于0X000000该内存不能为read或者written的解决方法
  17. Unity案例---愤怒的小鸟
  18. 百度地图开发之——百度地图鹰眼轨迹管理台DEMO-v3部署到服务器上
  19. 威纶通触摸屏技巧总结
  20. 2019最火的程序员必看微小说《竹叶青》转载

热门文章

  1. android 内功修炼参考
  2. java 获取 word 窗体域_办公小技巧:巧用窗体域 控制Word文档修改区
  3. Unity教程之-Unity游戏技能Skill系统架构设计
  4. python获取控件内容_python通过win32api轻松获取控件的属性值
  5. 嵌入式软件工程师和嵌入式硬件工程师有什么区别
  6. APP设计尺寸规范大全,APP界面设计新手教程【官方版】
  7. 如何将数据从一台主机发送到另一台主机上(详解)
  8. boost哪些库需要编译
  9. mysqladmin
  10. accept文件上传类型