精华内容
下载资源
问答
  • 进程通信方式

    2019-10-31 12:07:29
    进程通信方式1、管道2、消息队列3、共享内存4、信号量5.Socket 1、管道 通信方式是单向的 管道的通知机制类似于缓存,就像一个进程把数据放在某个缓存区域,然后等着另外一个进程去拿,并且是管道是单向传输的。 ...

    进程通信

    进程通信方式分为低级通信和高级通信两种
    低级通信传递少量数据,主要用于通知对方某事件。
    高级通信用于传递大量数据,信息。
    低级通信的方式有信号,信号量
    高级通信的方式有消息,管道和共享内存

    同步通信

    像打电话一样双方必须在线,同步地交谈。
    管道和共享内存等都属于同步通信

    异步通信

    像电子邮件、短信一样不必关心对方何时接收
    消息、信号属于异步通信

    1、管道(匿名管道)

    管道的通知机制类似于缓存,就像一个进程把数据放在某个缓存区域,然后等着另外一个进程去拿,并且是管道是单向传输的。
    通信方式效率低下
    管道不适合频繁通信的进程。
    优点 能够保证我们的数据已经真的被其他进程拿走了

    2、消息队列

    通信方式也类似于缓存
    如果 a 进程发送的数据占的内存比较大,并且两个进程之间的通信特别频繁的话,消息队列模型就不大适合了。因为 a 发送的数据很大的话,意味发送消息(拷贝)这个过程需要花很多时间来读内存。

    3、共享内存

    共享内存这个通信方式就可以很好着解决拷贝所消耗的时间了。
    系统加载一个进程的时候,分配给进程的内存并不是实际物理内存,而是虚拟内存空间。那么我们可以让两个进程各自拿出一块虚拟地址空间来,然后映射到相同的物理内存中,这样,两个进程虽然有着独立的虚拟内存空间,但有一部分却是映射到相同的物理内存,这就完成了内存共享机制了。

    4、信号量

    共享内存最大的问题是多进程竞争内存的问题
    信号量的本质就是一个计数器,用来实现进程之间的互斥与同步。

    5.信号

    信号是进程间可互相发送的控制信息,一般只是几个字节的数据,用于通知进程有某个事件发生。

    展开全文
  • 在不同应用程序之间交互数据(跨进程通讯),在Android SDK中提供了4种用于跨进程通讯方式。 这4种方式正好对应于android系统中4种应用程序组件:Activity、Content Provider、Broadcast和Service。其中Activity...
  • java进程通信方式

    千次阅读 2019-08-26 18:24:43
    以下是常用的进程通信方式。 管道(Pipe):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同祖先的进程之间进行通信。(半双工:数据传输...

    由于内存管理的一些机制,导致两个进程间并不能直接的进行通信(在独立的用户空间),因此我们需要利用一些介质来完成两个进程之间的通信。以下是常用的进程间通信方式。

    1. 管道(Pipe):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同祖先的进程之间进行通信。(半双工:数据传输指数据可以在一个信号载体的两个方向上传输,但是不能同时传输。
    2. 有名管道(named pipe): 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。命名管道在文件系统中有对应的文件名。命名管道通过命令 mkfifo 或系统调用 mkfifo 来创建。
    3. 信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生。
    4. 消息(Message)队列:消息队列是消息的链接表。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少管道只能承载无格式字节流以及缓冲区大小受限等缺点。
    5. 共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。
    6. 内存映射(mapped memory):内存映射允许任何多个进程间通信,每一个使用该机制的进程通过把一个共享的文件映射到自己的进程地址空间来实现它。
    7. 信号量(semaphore):信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
    8. 套接口(Socket):更为一般的进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。可用于不同机器之间的进程间通信。

    继续阅读之前请先区分进程和线程区别!!!,如有任何混杂,请参考:传送门

    可以把java进程理解为jvm进程,至于通讯方式处理Socket以外 我们还可以用 RPC,Webservice,RMI,JMS 等,当然,JAVA进程间通信的最基本手段大都也是Socket。

    RPC

    远程过程调用(Remote Procedure Call,缩写为RPC),是一种用于构建基于C/S(客户端/服务器)的分布式应用程序技术。调用者与被调用者可能在同一台服务器上,也可能在由网络连接的不同服务器上,对于他们来说,网络通信是透明的,就是像调用本地方法一样调用远程方法。

    RPC框架要做到的最基本的三件事:

    1、服务端如何确定客户端要调用的函数?

    在远程调用中,客户端和服务端分别维护一个【ID->函数】的对应表, ID在所有进程中都是唯一确定的。客户端在做远程过程调用时,附上这个ID,服务端通过查表,来确定客户端需要调用的函数,然后执行相应函数的代码。

    2、如何进行序列化和反序列化?

    客户端和服务端交互时将参数或结果转化为字节流在网络中传输,那么数据转化为字节流的或者将字节流转换成能读取的固定格式时就需要进行序列化和反序列化,序列化和反序列化的速度也会影响远程调用的效率。

    3、如何进行网络传输?(选择何种网络协议?)

    多数RPC框架选择TCP作为传输协议,也有部分选择HTTP。如gRPC使用HTTP2。不同的协议各有利弊。TCP更加高效,而HTTP在实际应用中更加的灵活。

    RPC 框架作为架构微服务化的基础组件,它能大大降低架构微服务化的成本,提高调用方与服务提供方的研发效率,屏蔽跨进程调用函数(服务)的各类复杂细节。让调用方感觉就像调用本地函数一样调用远端函数、让服务提供方感觉就像实现一个本地函数一样来实现服务。

    请注意,RPC只是一种编程模型而非一种规范或协议,并没有规定你具体要怎样实现,你甚至都可以在你的RPC框架里面使用RMI来实现数据的传输!!!

    成熟RPC框架:

    dubbo:阿里开源的一款高性能RPC框架,在国内应用广泛,期间停止维护过一段时间,如今又开始了更新,并且捐献给Apache基金会。

    gRPC:Google开源,具有平台无关性,基于http/2协议,支持服务追踪、负载均衡、健康检查等功能;RPC 框架是基于 HTTP 协议实现的,底层使用到了 Netty 框架的支持。

    Thrift:可伸缩的跨语言服务的RPC软件框架,最早由Facebook开发,2007年捐献给了Apache基金会管理,现在是Apache的顶级项目;

    Finagle:Twitter基于Netty开发的支持容错的、协议无关的RPC框架,支撑了Twitter的核心服务。

    Web Service

    WebService是一种跨编程语言和跨操作系统平台的远程调用技术。Web Service提供的服务是基于web容器的,底层使用http协议,类似一个远程的服务提供者,比如天气预报服务,对各地客户端提供天气预报,是一种请求应答的机制,是跨系统跨平台的。就是通过一个servlet,提供服务给其他应用请求。

    WebService采用HTTP协议传输数据,采用XML格式封装数据(即XML中说明调用远程服务对象的哪个方法,传递的参数是什么,以及服务对象的返回结果是什么)。XML是WebService平台中表示数据的格式。除了易于建立和易于分析外,XML主要的优点在于它既是平台无关的,又是厂商无关的。无关性是比技术优越性更重要的:软件厂商是不会选择一个由竞争对手所发明的技术的。但是XML虽然解决了数据表达问题,却留下了数据格式类型问题,XSD(XML Schema)就是专门解决这个问题的一套标准。它定义了一套标准的数据类型,并给出了一种语言来扩展这套数据类型。

    Web Service的标准

    1. Web Service 通过标准的Web 协议向Web 用户提供有用的功能。多数情况下使用SOAP协议。
    2. Web Service 可以非常详细地说明其接口,这使用户能够创建客户端应用程序与它们进行通信。这种说明通常包含在称为Web服务说明语言(WSDL)文档的XML 文档中。
    3. Web Service 已经过注册,以便潜在用户能够轻易地找到这些服务,这是通过通用发现、说明和集成(UDDI)来完成的。
    4. Web Service 体系结构的主要优点之一是:允许在不同平台上、以不同语言编写的各种程序以基于标准的方式相互通信。
    5. 我们将Web Service 定义为: 通过SOAP 在Web 上提供的软件服务,使用WSDL 文件进行说明,并通过UDDI 进行注册。

    SOAP

    WebService通过HTTP协议发送请求和接收结果时,发送的请求内容和结果内容都采用XML格式封装,并增加了一些特定的HTTP消息头,以说明HTTP消息的内容格式,这些特定的HTTP消息头和XML内容格式就是SOAP协议。SOAP提供了标准RPC方法来调用Web Service。

    SOAP协议 = HTTP协议 + XML数据格式

    • Soap 是XML Web Service 的通信协议。
    • SOAP 是一种规范,用来定义消息的XML 格式 。包含在一对SOAP 元素中的、结构正确的XML 段就是SOAP 消息。

    WSDL

    好比我们去商店买东西,首先要知道商店里有什么东西可买,然后再来购买,商家的做法就是张贴广告海报。 WebService也一样,WebService客户端要调用一个WebService服务,首先要知道这个服务的地址在哪,以及这个服务里有什么方法可以调用,所以,WebService务器端首先要通过一个WSDL文件来说明自己家里有啥服务可以对外调用,服务是什么(服务中有哪些方法,方法接受的参数是什么,返回值是什么),服务的网络地址用哪个url地址表示,服务通过什么方式来调用。

    WSDL(Web Services Description Language)就是这样一个基于XML的语言,用于描述Web Service及其函数、参数和返回值。它是WebService客户端和服务器端都能理解的标准格式。因为是基于XML的,所以WSDL既是机器可阅读的,又是人可阅读的,这将是一个很大的好处。一些最新的开发工具既能根据你的Web service生成WSDL文档,又能导入WSDL文档,生成调用相应WebService的代理类代码。

    WSDL文件保存在Web服务器上,通过一个url地址就可以访问到它。客户端要调用一个WebService服务之前,要知道该服务的WSDL文件的地址。WebService服务提供商可以通过两种方式来暴露它的WSDL文件地址:

    1. 注册到UDDI服务器,以便被人查找;
    2. 直接告诉给客户端调用者。

    UDDI:

    UDDI 目录条目是介绍所提供的业务和服务的XML 文件。UDDI 目录条目包括三个部分。

    “白页”介绍提供服务的公司:名称、地址、联系方式等等;

    “黄页”包括基于标准分类法的行业类别;

    “绿页”详细介绍了访问服务的接口,以便用户能够编写应用程序以使用 Web 服务。

    服务的定义是通过一个称为类型模型(或 tModel)的 UDDI文档来完成的。多数情况下,tModel包含一个WSDL 文件,用于说明访问 XMLWeb Service 的SOAP 接口,但是tModel非常灵活,可以说明几乎所有类型的服务。

    RMI 

    Java RMI,即 远程方法调用(Remote Method Invocation),一种用于实现远程过程调用(RPC)的Java API, 能直接传输序列化后的Java对象和分布式垃圾收集。它的实现依赖于Java虚拟机(JVM),因此它仅支持从一个JVM到另一个JVM的调用。甚至,它可以直接看成RPC的java版本

    RMI 采用stubs(占位程序)skeletons 来进行远程对象(remote object)的通讯。

    stub 充当远程对象的客户端代理,有着和远程对象相同的远程接口,远程对象的调用实际是通过调用该对象的客户端代理对象stub来完成的,通过该机制RMI就好比它是本地工作,采用tcp/ip协议,客户端直接调用服务端上的一些方法。优点是强类型,编译期可检查错误,缺点是只能基于JAVA语言,客户机与服务器紧耦合,缺点是只能使用java

    总结起来,RMI的工作原理大致可以理解为:

    服务器端提供服务,服务中要暴露可以调用的远程方法,以接口的形式表现,这样在客户端可以通过服务接口来调用远程方法,实现复杂的业务逻辑。在服务器端,首先要对接口中提供的方法实现,以便客户端调用能够完成一定的业务逻辑;接着需要生成Skeleton,在Skeleton中真正地实现了对商业方法的调用,完成了客户请求的调用的过程,将获取到的调用方法的结果通过序列化机制返回给客户端,进行应答。

    在客户端,通过Stub来接收服务器返回的数据(对象),即在这里进行了反序列化,也就是读取网络传输的字节流,进而进行重构。在Skeleton和Stub中,都对网络通信进行了处理,例如建立套接字,建立网络连接,为实际的业务需要做好准备。 

    JMS

    JMS是Java的消息服务,JMS的客户端之间可以通过JMS服务进行异步的消息传输。JMS支持两种消息模型:Point-to-Point(P2P)和Publish/Subscribe(Pub/Sub),即点对点和发布订阅模型。
     

    展开全文
  • 主要介绍了Python通过4种方式实现进程数据通信,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • Android开发中的跨进程通信方式总结

    千次阅读 2020-01-25 00:29:21
    在安卓开发过程中,为了保证每个应用的程序的不是独立的个体,需要对外提供接口,可以使多个应用程序之间可以进行数据交换,所以app之间的通信应用场景有很多,通信方式也有很多种。本文论述了Android开发中常用的跨...

    Android开发中的跨进程通信方式

    总的来说的Android跨进程通信的方式常用的有以下几种

    1. Activity可以跨进程调用其他应用程序
    2. Content Provider可以跨进程访问其他应用程序中的数据
    3. Broadcast可以向android系统中所有应用程序发送广播
    4. Service通信,这种可以跨进程通讯的服务叫AIDL服务

    1.Activity通信方式

    activity通信可以是当前应用程序的中的两个Activity进行数据交换,也可以跨进程,去和其他应用程序中的Activity进行通信。也是最常用的通信方式之一。下面描述的是App间通信的大致流程。
    通信流程大致如下:

    App_A Activity_A App_B Activity_B onCreate() startActivityForResult() onCreate() setResult() / finish() onActivityResult() App_A Activity_A App_B Activity_B

    代码如下:
    Activity_A中启动方法Activity_B

        /**
         * Activity_A开始通信
         */
        public void startActivity_B() {
            Intent intent = new Intent();
            int requestCode = 1;
            //设置启动的包名+类名(全路径)
            intent.setClassName("com.appb.activity","com.appb.activity.Activity_B");
            //设定将要传输的数据
            intent.putExtra("requestKey", "testData");
            super.startActivityForResult(intent, requestCode);
        }
    

    Activity_BIntent中数据的获取

        @Override
        protected void onCreate(final Bundle savedInstanceState) {
            Intent intent = getIntent();
            //数据取得
            mRequestData = intent.getStringExtra("requestKey");
        }
    

    Activity_B中向Activity_B返回数据

    
        public void closeActivity_B() {
            Intent data= new Intent();
            //返回数据定义
            data.putExtra("responseKey", "responseData");
            //返回数据设置
            setResult(Activity.RESULT_OK, data);
            //关闭当前Activity,返回启动Acivity
            super.finish();
        }
    

    Activity_A中接收Intent 中返回的数据

        @Override
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
            if(requestCode == 1 && resultCode == Activity.RESULT_OK){
              //接收返回的数据
              String responseData = data.getStringExtra("responseKey");
            } else {
             //TODO.
            }
        }
    

    2. Content Provider 通信

    //TODO

    3. Broadcast 通信

    //TODO

    4.Service通信方式

    service通信其实就是安卓独有的AIDL服务,AIDLAndroid Interface definition language),接口描述语言(语法和java类似),android特有的一种IPC机制。

    关联类图:在这里插入图片描述
    Binder的流程图:
    在这里插入图片描述

    具体实现步骤

    • 在客户端和服务端定义相同的aidl接口文件

    aidi文件 TestAppService .aidl

    interface TestAppService {
        int checkService(int requestId, TestAppServiceCallbacks callback);
    }
    

    aidi文件 TestAppServiceCallbacks .aidl
    用于通信的回调

    interface TestAppServiceCallbacks {
       void onCompleteCheckService(int requestId, int result);
    }
    
    • 服务端代码实现

    需要实现aidl编译后生成的 TestAppService.Stub 接口

    public class TestAppServiceBinder extends TestAppService.Stub {
      @Override
        public int checkService(int requestId, TestAppServiceCallbacks callback){
            //TODO 其他逻辑处理
            int result = 0;
            callback.onCompleteCheckService( requestId, result );
            return 0;
        }
    }
    

    同时需要定义提供给外部App绑定的Service

    public TestAppAidlService extends Service {
        private TestAppServiceBinder mBinder = null;
        @Override
        public void onCreate() {
            super.onCreate();
    
            mBinder = new TestAppServiceBinder(this);
        }
    
        @Nullable
        @Override
        public IBinder onBind(Intent intent) {
            return mBinder;
        }
    }
    
    • 客户端代码实现

    客户端定义连接对象

        //客户端用来请求的service
        private  TestAppService  testAppService;
        //service的连接对象
        private ServiceConnection serviceConnection = new  ServiceConnection () {
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
              // 我们这里拿到的对象其实就是其Stub的内部类Proxy对象
               testAppService = TestAppService.Stub.asInterface(service);
             }
    
             @Override
             public void onServiceDisconnected(ComponentName name) {
             //TODO service断开连接
            }
        }
    

    客户端定义绑定服务

      private boolean bindAppService() {
            Intent intent = new Intent();
            intent.setClassName("com.app.service", "com.app.service.TestAppService");
            try {
                if (getApplicationContext().bindService(intent, serviceConnection , 
                    Context.BIND_AUTO_CREATE)) {
                    return true;
                }
            } catch (SecurityException ex) {
            //TODO
            }
            return false;
        }
    

    客户端开始调用Service

        @Override
        protected void onResume() { 
        //绑定service成功
        if (bindAppService()){
            int result = testAppService.checkService(); 
          } else {
          //TODO 绑定失败
          }
        }
    

    客户端Service回调处理

     private TestAppServiceCallbacks.Stub  testAppServiceCallbacks = 
         new TestAppServiceCallbacks.Stub(){
          @Override
          void onCompleteCheckService (int requestId, int result ){ 
          //TODO 回调处理,接收服务端返回的数据
          }
      }
    

    https://github.com/cteamx/Thief-Book

    展开全文
  • 进程通信方式总结与盘点

    万次阅读 多人点赞 2019-11-20 14:25:23
    ​ 首先回顾下我们前面博文中讲到的信号量机制,为了实现进程的互斥与同步,需要在进程间交换一定的信息,因此信号量机制也可以被归为进程通信的一种方式,但是也被称为低级进程通信,主要原因为: 效率低:一次只...

    ​ 进程通信是指进程之间的信息交换。这里需要和进程同步做一下区分,进程同步控制多个进程按一定顺序执行,进程通信是一种手段,而进程同步是目标。从某方面来讲,进程通信可以解决进程同步问题。

    ​ 首先回顾下我们前面博文中讲到的信号量机制,为了实现进程的互斥与同步,需要在进程间交换一定的信息,因此信号量机制也可以被归为进程通信的一种方式,但是也被称为低级进程通信,主要原因为:

    1. 效率低:一次只可操作少量的共享数据,比如生产者消费者问题,生产者一次只可向缓冲池中投放一个消息;
    2. 通信对用户不透明:OS只为进程提供了共享存储器,而关于进程之间通信所需的共享数据结构的设计、数据的传递、进程的互斥与同步,都必须要有开发者去实现,显然,这对开发者来说很不方便,增加了程序设计的难度和复杂度。

    ​ 既然是说到了低级进程通信,并且解释了原因,那我们也来看一下高级进程通信的特点:

    1. 使用方便:这也是针对低级进程通信中的第二点—通信对用户不透明,OS对开发者隐藏了进程通信的具体细节,对于用户来说,只需要使用有OS提供的一组原语(实现高级通信的命令),就可以方便的直接使用并实现进程间的通信。就像我么使用第三方的jar包一样,直接调用封装好的方法即可。
    2. 高效的传送大量数据:可以通过OS提供的原语快速的传输大量数据。

    ​ 说完了两种级别的进程通信,下面我们就具体的来看一看进程的通信方式都有哪些。通信机制也是随着OS的发展而不断进步的,目前通信机制可分为四大类:共享存储器系统、管道通信系统、消息传递系统以及客户机-服务器系统。我们依次来进行讲解,对于下面出现的每种通信方式,我们采用序号来进行标记。

    共享存储器系统

    ​ 在共享存储器系统中,相互通信的进程共享某些数据结构或共享存储区,进程之间能够通过这些空间进行通信。因此按照共享内容的不同,可将其分为以下两种类型:

    1.基于共享数据结构的通信方式

    ​ 也称为我们上面讲到的信号量机制,此方式要求诸进程共用某些数据结构,借以实现进程间的信息交换,共享数据结构的一个例子就是存放消息的共享缓冲池,对其的操作需要使用信号量来保证诸进程间同步的进行。

    2.基于共享数据区的通信方式

    ​ 为了传输大量数据,OS在内存中划出一块共享存储区域,诸进程通过该共享区域读或写交换信息,实现通信。数据的形式、位置、访问控制都是由进程来控制的。需要通信的进程在通信前,先向系统申请获得共享存储区的一个分区,并将其附加到自己的地址空间中(如果不添加,访问时会产生地址越界中断,后续的内存管理中进行详细讲解),便可对其中的数据进行正常的读、写,操作完成或者不在需要时,再讲分区归还给共享存储区。也因为其一次可以操作一个分区,并可将大量的数据读取或者写入分区,所以这种方式也属于高级通信。另外因为数据不需要在进程之间复制,所以这是最快的一种进程通信机制

    管道(pipe)通信系统

    ​ 所谓“管道”是指连接一个读进程和一个写进程以实现他们之间通信的一个共享文件,又名pipe文件。管道系统可分为两种:

    3.无名管道

    ​ 这是Unix早期的一种通信方式,是半双工通信,只能用于父子进程或兄弟进程间,并且它不是普通的文件,并不属于其他任何文件系统,并且只存在于内存中。

    4.命名管道(FIFO)

    ​ 可以用于在无关进程间交换数据,FIFO也就是先进先出,有路径名与命名管道关联,它以一种特殊设备形式存在于文件系统中,并且可以实现半双工或全双工的通信。FIFO 常用于客户-服务器应用程序中,被作为汇聚点,在客户进程和服务器进程之间传递数据。

    消息传递系统

    ​ 在该机制中,进程不必借助任何共享存储区或数据结构,而是以格式化的消息(message)为单位,将通信的数据封装在消息中,并利用OS提供的一组通信原语,在进程间进行消息传递,完成进程间的数据交换。

    ​ 该方式隐藏了通信细节,使通信过程对用户透明化,降低了程序设计的复杂性和错误率,这也让它成为当前应用最广泛的一类进程间通信机制;并且该机制可以很好的支持多处理机系统、分布式系统和计算机网络,下面我们按照其实现方式,来分别讲解下消息传递系统:

    5.直接通信方式(消息缓冲队列)

    ​ 直接通信方式,是直接通过原语将消息发送到指定的进程,因此要求放松和接收的进程都必须以显示的方式提供对方的标识符。下面是两个OS提供的两条通信原语:

    send(receiver, message);   //发送一个消息给接收进程
    receive(sender, message);  //接收sender发来的消息
    

    ​ 下图是一个直接通信方式的示意图,图中可以很清晰的看到进程P1和P2各自发送了一条消息给对方,并从对方那接收了一条消息。

    ​ 需要注意的是,**消息缓冲队列通信机制**是直接通信的一种实现方式,而不是间接通信,因为其是将消息直接发送到指定进程中,如果消息没来得及被取走,就放入到消息缓冲队列中,因此和我们理解的ActiveMQ、RocketMQ是不同的。

    6.间接通信方式(消息队列)

    ​ 间接通信方式是指发送和接收进程都通过共享中间实体(OS中称为信箱)的方式进行消息的发送和接收,完成进程间的通信。

    ​ 我们来看下信箱通信的一个示意图,从图中我们可以看到,两个进程通过信箱来进行消息的发送和接收。

    ​ 我们现在常用的消息队列比如ActiveMQ、RocketMQ、RabbitMQ等,都是间接通信的一种,通过这种共享的中间实体(不一定要在当前主机的内存中),可以实现进程间的通信,并且可以很容易的实现不同主机上的进程通信。

    客户机-服务器系统

    ​ 讲到客户机-服务器系统,大家可能都会想到C/S架构,想到的可能是QQ或者WinForm等应用,但是C/S模式是一个逻辑上的概念,在进程通信中,发起请求的进程为客户机,进行响应的进程为服务器,在客户机-服务器系统中,除了客户机和服务器,还有用与连接所有客户机和服务器的网络系统。在网络环境的各种应用领域,客户机-服务器系统已经成为当前主流的通信机制。

    ​ 其主要的方法有三类:套接字、远程过程调用和远程方法调用。

    7.套接字(Socket)

    ​ 说起套接字大家应该都比较熟悉,ip+port,可以定位到哪个主机下的哪个进程,这样就可以对其进行请求,这个就是网络套接字。另一种套接字是文件套接字,基于本地文件系统实现的,一个套接字关联到一个特殊文件,通信双放通过这个文件进行读写实现通信,其原理类似管道。

    ​ 套接字的优势就在于,他不仅适用于同一台计算机内部的进程通信,也适用于网络环境中不同计算机间的进程通信;可以保证通信双方逻辑链路的唯一性(ip+port对ip+port可以保证逻辑链路唯一),并与实现数据传输的并发服务;隐藏了通信设施及实现细节,采用统一的接口进行处理。

    8.远程过程调用和远程方法调用(RPC)

    ​ 远程过程调用RPC(Remote Procedure Call)是一个通信协议,用于通过网络连接的系统。该协议允许运行于一台主机(本地)系统上的进程调用另一台主机(远程)系统上的进程,而对开发人员表现为常规的过程调用,无须额外的为此编程。如果设计的软件采用面向对象编程,也可称之为远程方法调用

    总结

    ​ 最后,我们对这几种通信方式进行一个总结,其中的某几种通信方式,被别的博主同一成了一个,比如消息传递系统中的直接通信和间接通信,统称为消息队列,这里不做正确性的评价,本文是把所有的通信机制大的方向做一个总结,具体的实现方式是有很多种的,故不做一一叙述。

    1.共享数据结构(信号量):仅适用于传递相对少量的数据,通信效率低,属于低级通信;

    2.共享存储区:允许多个进程共享一个给定的存储区,可以从中申请缓存区。因为数据不需要在进程之间复制,所以这是最快的一种通信机制,但要对诸进程的访问进行同步控制;

    3.无名管道:半双工、速度慢,容量有限,只有父子进程能通信;

    4.命名管道(FIFO):任何进程间都能通讯,但速度慢 ,可以实现半双工或全双工通信;

    5.消息缓冲队列:直接使用OS提供的原语,隐藏通信细节,需要知道接收进程的id和发送进程的id;

    6.消息队列:直接通过共享信箱或者队列,两个进程可以实现通信,可实现实时和非实时通信,两种消息传递系统容量都容易收到系统的限制;

    7.Socket:可以用于本机和不同主机间的进程通信,隐藏通信细节;

    8.RPC:无须额外编程,隐藏通信细节。


    ​ 又到了分隔线以下,本文到此就结束了,本文内容全部都是由博主自己进行整理并结合自身的理解进行总结,如果有什么错误,还请批评指正。对其中有什么疑惑的,可以评论区留言,欢迎你的留言与讨论;另外原创不易,如果本文对你有所帮助,还请留下个赞,以表支持。

    ​ 如有兴趣,还可以查看我的其他几篇博客,都是OS的干货(目录),喜欢的话还请点赞、评论加关注_

    展开全文
  • 本篇文章主要介绍了android webView独立进程通讯方式,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 常用的几种进程通信方式的比较常用的几种进程通信方式的比较
  • 文章从文件映射、命名管道、共享内存、邮件槽等不同进程通信方法出发讲述了其原理和优缺点。
  • 进程通讯的7种方式

    万次阅读 多人点赞 2019-04-26 14:23:24
    管道pipe:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。 命名管道FIFO:有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间...
  • Android进程通信方式总结

    千次阅读 2019-04-30 09:07:49
    定义多进程 Android应用中使用多进程只有一个办法(用NDK的fork来做除外),就是在AndroidManifest.xml中声明组件时,用android:process属性来指定。 不知定process属性,则默认运行在主进程中,主进程名字为包名...
  • 关于C语言中进程通信的5种方式

    千次阅读 2020-07-30 18:10:49
    Unix/Linux系统中C语言进程通信的5种方式进程通信广义进程通信方式单机环境中常见的进程通信方式管道通信命名管道内存映射信号共享内存 进程通信 操作系统中每个进程地址空间相互独立,进程间通信必须经过内核。 ...
  • 一、linux下进程间通信的几种主要手段简介: ... 信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;linux除了支...
  • 进程通信方式及比较

    2017-05-03 10:01:28
    详细的介绍进程通信方式--信号、管道、信号量、共享内存、消息队列
  • 进程通信概念和进程通信方式

    万次阅读 2017-05-08 19:11:01
    进程通信(IPC,Inter-Porcess Communcation)是进程进行通信和同步的机制。IPC提供两个基本操作: ...进程通信方式: 直接通信: 进程必须正确命名对方,比如send(p,message)向p发送信息,receiv
  • linux进程--进程通信方式(一)

    千次阅读 2020-06-04 17:32:39
    将子进程id返回给父进程的理由是:因为一个进程的子进程可以多于一个,没有一个函数使一个进程可以获得其所有子进程进程id。 对子进程来说,之所以fork返回0给它,是因为它随时可以调用getpid()来获取自己的pid;...
  • 主要介绍了C语言实现进程通信原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • unix进程通信方式总结(上)

    千次阅读 2016-08-06 00:52:14
    本文将《unix环境高级编程》一书中所涉及的几种重要的进程通信方式(Inter-Process Communication)进行简单总结,总的来说,进程间通信有以下几种: (1).
  • 进程通信方式有哪些?

    千次阅读 2019-05-07 08:56:22
    前言 进程能够单独运行并且完成一些任务,但是也经常免不了和其他进程传输数据或互相通知消息,即需要进行通信,本文将...进程通信常见方式如下: 管道 FIFO 消息队列 信号量 共享内存 ...
  • android跨进程通信方式有哪些?

    千次阅读 2018-03-22 18:19:09
    定义多进程Android应用中使用多进程只有一个办法(用NDK的fork来做除外),就是在AndroidManifest.xml中声明组件时,用android:process属性来指定。不知定process属性,则默认运行在主进程中,主进程名字为包名。...
  • 进程间8种通信方式详解

    万次阅读 多人点赞 2016-04-20 15:34:57
    1 无名管道通信无名管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。2 高级管道通信高级管道(popen):将另一个程序当做一...
  • 进程之间的通信方式

    千次阅读 多人点赞 2020-09-03 17:19:07
    进程通信方式一般有以下几种: 1、管道,匿名管道,命名管道 2、信号 3、信号量 4、消息队列 5、共享内存 6、socket 管道 管道数据只能单向流动,所以如果要实现双向通信,就要创建2个管道 管道分为匿名管道和...
  • 一、管道 UNIX 系统IPC最古老的形式。 特点: ...只能在父子进程或兄弟进程之间通信 只存在于内存中,不属于任何文件系统 原创文章 26获赞 16访问量 4万+ 关注 私信 展开阅读全文 作者:Steven_L_
  • 进程通信方式总结——消息队列

    千次阅读 2017-04-16 11:52:25
    Linux/Unix系统IPC是各种进程通信方式的统称,但是其中极少能在所有Linux/Unix系统实现中进行移植。随着POSIX和Open Group(X/Open)标准化的推进呵护影响的扩大,情况虽已得到改善,但差别仍然存在。一般来说,...
  • 进程之间通信方式 (1) 管道(PIPE) (2) 命名管道(FIFO) (3) 信号量(Semphore) (4) 消息队列(MessageQueue) (5) 共享内存(SharedMemory) (6) Socket Java如何支持进程间通信。我们把Java进程理解为JVM进程。很明显,...
  • iOS (APP)进程间8中常用通信方式总结

    万次阅读 2017-12-25 12:45:06
    所以iOS 的系统中进行App间通信的方式也比较固定,常见的app间通信方式以及使用场景总结如下。 1、 URL Scheme 这个是iOS app通信最常用到的通信方式,App1通过openURL的方法跳转到App2,并且在URL中带上想...
  • 进程通讯的四种方式

    万次阅读 2018-09-30 14:47:21
    文章目录共享内存信号管道消息队列 通信方法 无法介于内核态与用户态的原因 ... 共享内存是最快的进程通讯方式 原因:相对于其他几种方式,共享内存直接在进程的虚拟地址空间进行操作,不再...
  • 四种进程通信方式:activity 、service AIDL 、ContentProvider 、BroadcastReceiver 一个客户端一个服务端,相互通信
  • 一、进程通信(IPC,Inter-Process Communication)是指在不同进程间传播或交换信息 1. 无名管道 特点 半双工(数据流向仅有一个方向),具有固定的读端和写端 只能用于父进程或兄弟线程之间通信(具有血缘关系的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 469,950
精华内容 187,980
关键字:

进程通信方式