进程间通信方式的优缺点

1.管道 

        管道分为无名管道和有名管道。

无名管道

        无名管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用,进程的亲缘关系一般指的是父子关系。无名管道一般用于两个不同进程之间的通信。

        当一个进程创建了一个管道,并调用fork创建自己的一个子进程后,父进程关闭读管道端,子进程关闭写管道端,,这样提供了两个进程之间数据流动的一种方式。 

有名管道

        有名管道也是一种半双工的通信方式,但是它允许无亲缘关系进程间的通信。 

它提供一个路径名与之关联,以FIFO的文件形式存在于文件系统中。这样,即使与FIFO的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够彼此通过FIFO相互通信(能够访问该路径的进程以及FIFO的创建进程之间),因此,通过FIFO不相关的进程也能交换数据。

无名管道

优点:简单方便;

缺点:

        局限于单向通信

        只能创建在它的进程以及其有亲缘关系的进程之间;

        缓冲区有限 

有名管道

优点:可以实现任意关系的进程间的通信;

缺点:

        长期存于系统中,使用不当容易出错;

        缓冲区有限

2.信号量 

        信号量是一个计数器,可以用来控制多个线程对共享资源的访问。它不是用于交换大批数据, 而用于多线程之间的同步,它常作为一种锁机制,防止某进程在访问资源时其它进程也访问该资源,因此 , 主要作为进程间以及同一个进程内不同线程之间的同步手段。

优点:可以同步进程。

缺点:信号量有限。

3.消息队列 

        消息队列是消息的链表,存放在内核中并由消息队列标识符标识,消息队列克服了信号传递信息少,管道只能承载无格式字节流以及缓冲区大小受限等特点。

        消息队列是UNIX下不同进程之间可实现共享资源的一种机制,UNIX允许不同进程将格式化的数据流以消息队列形式发送给任意进程,对消息队列具有操作权限的进程都可以使用msget完成对消息队列的控制,通过使用消息类型,进程可以按任何顺序读信息,或为消息安排优先级顺序。

优点:可以实现任意进程间的通信,并通过系统调用函数来实现消息发送和接收之间的同步,无需考虑同步问题,方便。

缺点:信息的复制需要额外消耗CPU的时间,不适宜于信息量大或操作频繁的场合。

4.共享内存 

        共享内存是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问,共享内存是最快的IPC(进程间通信)方式, 它是针对其它进程间通信方式运行效率低而专门设计的,它往往与其他通信机制,如信号量,配合使用,进而实现进程间的同步与通信。

共享内存的特点

共享内存是以传输数据为目的 。

共享内存无同步无互斥 。

共享内存是所有进程间通信速度最快的。 

共享内存的生命周期随内核

优点:使用共享内存进行进程间的通信非常方便,而且函数的接口也简单,数据的共享使进程间的数据不用传送,而是直接访问内存,加快了程序的效率。同时,它也不像无名管道那样要求通信的进程有一定的父子关系。 

缺点:

通信是通过将共无法实现享空间缓冲区直接附加到进程的虚拟地址空间中实现。

利用内存缓冲区直接交换信息,内存的实体存在于计算机中,只能让同一个计算机系统中的诸多进程共享,不方便多个计算机网络通信。

共享内存没有提供同步的机制,这使得我们在使用共享内存进行进程间通信时,往往要借助其他的手段来进行进程间的同步工作。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值