从现在开始,我们开始学习进程间通信,这也是一个很重要的话题,话不多说,我们正式开始~~
我们之前学过,进程是独立的,就连父进程与子进程,都是独立的,但是凡事有利有弊,进程之间不能只有独立,也应该有协作,就比方说进程A处理某个数据给进程B,进程B分析这个数据给进程C,这些进程此时不应该相互独立,而应该互相协作,那么该怎么办呢??下面为你解答!!
1.理解层面
1.为什么要进程间通信
数据传输:⼀个进程需要将它的数据发送给另⼀个进程
资源共享:多个进程之间共享同样的资源
通知事件:⼀个进程需要向另⼀个或⼀组进程发送消息,通知它(它们)发⽣了某种事件(如进
程终⽌时要通知⽗进程)
进程控制:有些进程希望完全控制另⼀个进程的执⾏(如Debug进程),此时控制进程希望能够
拦截另⼀个进程的所有陷⼊和异常,并能够及时知道它的状态改变
举一个例子
考虑一个典型的多核处理器环境,在这个环境下,多个进程并行执行任务。如果这些进程要处理的数据量非常庞大,且每个进程只处理数据的其中一部分,那么如何让这些进程之间共享数据就变得非常关键。
场景:图像处理中的并行计算
假设我们要处理一个非常大的图像,需要进行复杂的图像滤波操作。假设有四个进程,分别处理图像的四个不同区域。每个进程会对自己的区域进行滤波处理,处理完成后,需要将处理结果汇总到一起生成最终的图像。
在这种情况下,进程间共享数据(通过IPC技术如共享内存)能够显著提高性能。每个进程不需要从磁盘中读取完整图像的每一部分,只需要处理自己负责的区域并与其他进程共享中间数据。使用共享内存机制,多个进程可以直接访问相同的内存区域,从而避免了数据复制的开销,减少了不必要的磁盘I/O操作。通过这种方式,进程间的高效数据共享能够显著提高整体图像处理速度。
2.什么是通信
进程间通信(IPC,Inter-Process Communication)指的是:不同进程之间为了交换数据、同步执行、协调资源而使用的一整套机制/技术。因为进程彼此隔离、地址空间独立,不能像同一进程里的线程那样直接共享变量,所以需要 IPC 来"搭桥"
3.怎么通信
我们先要知道通信本质是什么,后续的通信方法都离不开这个本质:
让不同的进程看到同一块资源【某种内存】,然后能进行通信!!
这个资源不可能由进程提供(就算最亲近的父子进程,也会发生写实拷贝),只能由操作系统(OS)提供->系统调用->OS的接口->设计统一的通信接口->设计出不同的通信方案
举个例子,在现实生活中,AB是两个陌生人,A与B想成为朋友,只能由C搭桥认识,不然两个人必定没有交集
注意:早期本机 IPC 各家 OS 各做各的;网络普及后,为了跨主机、跨系统互联,行业逐步形成并推广了以 TCP/IP 为代表的通用网络协议标准(以及以 socket 为代表的编程接口)
2.进程间通信的发展脉络
-
早期(单机批处理):几乎不需要复杂 IPC,更多是"顺序执行 + 文件交换"
-
分时/多任务出现 :进程并发增多,出现 信号 (通知)与 管道(父子进程字节流)
-
系统化 IPC(Unix/System V 等) :为更通用场景引入 消息队列 (按消息)、共享内存 (高性能)、信号量(同步互斥)
-
图形界面与桌面系统:更强调跨进程服务与安全隔离,出现更工程化的本机 IPC(如 Windows 的机制等)
-
网络化/分布式时代 :Socket 成为事实标准,IPC 从"进程间"扩展到"主机间"
-
服务化/云原生 :在 socket 之上封装 RPC/gRPC/HTTP ,并配合 消息中间(Kafka/RabbitMQ 等)实现解耦、可靠与可扩展
3.进程间通信分类
1.管道
匿名管道pipe
命名管道
2.System V IPC
System V 消息队列
System V 共享内存
System V 信号量
3.POSIX IPC
消息队列
共享内存
信号量
互斥量
条件变量
读写锁