前言
介绍一下进程之间的通信,以及我在工作中对于进程通信的选择。
为什么有这个进程通信的概念呢。
实际上是因为进程是一个独立的运行单位,它分配的内存地址不能够被其他进程访问,这样的设计其实是为了安全。
但是有时候我们进程之间需要交换信息,那么怎么办呢?操作系统给了我们路口。
进程通信有下面几种方式:
图:
正文
共享存储
看图:
举个栗子。
不知道各位有没有开发过android,android app之间是如何通信的呢?
app肯定是不同的进程,他们有一种Ashmem来实现共享内存,有兴趣可以看看。
管道通信
管道是指用于连接读写进程的一个共享文件,又名pipe 文件。其实就是在内存中开辟一个大小固定的缓冲区。
注:管道只能采用半双工通信,某一段时间内只能实现单项的传输。如果要实现双通道,那么要两根。
它的运作方式是这样的,比如说进程一写完了数据后,进程二才能去读取数据。
这种管道是1对1的概念,只能一个进程对另外一个进程,而不能1对多。
因为是这样子的,只有管道写满之后,另外一个进程才能读取,在另外一个进程读取完毕之后,前面一个进程才能继续写。
所以说管道通信其实是有非常严格的要求的。
消息传递
进程间的数据交换以格式化的消息为单位。进程通过操作系统提供的"发送消息/接收消息"两个原语来进行数据交换。
具体操作如下:
消息传递有两种方式,一种是直接通信方式,一种是间接通信方式。
直接通信是这样子的,一个进程通过发送原语发送消息,这些消息操作系统会把这些消息挂载到目的进程消息缓存队列中,如果目的进程需要接收,那么目的进程可以通过接收原语接收。
所谓原语,一般是指由若干条指令组成的程序段,用来实现某个特定功能,在执行过程中不可被中断。
间接通信方式,消息先发送到中间实体(信箱)中,因此也称“信箱通信方式”。
形象点如下: