您现在的位置是:首页 > 正文

进程通信之共享内存

2024-02-01 03:49:01阅读 2

目录

一、共享内存的原理

二、共享内存的接口

1、创建或者获取共享内存的接口

 2、将共享内存附加到进程的虚拟地址空间

3、分离

4、操作共享内存接口

三、代码验证共享内存

 四、共享内存的特性


共享内存的地位:

共享内存是Linux中最快的进程间通信方式,所以很多追求效率的程序之间进行通信的时候,都会选择共享内存

例如:          守护进程,   和被守护的进程    就要使用共享内存

一、共享内存的原理

  • 1.1 在物理内存当中开辟一段空间
  • 1.2不同的进程通过页表将物理内存空间映射到自己的进程虚拟地址空间当中
  • 1.3不用的进程通过操作自己进程虚拟地址空间当中的虚拟地址,来操作共享内存(读或者写)

示意图如下:

二、共享内存的接口

1、创建或者获取共享内存的接口

int shmget(key_ t key, size_ t size, int shmflg)               sh——>>   share  memory

参数:

  • key;共享内存标识符(相当于人的身份证)
  • size:共享内存大小
  • shmflg:获取/ 创建共享内存时,传递的属性信息
    • IPC_ CREAT :
      • 如果获取的共享内存不存在,则创建
    • IPC_ EXCL | IPC_ CREAT:
    • 如果获取的共享内存存在,则函数报错
    • 如果获取的共享内存不存在,则创建。
    • 本质上:该组合是要要获取是重新创建的共享内存
    • 按位或上权限,权限也是8进制数字(这里的权限是指,这块物理内存的共享区域的权限我们对这块区域内的执行权限)

  • 返回值:
    • 成功:返回共享内存操作句柄(要操作共享内存就需要这个操作句柄)
    • 失败: -1

 2、将共享内存附加到进程的虚拟地址空间

void *shmat(int shmid, const void *shmaddr, int shmflg)            at ——>>   attach

参数:

  • shmid:
    • 共享内存操作句柄
  • shmaddr:
    • 将共享内存附加到进程虚拟地址空间的共享区当中的哪一个地址上。
    • 一般让操作系统自己分配,传递NULL

 shmflg:以什么权限将共享内存附加到进程当中

  • SHM_ RDONLY: 只读
  • 0 :可读可写
  • 返回值:
    • 成功:返回附加的虚拟地址
    • 失败:-1

3、分离

  • int shmdt(const void *shmaddr);
  • 参数:
    • shmaddr: shmat的返回  
  • 返回值:
    • 成功:0
    • 失败:-1

4、操作共享内存接口

  • int shmctl(int shmid,,int cmd, struct shmid_ds ,*buf);
  • 参数:
  • shmid:共享内存的操作句柄
  • cmd:告诉shmct L函数需要完成什么功能
    • IPC_ SET::设置共享内存属性信息      ,这个时候buf就是输入型参数,内容由程序员组织,传递给shmctl函数,并由他修改                                                                       共享内存的属性
    • IPC_ STAT:获取共享内存属性信息         这时候buf就是出参,由shmctl函数进行填充
    • IPC_ RMID :删除共享内存,第三个参 数传递NULL            即buf设置为NULL

三、代码验证共享内存

一个代码往共享内存中写,一个代码从共享内存中读

 四、共享内存的特性

  • 4.1生命周期跟随操作系统
  • 4.2共享内存写的时侯是覆盖写的方式,在向共享内存中写入时,会先将共享内存中的内容清空,然后进行写入,
  •                                      读的时候, 是访问地址,并没有将数据从共享内存中拿走。(异于管道)

4.3共享内存的删除特性

  • 4.3.1 ipcs命令 & ipcrm 命令

我们可以通过ipcs命令来查看共享内存的信息

ipcrm命令:

 可以通过 ipcrm -m  [操作句柄]来删除一个共享内存

  • 一旦共享内存被删除掉之后,共享内存的在物理内存当中的空间被销毁了
  • 如果删除的共享内存的时候,共享内存附加的进程数量为0,则内核当中描述该共享内存的结构体也被释放了

       如果删除的共享内存的时候,共享内存附加的进程数量不为0,则会将该共享内存的key,变成0x00000000。表示当前共享内存不能被其他进程所附加,共享内存的状态会被设置为destory。附加的进行一旦全部退出之后,该共享内存在内核的结构体会被操作系统释放掉

网站文章

  • 多核与多处理器的区别

    多核与多处理器的区别

    多核:单块CPU上面能处理数据的芯片组的数量,比如,双核就是包括2个相对独立的CPU核心单元组,四核就包含4个相对独立的CPU核心单元组。多处理器:主板上实际插入的cpu数量,一般有两个或者多个处理器...

    2024-02-01 03:48:54
  • 计算机课辅导学困生的方法,后进生辅导计划

    计算机课辅导学困生的方法,后进生辅导计划

    后进生辅导计划后进生辅导计划(一):后进生转化工作是班级工作的重要环节,是班主任作好班级工作的关键。后进生是教师的重点辅导对象,辅导要做到及时、全面、持之以恒,后进生的构成过程决定转化工作务必持之以恒...

    2024-02-01 03:48:47
  • Java Concurrency Program

    Java Concurrency Program

    本篇博客对《Java并发编程实战》一书进行总结,较为系统地对JCP的主要内容进行介绍,主要包括:并发和多线程引入的问题与解决、线程池的使用和线程的协调,以便加深理解和记忆

    2024-02-01 03:48:40
  • ubuntu18.04安装nvidia显卡驱动

    ubuntu18.04安装nvidia显卡驱动

    之前查了很多安装资料,一共有三种安装方式。最初是关闭了ubuntu系统自带的驱动,禁用nouveau。也更换了中科大的镜像源,但在终端安装过程中还是显示有一些包下载超时。最后选择去官网手动下载安装驱动。

    2024-02-01 03:48:14
  • 中介者模式(Mediator)

    中介者模式(Mediator)

    中介者模式(Mediator)1.意图用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。 在下列情况下使用中介者模式 : • 一组对象以定义良好但是复杂的方式进行通信。产生的相互依赖关系结构混乱且难以理解。 • 一个对象引用其他很多对象并且直接与这些对象通信 ,导致难以复用该对象。 • 想定制一个分布在多个类中的行为

    2024-02-01 03:48:08
  • newifi_dts

    /*包含头文件*/#include "mt7621.dtsi"//板子级别#include <dt-bindings/gpio/gpio.h>#include <dt-bindings/input/i...

    2024-02-01 03:48:00
  • 进程、线程及协程的区别

    进程、线程及协程的区别

    一、概念 **进程:**进程是一个具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统资源分配和独立运行的最小单位; **线程:**线程是进程的一个执行单元,是任务调度和系统执行的基本单位;...

    2024-02-01 03:47:33
  • opengles学习笔记

    GLSL语言里面的 attribute和uniform类型的变量,在程序中通过GLES20.glGetAttribLocation和GLES20.glGetUniformLocation获取, 这里获...

    2024-02-01 03:47:25
  • Android 当前时间差,返回几分钟前、几小时前、几个月前

    总DateUtil时间工具类地址: 需求: 以前的一个时间和当前时间多对比,返回几分钟前、几小时前、几个月前、几年前 代码: /** * 时间差 * * @param date * @return */ public static String getTimeFormatText(Date date) { long...

    2024-02-01 03:47:18
  • logback.xml配置文件logger与root标签详解

    logback.xml配置文件logger与root标签详解

    2024-02-01 03:46:49