进程间通信(interprocess communication,简称 IPC)是指在操作系统中,不同进程之间的数据交换和消息传递的方式。IPC提供了多种机制来实现此功能,进程间通信包含信号、管道、消息队列、信号量、共享内存、和套接字等方式,每种机制适用于不同的场景。
⚫信号:可以异步通信,并且具有轻量级的特点,但是不能传递复杂的数据,只能携带少量信息。
⚫管道:普通管道只能在父子进程之间单向通信,命名管道才能用作无亲缘关系进程的通信,数据以字节流形式顺序的传递,读写还需要做好同步管理,不然可能会阻塞。
⚫消息队列:可以传递任意类型的消息,而且可以通过队列有序存储,可以按消息的优先级进行管理,而且支持任意进程之间的双向通信,但是内核维护队列的开销比较大;
⚫信号量:高效的进程同步机制,适合资源的共享和互斥控制,信号量的增减是原子操作,避免了竞争,常用于解决并发问题和进程的互斥,不过只能传递同步信号,不能传递数据。
⚫共享内存:共享内存允许多个进程直接访问同一块内存空间,因此是最快的通信方式,效率极高,特别适合大规模数据传输;但是共享内存本身不提供同步机制,需要配合信号量或其他方式防止竞争条件,需要手动管理同步和内存的读写,使用复杂。
⚫套接字:支持不同主机之间通过网络进行通信,支持面向连接的 TCP 和无连接的 UDP 两种通信模式,可以传递数据流、文件、甚至远程通信;相对于其他 IPC 方式,通信的复杂性较高,效率略低。
进程间的通信有两种不同的机制System V 和 POSIX;较早的 System V IPC 存在着一些不足之处,而 POSIX IPC 则是在 System V IPC 的基础上发展而来,旨在解决 System V IPC 中的一些不足之处。
⚫System V IPC:提供了一套较为复杂的 API。函数名称不够直观,使用起来相对繁琐。IPC 资源的标识符由系统自动分配,管理较为复杂。
⚫POSIX IPC:提供了更简洁和直观的 API,函数名称更易于理解。支持命名功能,IPC 资源可以通过名称来访问。更符合现代编程习惯,易于使用和维护。
180