1. 知识总览
进程间通信方式
三大类: 共享存储,消息传递,管道通信(内存缓冲区)
2.什么是进程通信
各进程的内存空间是相互独立的,一个进程不能访问另一个进程的内存空间。
但是进程间的相互通信是不可避免的
方案一 共享存储
为两个进程设立一个共享存储区,两个进程需要互斥(通过PV操作)的访问共享空间。
共享存储分为 基于数据结构 和 基于存储区 两种
基于数据结构:只能放固定数据结构的数据,速度慢,限制多,是一种低级通信方式
基于存储区:数据形式由进程控制,是高级通信方式
方案二 管道通信
管道通信只能使用半双工,一段时间内只能单向通信。管道就是内存中的缓冲区,缓存区未满时不能读数据,缓冲区未空不能写数据。当写入方将缓冲区写满后,读入方才能开始读,只有读入方将缓冲区读空以后,缓冲区才能重新被写入数据。
管道满时,写进程的write()调用将被阻塞,管道空时,读进程的read()调用将被阻塞
对于管道来说,两个读进程之间,两个写进程之间,读进程与写进程之间都是互斥的。
两个写进程可能会覆盖写入以及乱序写入
由于管道中的数据在读进程读取之后便丢失了(这与文件不同,文件读取不改变文件里的值),因此两个读进程一起读的话可能会导致错误(想读的已经被读走了,只能读不该读的了)
方案三 消息传递
进程间通过 “发送消息”、“接受消息”这两个 原语 来进行数据交换
类似与邮件,有一个消息信箱作为进程间消息的中转站,进程要先将消息发送到信箱中去,进程收到消息后将消息挂到消息队列上
消息类似于网络报文,分为消息头和消息体两部分。消息头包括 发送进程id,接受进程id,消息类型,消息长度等(和计网完全类似)
注意:
共享存储方式中,两个进程必须互斥的访问共享空间
管道通信方式,一个管道只能实现半双工通信,要想实现全双工通信,需要设置两个管道(两个缓冲区)