通信模型
同一个进程中的线程共享数据空间(用户态可以直接操作栈空间)可以直接通信,但是进程间是无法直接进行通信的。因此,主要有两种模型:共享内存模型和消息传递模型。
| 基础 | 共享内存系统 | 消息传递系统 |
|---|---|---|
| 沟通 | 使用共享内存区域建立通信 | 通信是使用消息传递工具建立的 |
| 数据大小 | 对于交换大量数据很有用 | 对于交换少量数据很有用。 |
| 流程位置 | 对于同一系统上的通信进程很有用 | 对于不同远程系统上的通信进程很有用 |
| 速度 | 进程之间的通信速度更快 | 通讯速度相对较慢 |
| 内核干预 | 内核干预不存在 | 内核干预是存在的 |
通信方式
管道(无名管道,Pipe)
比如cat xx.txt | grep -n 'xxx' 这个'|'可以看作一个单向的匿名管道,使得父子两个进程之间进行通信,前一个命名的输出作为后一个命令的输入,该管道使用结束则立即销毁。
命名管道(Namedpipe)
在linux中以文件的形式存在,只要访问该文件就可以实现任意两个进程间的通信,命名管道可以看作是是硬盘上存在的设备文件,所以打开需要使用open。
消息队列模型(Message Queue)
消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
共享内存(Shared Memory)
共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。多用于传输一些大文件,如果采用管道或者消息队列传输大文件,涉及到重复拷贝,比较消耗性能,因此模拟多线程,在内存中开辟一块特殊的内存用于多个进程共享访问。也是进程间最高效的通信方式。
信号量机制(Semophore)
信号量可以看作一种数据操作锁,通过对临界资源的控制访问以管理进程之间的通信,PV原语操作。
信号(Signal)
信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
套接字(Socket)
套接口也是一种进程间通信机制,与其他通信机制不同的是,它可用于操作系统之间及其内部的进程通信。打开的socket在linux下也是以文件描述符fd存在。服务端创建套接字,绑定ip端口,监听端口号,等待客户端调用,客户端创建之后与服务端的连接完成,双方就可以发送和接收数据。