进程间通信概述

进程间通信

进程间通信(Inter-process communication:IPC),是指进程之间的信息交换。

之前总结的进程同步、互斥,如信号量机制中只需改变信号量中的状态或整型值这样的少量信息,这种其所交换的信息量少而被归结为低级通信。大量数据的传输低级通信在效率上无法满足了,因此需要高级通信。

 

进程通信方式概述

下面概述了8中进程通信方式:信号量;共享内存;消息传递;匿名管道;命名管道;信号;套接字;消息队列。

只是一个了解大概。具体内容以后再整理。

信号量(semaphore)

在另一篇已总结过来。https://www.cnblogs.com/fanglongxiang/p/12907876.html

进程间只需改变信号量中状态或整型值,这种交换信息量少的被归结为低级通信。

 

共享内存(Shared memory)

相互通信的进程共享某些数据结构(公共数据结构或变量)或共享内存,进程之间能够通过这些空间进行通信。

 

消息传递(Message passing)

消息传递系统是当前应用最为广泛的一种进程间的通信机制。

在该机制中,进程间的数据交换是以格式化的消息(message)为单位的;在计算机网络中,又把 message 称为报文。

特别值得一提的是,在当今最为流行的微内核操作系统中,微内核与服务器之间的通信,无一例外地都采用了消息传递机制。又由于它能很好地支持多处理机系统、分布式系统和计算机网络,因此它也成为这些领域最主要的通信工具。

特点:数据量大;隐藏了通信细节;通信过程对用户透明(不可见);减化了通信程序编制的复杂性

实现:

1.直接通信方式

点对点通信:发送进程利用 OS 所提供的发送命令,直接把消息发送给目标进程。

通常,系统提供下述两条通信命令(原语):

Send(Receiver,message); //发送一个消息给接收进程;
Receive(Sender,message); //接收 Sender 发来的消息

 

在某些情况下,接收进程可与多个发送进程通信,因此,它不可能事先指定发送进程。对于这样的应用,在接收进程接收消息的原语中,表示源进程的参数,也是完成通信后的返回值,接收原语可表示为:Receive (id,message);

2.间接通信方式

以信箱为媒介:间接通信方式指进程之间的通信需要通过作为共享数据结构的实体。该实体用来暂存发送进程发送给目标进程的消息;接收进程则从该实体中取出对方发送给自己的消息。

通常把这种中间实体称为信箱。消息在信箱中可以安全地保存,只允许核准的目标用户随时读取。因此,利用信箱通信方式,既可实现实时通信,又可实现非实时通信。

系统为信箱通信提供了若干条原语,分别用于信箱的创建、撤消和消息的发送、接收等。

 

管道是一种使用消息传递进行进程间通信的机制。管道是由它们的标准流链接在一起的一组进程,因此每个进程的输出文本(stdout)作为输入(stdin)直接传递到下一个进程。

管道又分为匿名管道和命名管道,如下介绍。主要区别是匿名管道只能用于又亲缘关系的(父子或兄弟)进程,进程结束后即消失;而命名通道利用了文件系统,具有文件,不局限于具有亲缘关系的进程,处理完后 仍有信息保留。

匿名管道(Anonymous pipe)

匿名管道是可用于单向进程间通信的单工 通信通道。

通常,父程序会打开匿名管道,并创建一个继承管道另一端的新进程,或者创建几个新进程并将它们安排在管道中。

特点:

单工:单向传递若实现进程间双向通信,需定义两个管道。

FIFO:先进先出

无名:所以不能任意访问已有的管道

 

相关:只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程)

生命:匿名管道将由一个进程写入的数据由操作系统缓冲,直到由下一个进程读取为止,并且当进程完成时,该单向通道将消失。


命名管道(Named pipe)

在Unix中,命名管道利用了系统的文件系统。它是使用mkfifo()显式创建的mknod(),并且两个单独的进程可以按名称访问管道。一个进程可以以读取器的身份打开它,另一个进程以写入器的形式打开。

特点:

单工:单向传递若实现进程间双向通信,需定义两个管道。

FIFO:先进先出

有名:命名管道有一个名字,命名管道的名字对应于一个磁盘索引节点

无关:有了这个文件名,任何进程有相应的权限都可以对它进行访问。而不局限于父子进程,当然前提是进程对命名管道有适当的访问权。

生命:命名管道将消息传递到通过使其成为文件而命名的管道或从该管道传递消息,并在处理完成后保留。当不再被进程使用时,命名管道在内存中释放,但磁盘节点仍存在。

 

信号(Signal)

信号是进程间通信的一种受限形式,通常在Unix,类Unix以及其他POSIX兼容操作系统中使用。它是一种异步通知,它发送到一个进程或同一进程中的特定线程,以便将发生的事件通知给它。

发送信号后,操作系统会中断目标进程的正常执行流程以传递信号。可以在任何非原子指令中中断执行。如果该进程先前已注册了信号处理程序(signal handler),则执行。否则,将执行默认信号处理程序。

嵌入式程序可能会发现对进程间通信有用的信号,因为信号的计算和内存占用量很小。

注:信号类似于中断,区别在于中断由处理器介导并由内核处理,而信号由内核介导(可能通过系统调用)并由进程处理。

 

套接字(socket)

Socket通常称为“套接字”,用于描述IP地址和端口,是一个通信链的句柄(Handle)。

socket可用于一般的进程间通信机制,也可用于不同机器之间的进程间通信。

进程唯一标识:PID(Process Identification)

Localhost 本地地址,代表本机:127.0.0.1

 

消息队列(Message queue)

消息队列是消息的链接表 ,存放在内核中并由消息队列标识符标识。可以把消息看作一个记录,具有特定的格式以及特定的优先级。

消息队列提供 异步 通信协议,这意味着消息的发送者和接收者不需要同时与消息队列进行交互。存储在队列中的消息将被存储,直到收件人检索到它们为止

 

posted @ 2020-05-20 00:40  流浪_归家  阅读(876)  评论(0编辑  收藏  举报