由于进程间内存隔离的特性导致它们无法访问彼此的数据,所以我们需要通过进程间通信来实现多个进程间通信、互相协作等功能。
1.pipe(管道)
匿名管道:只能用于有血缘的进程,并且只能实现单向传输。
命名管道:以文件形式存于文件系统中,可以用于无血缘关系的进程,也只能实现单向传输。
优点:实现简单,原生支持。
缺点:效率一般,并且只能实现单向传输。
2.消息队列
消息队列是由内核维护的一个消息链表,支持全双工通信,可以独立于进程存在。
优点:支持双向,异步,灵活。
缺点:数据拷贝开销较大,不适合大文件。
3.共享内存
最快的通信方式,直接将同一块物理内存映射到多个进程的虚拟地址空间,进程可以直接读内存,不再需要拷贝。
优点:速度极快,无复制开销。
缺点:不提供同步机制,必须配合信号量,互斥锁使用,否则会有并发问题。
4.信号量
本质是一个计数器,用来实现进程/线程间同步与互斥,不是用来传递数据的。
二元信号量:只有0和1,类似互斥锁。
计数信号量:PV操作,P:计数减一,不够则阻塞,V:计数加一:唤醒等待线程。
5.信号
异步通知机制,内核或进程向目标线程发送时间通知。
优点:简单,原生支持,异步。
缺点:只能传递信号类型,不能传递大量数据。
6.套接字
既可本机通信,也可跨主机网络通信,全双工,最通用最广泛的通信方式。
优点:跨平台,稳定,通用。
缺点:相比共享内存慢。