【1】管道
-
亲缘关系(父子、兄弟)
-
单向通信,如果需要双工通信,则需要建立两个管道
-
管道缓冲区大小受限制(由操作系统内核设定)
-
管道传输的是无格式的字节流,需要输入输出双方事先约定好数据的格式
-
是一个只存在在内存中的文件
【2】有名管道(又叫FIFO)
-
有名 + 非亲缘
-
可以一个服务器接收多个客户端的管道。比如客户先把自己的进程号告诉服务器,然后管道用自己的进程号命名。
【3】消息队列
-
相比于FIFO,消息对垒可以独立于发送和接收进程存在,消除了命名管道打开和关闭的时候可能带来的困难(比如一方要发送消息了,但是管道由另一方建立还没有建立?)。
-
双工的,可以同时收发消息
-
可以通过消息类型有选择地接受数据,而不是默认接收
-
但在逐渐被淘汰,可以用流管道或者套接字来取代它。
【4】共享内存
-
优点:操作方便,接口简单,数据不用传送、效率高。
-
缺点:没有实现同步机制,需要借助其他的手段(比如信号量)进行同步
PS:共享内存的同步除了使用POSIX或者SYSTEM V 信号量,还可以使用信号(signal)。
【5】信号量
-
辅助进程间同步(一般进程间是system V信号量,线程间是POXIS信号量)(比如PV操作时)