进程间通信方式

78 阅读3分钟

通信模型

同一个进程中的线程共享数据空间(用户态可以直接操作栈空间)可以直接通信,但是进程间是无法直接进行通信的。因此,主要有两种模型:共享内存模型和消息传递模型。

image.png

基础共享内存系统消息传递系统
沟通使用共享内存区域建立通信通信是使用消息传递工具建立的
数据大小对于交换大量数据很有用对于交换少量数据很有用。
流程位置对于同一系统上的通信进程很有用对于不同远程系统上的通信进程很有用
速度进程之间的通信速度更快通讯速度相对较慢
内核干预内核干预不存在内核干预是存在的

通信方式

管道(无名管道,Pipe)

比如cat xx.txt | grep -n 'xxx' 这个'|'可以看作一个单向的匿名管道,使得父子两个进程之间进行通信,前一个命名的输出作为后一个命令的输入,该管道使用结束则立即销毁。

命名管道(Namedpipe)

在linux中以文件的形式存在,只要访问该文件就可以实现任意两个进程间的通信,命名管道可以看作是是硬盘上存在的设备文件,所以打开需要使用open。

消息队列模型(Message Queue)

消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。

共享内存(Shared Memory)

共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。多用于传输一些大文件,如果采用管道或者消息队列传输大文件,涉及到重复拷贝,比较消耗性能,因此模拟多线程,在内存中开辟一块特殊的内存用于多个进程共享访问。也是进程间最高效的通信方式。

信号量机制(Semophore)

信号量可以看作一种数据操作锁,通过对临界资源的控制访问以管理进程之间的通信,PV原语操作。

信号(Signal)

信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。

套接字(Socket)

套接口也是一种进程间通信机制,与其他通信机制不同的是,它可用于操作系统之间及其内部的进程通信。打开的socket在linux下也是以文件描述符fd存在。服务端创建套接字,绑定ip端口,监听端口号,等待客户端调用,客户端创建之后与服务端的连接完成,双方就可以发送和接收数据。

进程间通信方式的区别