进程间通信方式有哪些:八种主流方案对比

进程间通信方式有哪些,主流包含管道、命名管道、信号、消息队列、共享内存、信号量、套接字、内存映射这八种,管道适合有亲缘关系进程单向传输短数据,命名管道支持无亲缘进程通信但吞吐量偏低,信号用来传递简单通知信号,消息队列可按类型收发消息且数据有持久特性,共享内存读写速度更快但需要配套同步机制,信号量一般不单独传数据,多用于多进程互斥同步,套接字支持跨主机网络通信,内存映射依托文件实现进程数据共享;这套体系适配Linux、Windows两大平台,其中信号仅在类Unix系统原生支持,Windows环境下开发跨平台程序时优先选用套接字、命名管道,仅单机同主机进程通信可优先考虑共享内存搭配信号量。

进程间通信方式分类与原理

管道也叫匿名管道,内核在内存开辟缓冲区,一端写一端读,只能单向传输,创建管道的父子进程、兄弟进程才能使用,缓冲区满时写操作阻塞,缓冲区空时读操作阻塞,单次传输的数据量不宜过大。命名管道会在文件系统生成管道文件,不依赖进程亲缘关系,任意进程都能打开这个文件完成通信,底层同样是内核缓冲区,磁盘不会存储传输的数据,进程关闭后管道内数据自动清空。

信号是内核向进程发送的简短通知,只有信号编号,不附带额外数据,常见场景是中断、终止进程、提醒状态变更,进程收到信号后可以选择默认处理、忽略信号或者注册自定义处理函数,信号无法承载业务数据,只适合做事件提醒。

消息队列是内核维护的消息链表,每条消息自带类型标识,进程发送消息时绑定类型,接收时可以指定类型筛选消息,消息写入内核后,就算发送进程退出,消息依然保留在队列,直到接收进程取出,消息有固定上限,单条消息体积不能超出系统限制。

共享内存直接把同一块物理内存映射到多个进程的虚拟地址空间,进程读写这块区域相当于直接访问内存,拷贝次数少,传输速率在单机IPC里表现较好,共享内存本身没有同步保护,多个进程同时读写会出现数据错乱,必须搭配信号量、互斥锁使用。

信号量本质是计数器,核心作用是控制访问临界资源的进程数量,实现互斥和同步,它不负责传输业务数据,常和共享内存配套使用,二元信号量等价于互斥锁,计数信号量可以限制同时访问资源的进程总数。

套接字分为本地套接字和网络套接字,本地套接字用于同一主机进程通信,性能优于TCP网络套接字,网络套接字支持跨不同主机、跨网段通信,适配分布式程序,开发流程相对复杂,需要处理连接建立、字节序、断连重连等逻辑。

内存映射mmap,把磁盘文件映射到进程虚拟内存,多个进程映射同一个文件,就能通过读写内存完成数据交换,写入的数据会同步落盘,进程重启后数据可以保留,适合需要持久化存储的大块数据交互,映射的文件大小会限制单次通信的数据上限。

通信方式是否跨主机数据承载能力同步能力
匿名管道否较小自带阻塞同步
命名管道否较小自带阻塞同步
信号否无业务数据仅事件通知
消息队列否中等自带消息边界
共享内存否大无,需额外同步
信号量否不传输数据专门同步互斥
套接字支持大需自行处理
内存映射否大无,需额外同步

单机高吞吐场景优先共享内存。

POSIX标准定义了消息队列、信号量、共享内存这套IPC接口,和早期SystemVIPC两套接口并行存在,POSIX接口设计更简洁,适配多线程,现代Linux开发中POSIXIPC使用占比更高,SystemVIPC存在内核持久残留资源的问题,程序异常退出后需要手动清理内核对象,长期运行的服务程序尽量规避SystemV版本。

你在选型时,优先确认通信进程是否分布在不同服务器,跨主机场景直接选择套接字;同主机、亲缘进程、简单单向消息传递,匿名管道开发成本最低;需要传递结构化消息、希望消息独立持久,消息队列更合适;文件数据需要多进程共享并且要持久保存,内存映射是合适的选择。

敬慕百科汇集百科知识与游戏文化,带你发现世界的每一个精彩角落。

想要了解更多关于进程间通信方式有哪些的文章欢迎访问:百科