管道、消息队列、共享内存、信号量的特点

在之前我们已经了解过了进程间通信的几种方式:管道消息队列共享内存以及信号量。今天我们就来总结一下这几种方式的各自的特点分别是什么,和他们相应的应用场景。也是对于这个知识点的一个复习和巩固。

Q1:为什么要有进程间通信???

A1:
1、为了传输数据:一个进程需要将它的数据发送给另外一个进程;
2、为了共享资源:多个进程之间有时需要共享同样的一份资源;
3、为了通知事件:一个进程需要向另一个进程或者进程组发送消息通知他们发生了某些事件(比如:一个进程退出时需要通知他的父进程);
4、为了实现进程控制:有些进程希望控制另一个进程的执行,此时控制进程希望能够拦截另外一个进程的所有陷入和异常,并能够及时知道他的状态改变。

Q2:进程间通信的本质是什么???

A2:
不同的两个进程之间,他们的进程地址空间自然也是相互独立的,而进程间通信就是为了让两个进程之间能够共同的知晓某一份数据、消息等这些资源。一句话就是:进程间通信的本质就是:让不同的进程可以看到同一份资源。

下面来总结一下,几种通信方式的特点:
管道

把从一个进程连接到另一个进程的一个数据流称为一个管道。
管道又分为命名管道和匿名管道
匿名管道:只允许具有亲缘关系的进程间通信
命名管道:允许不想管的进程之间进行通信

特点:
1:只能用于具有共同祖先的进程(具有亲缘关系的进程)之间进行通信;通常情况下,一个管道有一个进程创建,然后该进程调用fork,此后父进程与子进程就可应用该管道。
2:管道提供流式服务(面向字节流)。
3:一般而言,进程退出,管道释放,所以管道的生命周期随进程。
4:内核会对管道操作进行同步与互斥。
5:管道是半双工的,数据只能向一个方向流动,需要双方通信时,要建立起两个管道。

应用场景:
1、用于shell中(如:who | wc -l)
2、用于具有亲缘关系的进程间通信

命名管道和匿名管道的唯一区别就在于二者创建和打开的方式不同。
匿名管道的创建和打开由pipe函数完成
而命名管道有mkfifo函数创建,打开需要用open

#include<unistd.h>
//创建一个无名管道
int pipe(int fd[2]);
//参数:fd为文件描述符组,其中fd[0]表示读端,fd[1]表示写端
//返回值:成功返回0,失败返回错误码


int mkfifo(const char *filename,mode_t mode);
//如:
int main(int argc,char *argv[])
{
    mkfifo("p",0644);
    return 0;
}
//也可以直接在命令行上创建
mkfifo filename

消息队列
消息队列提供了一种在两个不相关的进程之间传递数据的简单高效的方法。

特点:
1、它提供有格式的字节流,减少了开发人员的工作量;消息具有类型(system V)或优先级(posix)。其他方式都没有这些优点。
2、具备同步机制。
3、生命周期随内核。
4、消息队列允许一个或多个进程向它写入或者读取消息。
5、与无名管道、命名管道一样,从消息队列中读出消息,消息队列中对应的数据都会被删除。
6、每个消息队列都有消息队列标识符,消息队列的标识符在整个系统中是唯一的。
消息队列是消息的链表,存放在内存中,由内核维护。只有内核重启或人工删除消息队列时,该消息队列才会被删除。若不人工删除消息队列,消息队列会一直存在于系统中。

共享内存
使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。

特点:
1、共享内存没有提供任何的保护机制
2、是临界资源
3、没有同步互斥机制
4、生命周期随内核(同消息队列)

信号量
主要作为进程间以及同一进程不同线程之间的同步手段。

特点:
1、本质是一个计数器,内存中有多少个临界资源,信号量的数字就是多少。
2、信号量基于操作系统的 PV 操作,程序对信号量的操作都是原子操作
3、信号量用于进程间同步,若要在进程间传递数据需要结合共享内存。

优缺点总结:

1.管道:速度慢,容量有限,只能用于具有亲缘关系的进程间通信。
2.FIFO:任何进程间都能通信,但速度慢。
3.消息队列:容量受到系统限制。
4.信号量:不能传递复杂消息,只能用来同步。
5.共享内存区:能够很容易控制容量,速度快,但要保持同步。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值