目录
进程间通信的7种方式,总结出他们的优点
1. 内核提供的原始通信方式有三种
1.1 无名管道
- 无名管道,顾名思义就是没有名字的管道,是一个特殊的文件,并且存储在内存上,不在文件系统中展示
- 无名管道打开后,会返回两个文件描述符,分别是读端和写端,当一个无名管道文件的两端全部被关闭后,管道文件在内存上消失
- 由于无名管道在文件系统中没有真实的名字存在,所以不能使用open函数来打开,需要使用特殊的api进行打开
- 无名管道只能适用于亲缘进程间的通信,需要在fork之前将管道文件打开,创建子进程后,子进程继承一份管道的文件描述符才能使用该管道
优点:适合亲缘进程间的通信,可以完成自己跟自己的通信。
1.2 有名管道
- 有名管道,顾名思义是有名字的管道文件,会在文件系统创建一个管道文件,类型为 p
- 该管道文件,仅仅只是用来进行进程间通信,不用于存储数据
- 对管道文件的操作,可以使用open函数进行打开,所以,有名管道既可以用于亲缘进程间通信,也可以用于非亲缘进程间通信
优点:对比无名管道,有名管道可以实现非亲缘进程间通信
1.3 信号
- 信号是软件模拟底层硬件的中断操作,中断:打断当前正在进行的事情,去做另一件事
- 信号是软件实现的,中断是硬件实现的
- 信号是linux内核实现的,没有linux,就没有信号的概念
- 用户可以给某个进程发送信号,一个进程也能给另一个进程发送信号,内核也可以给某个进程发送信号
- 当一个进程收到信号后的操作有三种:默认(一般是杀死进程)、捕获、忽略
优点:信号可以实现用户和进程间、进程和进程间,内核和进程间的通信
2. System V提供了三种通信方式
2.1 消息队列
Linux消息队列是一种进程间通信的机制,用于在不同的进程之间传递数据。它是一种基于内核的通信方式,可以实现进程之间的异步通信。
Linux消息队列的优点包括:
-
异步通信:消息队列支持异步通信,发送方将消息放入队列后即可继续执行其他任务,而无需等待接收方处理。
-
解耦合:消息队列可以将发送方和接收方解耦,它们不需要直接知道对方的存在。发送方只需将消息发送到队列中,而接收方只需从队列中获取消息即可。
-
缓冲能力:消息队列具有一定的缓冲能力,即使发送方和接收方的处理速度不一致,也不会导致数据丢失。消息会在队列中暂存,直到接收方准备好处理。
-
支持多对多通信:消息队列可以支持多个发送方和多个接收方之间的通信,实现了一对多或多对多的通信模式。
-
可靠性:Linux消息队列提供了持久化机制,即使系统崩溃或重启,消息也不会丢失。
-
高性能:由于消息队列是基于内核实现的,因此具有较高的性能和较低的延迟
2.2 共享内存
Linux共享内存是一种进程间通信的机制,它允许多个进程共享同一块内存区域。在共享内存中,多个进程可以直接访问同一块内存,而无需进行数据的复制和传输,从而提高了进程间通信的效率。
共享内存的优点包括:
-
高效性:由于多个进程可以直接访问同一块内存,因此数据的读写操作非常高效,无需进行数据的复制和传输。
-
灵活性:共享内存可以用于不同进程之间的通信,无论是父子进程还是无亲缘关系的进程,都可以通过共享内存进行数据的交换。
-
容量大:共享内存可以提供较大的内存空间供多个进程使用,适用于需要大量数据交换的场景。
-
实时性:由于共享内存是直接访问内存,因此可以实现实时数据的传输和处理。
-
简单易用:使用共享内存进行进程间通信相对简单,只需要通过系统调用创建和映射共享内存即可。
-
适用性广泛:共享内存可以用于各种类型的数据,包括结构体、数组、缓冲区等。
共享内存是所有进程间通信方式中效率最高的,原因是,操作共享内存段时,无需进行用户空间和内核空间的切换
2.3 信号量(信号灯集)
Linux信号量是一种进程间通信机制,用于同步和互斥访问共享资源。它是一种计数器,用于控制对共享资源的访问。信号量集是一组信号量的集合,可以同时管理多个信号量。
Linux信号量集的优点包括:
-
同步机制:信号量集可以用于实现进程间的同步,确保多个进程按照特定的顺序执行。通过对信号量进行P操作(等待)和V操作(释放),进程可以等待其他进程完成某个操作后再继续执行。
-
互斥访问:信号量集可以用于实现进程间的互斥访问共享资源。通过对信号量进行P操作和V操作,进程可以控制对共享资源的访问,避免多个进程同时访问导致的数据不一致性问题。
-
高效性:信号量集是一种高效的进程间通信机制,相比于其他机制如管道或消息队列,它的开销较小。信号量集的实现通常基于硬件原语,能够在多核系统中高效地进行操作。
-
可扩展性:信号量集可以管理多个信号量,每个信号量可以用于不同的目的。这使得它具有很好的可扩展性,可以满足不同进程间通信的需求。
3. 套接字通信:socket
Linux Socket通信是一种在Linux操作系统中实现进程间,可以是跨主机的通信机制。
Linux Socket通信的优点包括:
-
灵活性:Socket通信可以在同一台机器上的不同进程之间进行通信,也可以在不同机器上的进程之间进行通信。这种灵活性使得Socket通信成为实现分布式系统和网络应用的重要工具。
-
可靠性:Socket通信基于TCP/IP协议栈,提供了可靠的数据传输机制。通过使用TCP协议,Socket通信可以保证数据的完整性、顺序性和可靠性。
-
高性能:Socket通信在底层使用了高效的网络协议栈,能够实现高性能的数据传输。同时,Socket通信也支持多线程和多进程并发处理,可以充分利用系统资源,提高系统的吞吐量和响应速度。
-
跨平台性:Socket通信是一种标准化的网络编程接口,几乎所有操作系统都支持Socket通信。这使得开发人员可以在不同平台上使用相同的代码进行网络应用的开发,提高了开发效率和可移植性。
-
可扩展性:Socket通信支持多种网络协议,如TCP、UDP等,可以根据应用的需求选择合适的协议。同时,Socket通信也支持自定义协议的开发,可以根据具体需求进行扩展和定制。