进程间的通信方式

进程通信(Interprocess Communication,IPC)是一个进程与另一个进程间共享消息的一种通信方式。消息(message)是发送进程形成的一个消息块,将消息内容传送给接收进程。

进程间通信的目的

  • 数据传输
    一个进程需要将其数据发送给另一进程,发送的数据量在一个字节到几M字节之间。

  • 共享数据
    多个进程操作共享数据

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

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

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

8种通信方式

  1. 匿名管道

    是一种半双工的通信方式(即数据只能单向流动),且只能在具有亲缘关系的进程间使用(亲缘关系指的父子进程或者兄弟子进程),该管道只存在于内存之中。

  2. 流管道

    是一种全双工的通信方式(即数据能双向流动)

    注:对该方法不熟悉,请自行搜索更多相关内容

  3. 命名管道

    与匿名管道一样是一种半双工的通信方式(即数据只能单向流动),但克服了匿名管道只能在具有亲缘关系的进程间使用的限制,允许无亲缘关系的进程间使用,管道以一种特殊设备文件形式存在于文件系统中。

  4. 信号

    信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。

  5. 消息队列

    是消息的链表,存放在内核中,一个消息队列由一个标识符(即队列ID)来标识。

    消息队列是面向记录的,其中的消息具有特定的格式以及特定的优先级。

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

    消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取。

  6. 共享内存

    两个或多个进程共享一个给定的存储区,是最快的一种 IPC,因为进程是直接对内存进行存取。

    因为多个进程可以同时操作,所以需要进行同步。

    信号量+共享内存通常结合在一起使用,信号量用来同步对共享内存的访问。

  7. 信号量

    信号量是一个计数器,用于实现进程间的互斥与同步,若要在进程间传递数据需要结合共享内存。

    信号量是基于操作系统的PV操作,程序对信号量的操作都是原子操作。

    每次对信号量的 PV 操作不仅限于对信号量值加 1 或减 1,而且可以加减任意正整数。

    支持信号量组。

  8. 套接字,即socket通信,与其他通信机制不同的是,它可用于不同机器间的进程通信。

进程间的通信和线程间的通信的区别

只有进程间需要通信,线程间由于共享进程的地址空间,因此没有通信必要,但要做好同步和互斥,保护共享的变量。