进程间通信方式

概念

         所谓进程间通信,指的是不同进程之间传播和交换信息,主体是进程,且是大于等于2个进程;工作是通信,即进行数据的交换。

进程间通信的目的

         数据传输:一个进程将它的数据发送给另一个进程。

         资源共享:多个进程之间共享相同的资源,此时需要内核提供互斥和同步机制。

         进程控制:有些进程希望完全控制另一个进程的执行,此时控制进程希望能够拦截另一个进程的所有缺陷和异常,并能够及时知道它的状态的改变。

         一个进程需要向另一个或一组进程发送消息,通知它们发生了某种事件。

进程间通信的方式

1.管道

         管道是一种把两个进程之间的标准输入和标准输出连接起来的机制,可分为无名管道和命名管道。用于具有亲缘关系进程间的通信,有名管道克服了没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。

         管道的特点:

         1.只能在有亲缘关系的进程之间进行通信,也就是在父子进程之间通信。

         2.单向通信,一个读端,一个写端。如果要双向通信就要建立两个管道。

         3.接收数据流,与数据格式无关。

         4.一般而言,进程退出时管道即被释放,因此管道的生命周期会随进程的关闭而消亡。

         5.同步互斥原则,内核会对管道操作进行同步和互斥。

2.信号

         信号机制是UNIX系统中最为古老的进程之间通信机制。它用于在一个进程或多个进程之间传递异步信号,来通知进程有某种事件发生,除了用于进程间通信外,使用信号还可以使进程发送信号给进程本身。

3.消息队列

         消息队列是内核地址空间中的消息的链表,通过Linux内核在哥哥进程之间传递内容。消息顺序地发送到消息队列中,并以几种不同的方式从队列中获取,每个消息队列可以用IPC标识符唯一的进行标识。不同的消息队列之间是相对独立的,每个消息队列中的消息又构成一个独立的链表。有足够权限的进程可以向队列中添加消息,对消息队列有写权限的进程可以向消息队列中按照一定的规则添加新消息,对消息队列有读权限的进程则可以从消息队列中读走消息。

         消息队列的特点:

         消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限的缺点。消息队列是基于消息的,而管道是基于字节流的,且消息队列的读取不一定先入先出。

         消息队列中每个消息的最大长度是有上限的,每个消息队列的总的字节数也是有上限的,系统上消息队列的总数也有一个上限。

         消息队列与命名管道的比较:

         相同点:消息队列和命名管道一样,进行通信的进程可以是不相关的进程,同时它们都是通过发送和接收的方式来传递数据的,而且它们对每个数据都有一个最大长度的限制。

         不同点:在命名管道中,发送数据用write(),接收数据用read(),而在消息队列中,发送数据用msgsnd(),接收数据用msgrcv()。

         消息队列相比命名管道的优点:

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

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

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

4.共享内存

         共享内存是在多个进程之间共享一块内存区域的一种进程间的通信方式,它是通过在多个进程之间对内存段进行映射的方式来实现内存共享的,是进程间通信最快捷的方式。之所以最快,是因为共享内存方式的通信没有中间过程,而管道、消息队列等方式则是需要将数据通过中间机制进行转换。共享内存通信时是直接将某段内存进行映射,多个进程间的共享内存是同一块的物理空间,仅仅是地址不同而已,因此不需要进行复制,可以直接使用此段空间。共享内存往往与其他通信机制(如信号量)结合使用,来达到进程间的同步及互斥。

         共享内存的特点:

         1.共享内存就是允许两个不相关的进程访问同一个内存。

         2.共享内存是两个正在运行的进程之间共享和传递数据的最有效的方式。

         3.共享内存不提供任何互斥和同步机制,一般用信号量对临界资源进行保护。

         4.不同进程之间共享的内存通常安排为同一段物理内存。

         5.接口简单。

5.信号量

         信号量是一种计数器,用来控制对多个进程共享的资源所进行的访问,它们常常被用作一个锁机制,在某个进程正在对特定资源进行操作时,信号量可以防止另一个进程去访问它。简单说来就是信号量是一个特殊的变量,程序对其访问都是原子操作,且只允许对它进行等待(即P(申请))和发送(即V(释放))信息操作。最简单的信号量是只能取0和1的变量,这也是信号量最常见的一种形式,叫做二进制信号量。消费者和生产者的模型就是信号量的典型使用。

         信号量与其他进程间通信方式不大相同,它主要提供对进程间共享资源的访问控制机制,通过PV操作来对当前临界资源进行有序地控制访问。

6.socket

         最为一般的进程间通信机制。可用于不同机器之间的不同进程之间的通信。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值