我应该在哪个时刻使用哪种进程间通信(ipc)机制?

Which kind of inter process communication (ipc) mechanism should I use at which moment?

我知道有几种进程间通信(ipc)的方法,比如:

但是我无法找到将这些机制相互比较并指出它们在不同环境中的好处的列表或论文。

例如,我知道如果我使用一个由进程 A 写入并由进程 B 读出的文件,它可以在任何 OS 上工作并且非常健壮,另一方面 - 为什么不应该我使用 TCP 套接字?有没有人概述在哪些情况下哪种方法最合适?

长话短说:

  • 当进程竞争稀缺资源时使用锁文件、互斥量、信号量和屏障。它们以类似的方式运行:多个进程尝试获取 同步原语 ,其中一些获取同步原语,另一些则进入休眠状态,直到原语再次可用。使用信号量来限制使用资源的进程数量。使用互斥量将数量限制为 1.

  • 您可以通过使用非阻塞线程安全数据结构来部分避免使用同步原语。

  • 在进程需要交换数据时使用信号、队列、管道、事件、消息、unix 套接字。信号和事件通常用于通知进程某事(例如,unix 终端中的 ctrl+c 向进程发送 SIGINT 信号)。管道、共享内存和unix sockets是用来传输数据的。

  • 使用套接字进行联网(或者,正式地说,用于在不同机器上的进程之间交换数据)。

长话短说:看看 Modern Operating Systems Tanenbaum & Bos 的书,即 IPC 章节。这个话题很大,无法在列表或论文中完全涵盖。