进程通信(转)

 

1、定义:

    进程通讯是指进程之间的信息交换

 

    在进程之间要传送大量数据时,就需要使用进程通讯。

    进程互斥和同步需要交换一定的信息,它们也可归为进程通讯,属于低级的进程通讯低级的原因在于

(1)、效率低,生产者每次只能向缓冲池投放一个产品(消息),消费者每次只能从缓冲池中取得一个消息

(2)、通讯对用户不透明,OS职位进程之间的通讯提供了共享存储其。

 

2、进程通讯特点:

  1. 使用方便。OS隐藏了实现进程通讯的具体细节,向用户提供了一组用于实现高级通信的命令(原语),用户可方便的直接利用它实现进程之间的通信,或者说,通信过程对用户是透明的,这样大大减少了通信程序编制上的复杂性。
  2. 高效的传送大量的数据。用户可以直接利用高级通讯命令(原语)高效地传送大量的数据。

 

 

3、进程通信的分类

  • 共享存储器系

        在该系统中,相互通信的进程共享某些数据结构共享存储区,进程能通过这些空间进行通信。

 

  • 管道通信系统
  • 消息传递系统
  • 客户机-服务器系统

 

3.1、共享存储器系

(1)、基于共享数据结构的通信方式。在这种通信方式中,要求诸进程公用某些数据结构,借以实现诸进程间的信息交换,如在生产者-消费者问题中的有界缓冲区。操作系统仅提供共享存储器,由程序员负责对公共数据结构的设置及对进程间同步的处理。这种通信方式仅适用于传递相对较少的数据,通信效率低下,属于低级通信。

(2)、基于共享存储区的通信方式。为了传输大量数据,在内存中划出了一块共享存储区域,诸进程可通过对该共享区的读或写交换信息,实现通信,数据的形式和位置甚至访问控制都是进程负责,而不是OS。这种通信方式属于高级通信。需要通信的进程在通信前,像系统申请获得共享存储区中的一个分区,并将其附加到自己的地址空间中,便可对其中的数据进行正常读、写,读写完成或不再需要时,将归还给共享存储器。

3.2、管道通信系统

    所谓“管道”,是指用于连接一个读进程一个写进程以实现它们之间通信的一个共享文件,又名pipe文件。

    向管道(共享文件)提供输入的发送进程(即写进程)以字符流形式将大量的数据送进管道;而接受管道输出的接受进程(即读进程)则从管道中接收(读)数据。

 

    为了协调双方的通信,管道机智必须提供下面三方面的协调能力

  1. 互斥,即当一个进程正在对pipe执行读/写操作时,其他(另一)进程必须等待。
  2. 同步,指当写(输入)进程把一定数量(如4KB)的数据写入pipe,便去睡眠等待,知道读(输出进程)取走数据后再把它唤醒,当读进程读一空pipe时,也应睡眠等待,直到读(输出)进程取走数据后把它唤醒。
  3. 确定对方是否存在,只有确定了对方已存在时才能进行通信。

 

3.3、消息传递系统

    不借助任何共享存储区或数据结构,而是以格式化的消息(messag)为单位,为通信的数据封装在消息中,并利用操作系统提供的一组通信命令(原语),在进程间进行信息传递,完成进程间的数据交换。

分类:

  1. 直接通信方式,指发送进程利用OS所提供的发送原语,直接把消息发送给目标进程;
  2. 间接通信方式,指发送和接受进程,都通过共享中间实体(简称邮箱)的方式进行消息的发送和接受,完成进程间的通信。

 

3.4、客户-服务器系统

        在网络环境的各种应用领域已成为当前主流的通信实现机制,主要的实现方法分三类:套接字、远程过程调用和远程方法调用。

(1)、套接字(Socket)

        套接字,源IP地址和目的IP地址以及源端口号和目的端口号的组合称为套接字。其用于标识客户端请求的服务器和服务。套接字分为以下两类:

  • 基于文件型:通信进程都运行在同一台机器的环境中,套接字是基于本地文件系统支持的,一个套接字关联到一个特殊的文件,通信双方通过这个特殊文件的读写实现通信,其原理类似于前面所讲的管道。
  • 基于网络型:该类型通常采用的是非对称方式通信,即发送者需要提供接收者命名。通信双发的进程运行在不同的主机的网络环境下,被分配了一堆套接字,一个属于接收进程(或服务进程),一个属于发送进程(或客户进程)。

 

优势:不仅适用于同一台计算机内部的进程通信,也适用于网络环境中不同计算机间的进程通信。

 

java编程示意图:

 

        socket连接的过程中如果使用的是TCP连接需要在连接的时候进行”三次握手“,断开连接的时候需要进行”四次分手“。

 

 

 

 

(2)、远程过程调用和远程方法调用

        远程过程(函数)RPC(RemoteProcedure Call),是一个通信协议,用于通过网络连接的系统。该协议允许运行于一个主机(本地)系统上的进程调用另外一台主机(远程)系统上的进程,而对程序员表现为常规的过程调用,无需额外的编程。

        负责处理远程过程调用的进程有两个,一个是本地客户进程,另一个是远程服务器进程,这两个进程通常也被称为网络守护进程。主要负责在网络间的进程传递,一般情况下,这两个进程都是处于阻塞状态,等待消息。

 

名词解析:

        存根:在本地客户端,每个能够独立运行的远程过程都拥有一个客户存根,本地进程调用远程过程实际是调用该过程关联的存根;与此类似,在每个远程进程所在的服务器端,其所对应的实际可执行的进程也存在一个服务器存根与其关联。本地客户存根与对应的远程服务器存根一般也是处于阻塞状态,等待消息。

 

主要步骤:

  1. 本地过程调用者以一般方式调用远程过程在本地关联的客户存根,传递相应的参数,然后将控制权转移给客户存根;
  2. 客户存根执行,完成包括过程名和调用参数等信息的消息建立,将控制权转移给本地客户进程;
  3. 本地客户进程完成与服务器的消息传递,将消息发送给远程服务器进程;
  4. 远程服务器进程接收信息后转入执行,并根据其中的远程过程名找到对应的服务器存根,将消息转给该存根;
  5. 该服务器存根接收到消息后,由阻塞状态转入执行状态,拆开消息从中取出过程调用的参数,然后以一般方式调用服务器上关联的过程;
  6. 在服务器端的远程过程运行完毕后,将结果返回给与之关联的服务器存根;
  7. 该服务器存根获得控制权执行,将结果打包为消息,并将控制权转移给远程服务器进程;
  8. 远程服务器进程将消息发送会客户端;
  9. 本地客户进程接收到消息后,根据其中的过程名将消息存入关联的客户存根,再将控制权转移给客户存根;
  10. 客户存根从消息中取出结果,返回给本地调用者进程,并完成控制权的转移。

   

        上面的主要作用在于:将客户过程的本地调用转化为客户存根,再转化为服务器过程的本地调用,对客户与服务器来说,它们的中间步骤是不可见的,因此,调用者在整个过程中并不知道该执行时在远程还是在本地。

http://www.cnblogs.com/0201zcr/p/4619705.html

 

时间: 2024-11-20 23:19:36

进程通信(转)的相关文章

运用异步输入输出流编写Socket进程通信

同步?异步输入输出机制的引入 在Merlin之前,编写Socket程序是比 较繁琐的工作.因为输入输出都必须同步.这样,对于多客户端客户/服务器模式, 不得不使用多线程.即为每个连接的客户都分配一个线程来处理输入输出.由此而 带来的问题是可想而知的.程序员不得不为了避免死锁,线程安全等问题,进行大 量的编码和测试.很多人都在抱怨为什么不在Java中引入异步输入输出机制.比较 官方的解释是,任何一种应用程序接口的引入,都必须兼容任何操作平台.因为 Java是跨平台的.而当时支持异步输入输出机制的操

线程同步机制的区别与比较及进程通信方法

http://hi.baidu.com/wobash/blog/item/4c1de9464899c40f6a63e500.html 线程同步机制的区别与比较及进程通信方法 2008-08-29 14:07 有关多线程的一些技术问题: 1.   何时使用多线程? 2.   线程如何同步? 3.   线程之间如何通讯? 4.   进程之间如何通讯? 先来回答第一个问题,线程实际主要应用于四个主要领域,当然各个领域之间不是绝对孤立的,他们有可能是重叠的,但是每个程序应该都可以归于某个领域: 1.  

linux间进程通信

原文转自:http://www.cnblogs.com/linshui91/archive/2010/09/29/1838770.html 一.进程间通信概述 进程通信有如下一些目的:A.数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M字节之间B.共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到.C.通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程).D.资源共享:多个进程之间

android跨进程通信(IPC):使用AIDL

AIDL的作用 AIDL (Android Interface Definition Language) 是一种IDL 语言,用于生成可以在Android设备上两个进程之间进行进程间通信(interprocess communication, IPC)的代码.如果在一个进程中(例如Activity)要调用另一个进程中(例如Service)对象的操作,就可以使用AIDL生成可序列化的参数. AIDL IPC机制是面向接口的,像COM或Corba一样,但是更加轻量级.它是使用代理类在客户端和实现端传

消息传递-Visual C++ 中利用WM_COPYDATA进程通信

问题描述 Visual C++ 中利用WM_COPYDATA进程通信 在MFC进程利用通信时,怎么在利用发送消息的窗口类指针pWnd在接收消息后回复一个响应. 具体想法如下: BOOL CMainFrame::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct) { if (pCopyDataStruct != NULL) { LPCTSTR pszText = (LPCTSTR)(pCopyDataStruct->lpData); DW

linux编程-初学者求指教进程通信问题

问题描述 初学者求指教进程通信问题 怎么样实现父进程创建子进程,子进程睡眠等待父进程唤醒,然后父进程等待子进程执行完毕,最后结束子进程!求代码- 解决方案 http://blog.sina.com.cn/s/blog_69146f510100viti.html 解决方案二: 你这样不会陷入死锁的境地么? 解决方案三: 管道即可. waitpid等待子进程退出

Android IPC机制利用Messenger实现跨进程通信_Android

写作原因:跨进程通信的实现和理解是Android进阶中重要的一环.下面博主分享IPC一些相关知识.操作及自己在学习IPC过程中的一些理解.这一章使用Messenger实现跨进程通信,其中bindService基础部分参见Android IPC机制绑定Service实现本地通信. 跨进程简介 在介绍使用Messenger跨进程通信之前先要了解以下问题:为什么需要跨进程通信?只有有了需求才有学习的价值.我个人将不同进程简单的理解为不同的应用程序(当然也有例外,比如可以在同一个应用程序中开启两个或多个

Android编程实现AIDL(跨进程通信)的方法详解_Android

本文实例讲述了Android编程实现AIDL(跨进程通信)的方法.分享给大家供大家参考,具体如下: 一. 概述: 跨进程通信(AIDL),主要实现进程(应用)间数据共享功能. 二. 实现流程: 1. 服务器端实现: (1)目录结构,如下图: (2)实现*.aidl文件: A. IAIDLService.aidl实现: package com.focus.aidl; import com.focus.aidl.Person; interface IAIDLService { String getN

Android AIDL——进程通信机制详解_Android

Android  AIDL, Android进程机制通信机制,这里就整理下AIDL 的知识,帮助大家学习理解此部分知识! 什么是 AIDL AIDL 全称 Android Interface Definition Language,即 安卓接口描述语言.听起来很深奥,其实它的本质就是生成进程间通信接口的辅助工具.它的存在形式是一种 .aidl 文件,开发者需要做的就是在该文件中定义进程间通信的接口,编译的时候 IDE 就会根据我们的 .aidl 接口文件生成可供项目使用的 .java 文件,这和