【Linux】进程间通信之 共享内存,消息队列,信号量

本文详细介绍了Linux进程间通信的三种方式:共享内存、消息队列和信号量。共享内存是最快的通信方式,避免了用户态与内核态的数据拷贝;消息队列提供了数据块传输,自带同步与互斥功能,但受限于内核空间;信号量主要用于进程同步与互斥,确保临界资源的安全访问。
摘要由CSDN通过智能技术生成

进程间通信的三个方式

进程之间具有独立性,每个进程只能访问自己的虚拟地址,进程之间无法直接沟通

共享内存

特性:最快的进程间通信方式
实现原理:

  1. 在物理内存中开辟一块空间(在内核具有标识,能够被其它进程找到)
  2. 将这块空间通过页表映射到自己的虚拟地址空间(根据虚拟地址来进行访问操作了)
  3. 通过虚拟地址进行内存操作
  4. 解除映射关系
  5. 删除共享内存
    在这里插入图片描述

在物理内存上开辟出一块内存空间、将这块空间映射到虚拟地址空间,虽然两个进程都是自己的虚拟地址空闲,但是操作的物理内存都是同一块,一个进程通过虚拟地址空间修改了这个值,那么另一个进程中这个值也会改变。

为什么说共享内存是最快的进程间通信方式?
在这里插入图片描述
以管道举例,管道实际上是内核中的一块缓冲区,而我们的读写端都是在用户空间中的,进程需要将buf[]数据写入到管道,涉及到一次内核态与用户态的数据拷贝。获取管道中的数据也是同样的。后面要讲的消息队列和信号量也涉及两次拷贝。
而共享内存就不一样,只是一个进程修改了数据,使用共享内存的其它进程也会被修改。不需要内核态与用户态的数据拷贝,所以共享内存是最快的进程间通信方式。

实现原理:

  1. 建立共享内存

     int shmget(key_t key, size_t size, int shmflg)
     key: 就是共享内存的名字,唯一值,内核中标记这块共享内存,
     其他进程通过相同的值来访问同一块共享内存
     size:共享内存的大小,内存管理以内存页的方式进行管理
     shmflg:创建时的标志位 IPC_CREAT(创建)|IPC_EXCL(有了报错)|mode(权限)
     返回值:
     成功:返回共享内存的标识操作句柄
     失败:返回-1
    
  2. 建立映射关系

     void* shmat(int sh
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值