进程间通讯

一、进程通信概念

    进程是操作系统的概念,每当我们执行一个程序,对于操作系统来说就创建了一个进程,在这个过程中包括资源的分配和释放。进程用户空间是独立的,一般不能相互访问。但很多情况下,进程之间需要相互通信来完成某些功能,进程通过与内核和其它进程之间的通信来协调它们之间的行为。

二、进程通信应用场景
  • 数据传输:一个进程需要将自己的数据发送给别的进程。
  • 共享数据:多个进程操作共享数据,当一个进程修改这份数据时,其它进程可以看到。
  • 通知事件:一个进程要给另一个进程一组信息,通知它发生了某种状态的改变(比如:进程终止时要通知父进程)。
  • 资源共享:多个进程之间共享同样的资源。
  • 进程控制:有些进程希望完全控制其他进程的执行(如Debug),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时直到它的状态的改变。
三、四种常用的进程通信技术——IPC
管道
  • 特点
    • 1、是半双工的(即数据只能在一个方向上流动),具有固定的写端和读端
    • 2、无名管道只能用于具有亲缘关系的进程之间的通信(父子进程、兄弟进程);有名管道可以支持任意两个进程
    • 3、无名管道可以看做一种特殊的文件,对它的读写也可用普通的文件操作函数write、read等,但它不是普通的文件,不属于任何文件系统,只存在于内存中
    • 4、有名管道以一种特殊形式存在于文件系统中,但是文件大小为0,并不占用磁盘空间
    • 5、从管道读数据是一次性操作,数据一旦被读,它就从管道中被抛弃,释放空间以便写更多的数据。

管道详解:管道

消息队列

消息队列是消息的链接表,存放在内核中。一个消息队列由一个标识符(队列ID)来标识。消息队列:发送带有类型的数据,即发送的是一个数据块

  • 特点
    • 1、消息:类型&数据
      队列:先进先出,优先级队列

    • 2、消息队列独立于发送和接收进程。进程终止时,消息队列及其内容并不会被删除。

    • 3、消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按照消息的类型读取,在特定类型上是先进先出的

与命名管道相比消息队列的优势在于:

1、消息队列也可以独立于发送和接收进程而存在,从而消除了在同步命名管道的打开和关闭时可能产生的困难。

2、同时通过发送消息还可以避免命名管道的同步和阻塞问题,不需要由进程自己来提供同步方法。

3、接收程序可以通过消息类型有选择地接收数据,而不是像命名管道中那样,只能默认地接收。

消息队列详解:消息队列

信号量

信号量是一种特殊的变量,用来控制对临界资源的使用。
信号量机制是通过P/V操作实现的
p操作,原子减一,申请资源
v操作,原子加一,释放资源

信号量详解:信号量

共享内存

在物理内存上找一块空间,使得多个进程可以访问这块空间。

  • 实现:
    1、创建内核对象,并且申请物理内存;
    2、各进程中,分别将自己的虚拟地址通过内核对象映射到开辟的物理内存上;
    3、分别访问这块内存,通过各自的指针ptra、ptrb;
    4、断开链接,将虚拟地址与物理内存断开联系;
    5、删除内核对象。
  • 特点:共享内存是最快的一种 IPC
    原因:
    1、对于使用共享内存的单个进程而言,共享内存属于进程的一部分,直接通过指针操作这块空间,少了陷入内核过程。
    2、进程直接通过指针操作共享空间,少了两次数据的拷贝
    buff(栈区空间) —> 共享空间
    共享空间 —> buff(栈区空间)

共享内存详解:共享内存

综上简单比较:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值