进程间通信

19人阅读 评论(0) 收藏 举报
分类:

一、简单介绍

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

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

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

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

  • 共享内存
  • 消息传递

共享内存模式

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

消息传递模式

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

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

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

二、消息传递

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

有以下几种方式

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

直接通信

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

间接通信

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

缓冲

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

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

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

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

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

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

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

查看评论

【安卓开发】使用binder进行进程间通信

通常我们会有这样的需求,在安卓系统中,两个独立的进程之间需要通信,如进程A需要进程B的发过来的信号;或者进程A与进程B共享一个内存块;或者进程A是32位进程而进程B是64位进程,为了加速处理过程,需要...
  • jaych
  • jaych
  • 2016-09-02 23:54:38
  • 630

进程间通信的5种方式

五种进程间通信的方式: 共享内存(shared memory):其允许多个进程通过读写同一块内存地址来相互通信。 内存映射(Mapped memory):其和共享内存相似,然而它是和文...
  • xiaoxiaoniaoer1
  • xiaoxiaoniaoer1
  • 2012-09-18 15:50:37
  • 1770

android进程间通信机制讲解

这里主要讲解Android中的IPC——inter Process  communication,含义为进程间通信或者跨进程通信,是指两个进程之间进行数据交换的过程。 说起进程间通信,我们先来了解什么...
  • qq_28273051
  • qq_28273051
  • 2016-12-07 19:59:25
  • 256

UNIX环境C语言编程(12)-进程间通信

管道 popen、pclose函数 FIFO(命名管道) XSI IPC 消息队列 共享内存 信号灯 客户机/服务器特性...
  • justkk
  • justkk
  • 2015-02-06 17:28:42
  • 1377

一个例子入门Linux进程间通信

先上题目吧:
  • u011435712
  • u011435712
  • 2014-11-22 10:53:27
  • 1842

Linux内核源代码情景分析-基于socket的进程间通信

一、利用插口实现进程间通信的流程示意图如下:                                    有连接插口通信流程示意图    二、client_server_local_sock...
  • jltxgcy
  • jltxgcy
  • 2015-05-02 16:55:18
  • 1759

unix进程间通信(pdf)

  • 2008年08月22日 15:15
  • 8.39MB
  • 下载

嵌入式 Linux 进程间通信几种方式小结

一、进程间通信概述 进程通信有如下一些目的: A、数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M字节之间 B、共享数据:多个进程想要操作共享数据,一个进程对共...
  • skdkjxy
  • skdkjxy
  • 2014-08-29 17:21:23
  • 640

下面哪些机制可以用于进程间通信?

下面哪些机制可以用于进程间通信? Linux进程间通信:管道、信号、消息队列、共享内存、信号量、套接字(socket) Linux线程间通信:互斥量(mutex),信号量,条件变量Windows进程间...
  • hyqsong
  • hyqsong
  • 2016-03-08 07:25:43
  • 2134

下面哪些机制可以用于进程间通信

下面哪些机制可以用于进程间通信? A Socket B Named pipe C Named event D Critical Section E Shared me...
  • xhyxxx
  • xhyxxx
  • 2017-03-20 22:29:47
  • 629
    个人资料
    持之以恒
    等级:
    访问量: 11万+
    积分: 7392
    排名: 3751
    最新评论