进程间通信

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ZCMUCZX/article/details/79946923

一、简单介绍

操作系统内并发执行的进程可以是独立的进程也可以是协作的进程。如果一个进程不能影响其他进程或者被其他进程所影响,那么这个进程就是独立的。很明显,不与任何其他进程共享数据的进程就是独立的。

如果说系统中一个进程能影响其他进程或者被其他进程所影响,那么该进程就是协作的,与其他进程共享数据的进程称为协作进程。

协作进程需要一种进程间的通信机制(interprocess communication,IPC)来允许进程相互交换数据与信息。

进程间通信有两种基本模式:

  • 共享内存
  • 消息传递

共享内存模式

在共享内存模式中,建立起一块供协作进程共享的内存区域,进程通过向此共享区域读或写入数据来交换信息,需要注意的是进程需要去负责保证它们不向同一区域同时写数据。采用共享内存的进程间通信需要通信进程建立共享内存区域。

消息传递模式

在消息传递模式中通过在协作进程间交换信息来实现通信,消息传递提供一种机制可以允许进程不必通过共享地址空间来实现通信和同步,在分布式环境中即通信进程可能位于由网络连接起来的不同计算机上的会特别有用,消息传递工具必须提供两种操作:发送消息和接受消息。由进程发送的消息可以是定长的也可以是变长的。

再来看下这两种模式的对比
通信模型

在操作系统中,上面的两种模式都是很常用的,而且很多系统也去实现了这两种模式。消息传递对于交换较少数量的数据很有用,因为我们不需要去避免写入冲突,对于计算机间的通信,消息传递也比共享内存更容易去实现。共享内存允许以最快的速度进行方便的通信,共享内存比消息传递的速度是快的,消息传递系统通常是用系统调用来实现的,因此是需要更多的内核介入的时间消耗,比如说用户态切换到内核态啊这些消耗等等。然而在共享内存系统中,仅仅是在建立起共享内存区域的时候需要系统的调用,一旦建立起了共享内存,所有的访问都被处理为常规的内存访问,不需要来自内核的帮助。下面将着重的介绍消息传递模式。

二、消息传递

如果两个进程需要通信的话,那么它们必须彼此相互发送消息和接受消息,它们之间必须要有通信线路,这个线路有很多实现方法,目前就对其的逻辑实现举出例子。

有以下几种方式

  • 直接或间接通信
  • 同步或异步通信
  • 自动缓冲和没有缓冲

直接通信

对于直接通信,需要通信的每个进程必须明确地命名通信的接受者或者而是发送者

间接通信

在间接通信中,通过邮箱或端口来发送和接受消息。邮箱可以抽象为一个对象,进程可以往里面去存放消息,也可以删除消息,每一个邮箱都有一个唯一的标识符。比如说POSIX消息队列采用一个整数值来表示一个邮箱,对于这种方案,一个进程可能通过许多不同的邮箱与其他进程通信,但是两个进程仅在其共享至少一个邮箱的时候才可以相互通信。

缓冲

不管通信是直接的还是间接的,通信过程所交换的消息都驻留在临时队列中,这个临时队列分为零容量,有限容量和无限容量,其中零容量的队列称为没有缓冲的消息系统,其他情况称为自动缓冲。

这里再简单的介绍下基于消息操作系统的Mach操作系统,Mach内核支持多任务的创建和删除,这里的任务和进程是类似的,但可以有多个控制现场。Mach的绝大多数通信(包括绝大多数系统调用和所有任务间信息)是通过消息实现的。消息通过邮箱(Mach称之为端口)来发送和接收。

即使是系统调用也是通过消息来进行的,每个任务在创建的时候,也创建了两个特别的邮箱:内核邮箱通报邮箱,内核使用内核邮箱与任务通信,使用通报邮箱发送事件发生的通知。消息发送可以采用msg_send向邮箱发送消息,消息可以通过msg_receive来接收。

系统可以通过调用port_allocate()函数去创建新邮箱并且为其消息队列分配空间。消息队列的最大长度默认为8个消息。

在开始的时候,邮箱的消息队列为空,随着消息向邮箱的发送,消息被复制到邮箱中。所有消息具有同样的优先级。Mach确保来自同一发送者的多个消息按照FIFO顺序来进行排队,但是不能保证绝对的顺序,比如同时到达的两个发送者的消息可以按照任意顺序进行排队。

消息本身是由固定大小的头部和可变长的数据部分组成,头部包括消息长度和两个邮箱名,当发送消息的时候,一个邮箱名是消息发送的目的地,通常发送线程也期待得到回应,所以也会把发送消息的邮箱名传递到接受任务,接受任务可以用它作为”返回地址”,以发送消息。

消息的可变部分是具有类型的数据项的链表。链表内部的每一项都有类型、大小、值。消息内所表示的对象类似是很重要的,因为操作系统定义的对象,如拥有权或者是接收访问权限、任务状态。内存段、都可以通过消息来发送。

阅读更多

没有更多推荐了,返回首页