IPC 进程间通信

来源:互联网 发布:oppo手机网络智能优化 编辑:程序博客网 时间:2024/06/05 04:16

最近在看IPC进程间通信,所以分享一下相关的知识。

进程间通信IPC,是Inter-Process Communication的缩写。

Linux的进程间通信方法有:管道(Pipe)、信号(Signal)、消息队列、信号量(Semaphore)、共享内存(Shared memory)、套接字(Socket)等。

Linux进程间通信的目的有以下几点:

1、数据传输:一个进程需要将它的数据发送到另一个进程,发送的数据量在一个字节到几兆字节之间。

2、共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到。

3、通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。

  4、资源共享:多个进程之间共享同样的资源。为了做到这一点,需要内核提供锁和同步机制。

5、进程控制:有些进程希望完全控制另一个进程的执行(例如Debug进程),此时控制进程希望能够拦截另一个进程的所有信息和异常,并能够以及知道它的状态。


下面来讲一下每种通信方式的简单概念:

1、管道。管道(Pipe)以及有名管道(Named Pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制。因此,除了具有管道所具有的功能之外,它还允许无亲缘关系进程间的通信。

管道是单向的、先进先出的。管道把一个进程的输入和一个进程的输出连接在了一起。

一个进程(写进程)在管道的尾部写入数据,另一个进程(读进程)在管道的头部读出数据。

数据被一个进程读出后,将被从管道中删除。其他进程就不能再读到这些数据。

如果一个管道是满的,那么写进程将会阻塞。反之,如果一个管道是空的,那么读进程将会阻塞。

管道分为有名管道和无名管道两种。有名管道用于父子进程之间的通信,无名管道由于任意俩进程之间的通信。


2、信号。信号(Signal)是比较复杂的通信方式。用于通知接收进程有某种事件发生。除了用于进程间通信外,进程还可以发送信号给进程本身。

信号是在软件层次上对中断机制的一种模拟,是一种异步通信方式。

信号可以直接进行用户空间进程和内核进程之间的交互,内核进程也可以利用它来通知用户空间进程发生了哪些系统事件,它可以在任何时候发给某一进程,而无需知道该进程的状态。

如果该进程当前并未处于执行状态,则该信号就由内核保存起来,直到该进程恢复执行状态再传递给它。如果一个信号被进程设置为阻塞,则该信号的传递被延迟,直到其阻塞被取消时才传递给进程。


3、消息队列。消息队列是消息的连接表,有足够权限的进程可以向队列中添加信息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少、管道只能承载无格式字节流,以及缓冲区大小受限等缺点。


4、信号量。信号量主要作为进程间,以及同一进程不同线程之间的同步手段。信号量是用来解决进程间的同步和互斥问题的一种进程之间通信机制,包括一个称为信号量的变量和在该信号量下等待资源的进程等待队列,以及对信号量进行的两个原子操作。其中信号量对应于某一种资源,取一个非负的整型值。信号量的值是指当前可用的资源数量,若它等于0则意味着目前没有可用的资源。


5、共享内存。共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式。两个不同进程A、B共享内存的意思是,同一块物理内存被映射到进程A、B各自的进程地址空间。进程A可以即时看到进程B对共享内存中数据的更新,反之亦然。由于多个进程共享同一块内存区域,必然需要某种同步机制。互斥锁和信号量都可以。采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存。而不需要任何数据的复制。


6、套接字。套接字(Socket)是更为一般的进程间通信机制,可用于不同机器之间的进程间通信。

原创粉丝点击