进程间通讯(IPC)的5种方式详解
每个进程的用户地址空间是独立的,不能够相互访问,但是他们的内核空间是共享的,所以进程之间要通信可以通过内核。
一、管道通信
发送进程以字符流的形式将大量数据送入管道,接收进程可以从管道接收数据,二者利用管道进行通信。
管道实际上内核中的一块缓冲区,多个进程访问同一个缓冲区实现通信,分为匿名管道和命名管道。
C/S结构开发环境,主要通过命名管道实现进程间甚至跨服务器通信。匿名管道用于本地机器上父子进程之间通信,系统开销小。
C#命名管道通信 - wardensky - 博客园 (cnblogs.com)
三、消息队列
消息队列(Message Queue)是保存在内核中消息链表。不太适合比较大数据的传输,应为他在通讯过程中会存在用户态和内核态两次数据拷贝。
“消息”是在两台计算机间传送的数据单位。
消息队列管理器在将消息从它的源中继到它的目标时充当中间人。
队列的主要目的是提供路由并保证消息的传递;如果发送消息时接收者不可用,消息队列会保留消息,直到可以成功地传递它。
参考博客:https://blog.csdn.net/dnazhd/article/details/88300163
二、信号量
信号量其实是一个整形的计数器,主要用于实现进程间的同步与互斥。
1.信号量用于进程间同步与互斥,若要在进程间传输数据需要结合共享内存。
2.信号量基于操作系统的PV操作,程序对信号量的操作都是原子操作。
3.每次对信号量的PV操作不仅限于信号量值加一减一,而且可以加减任意整数。
信号量表示资源的数量,控制信号量的方式有两种原子操作:
1.一个是 P 操作,这个操作会把信号量减一,相减后如果信号量 < 0,则表明资源已被占用,进程需阻塞等待;相减后如果信号量 >= 0,则表明还有资源可使用,进程可正常继续执行。
2.另一个是 V 操作,这个操作会把信号量加一,相加后如果信号量 <= 0,则表明当前有阻塞中的进程,于是会将该进程唤醒运行;相加后如果信号量 > 0,则表明当前没有阻塞中的进程;
3.P 操作是用在进入共享资源之前,V 操作是用在离开共享资源之后,这两个操作是必须成对出现的。
信号量初始化为1,则该信号量就和互斥锁的用法一样。
信号量初始化为0,则代表是同步信号量。
四、共享内存
即在物理内存上开辟一块空间,然后多个进程通过页表将这同一个物理内存映射到自己的虚拟地址空间中,通过自己的虚拟地址空间来访问这块物理内存,达到了数据共享的目的。
1.共享内存是最快的IPC,因为进程是直接对内存进程存取
2.因为多个进程可以同时操作,所以需要同步
3.信号量+共享内存通常结合在一起使用,信号量用来同步对共享内存的访问
参考博客: C# 进程间共享内存通信方式;C# 进程间通信(共享内存)
五、Socket
1111
参考博客:
1: 进程间通信 | 管道 消息队列 共享内存 信号量 信号 socket_HUAERBUSHI521的博客-CSDN博客