由于本人才初识BMP和Android,所以仅仅是自己的一些肤浅认识,难免有错误,欢迎指正。

首先我们看IPC,现代操作系统都是多进程,多线程的。进程间存在地址边界,无法直接跨越。所以,两个进程间无法进行直接的请求,传递和调用。IPC是操作系统内核提供的一种跨进程的机制,允许两个进程间使用IPC来传递数据。 虽然某些情况下我们可以将Service直接加载到自己的进程中调用服务,此时可以进行简单的本地调用(Local Call),但是,从安全,性能和共享的角度出发,更多的情况下,Service都是运行在自己独立的进程中,此时Client使用其服务时,就必须跨越进程,那么就涉及到了IPC。 所以,在现代操作系统或者移动平台上,IPC是无处不在的。

IPC是操作系统层面提供的一种很底层的机制。你可以把它看做基础设施,传输媒介甚至底层协议。它只负责进程间传递数据,究竟数据是什么含义,发送,接收方如何处理这些数据等等都不是它的处理范围。 而这些,恰恰是上层需要为特定场景制定特殊的解决方案,框架,制定一致的规约,协议, 就像TCP/IP一致化了底层传输机制,但是面对不同应用场景的数据传输,必须由不同的应用层协议来协调C/S,以便能理解对应的语义,从而正常收发。 在非本地(同一进程内称之为本地)的复杂数据传递,调用中,尤其需要制定这样一套规则,来一致的解决问题。比如,远程对象调用。 Remote Call就是为此而生, 虽然初期其只应用在真正的两台主机间的远程调用,但目前,其思想已经应用在了任何非本地的服务调用中,比如,同一机器的两个不同进程间,同一机器的两个CPU间,两个机器的两个进程间。这是由于,其一致的解决框架可以屏蔽底层媒介(Inter Process, Inter Processor, Inter Machine)的差异性。 目前最典型的远程对象调用机制主要有 序列化对象(比如RMI) 和  基于远程代理的对象请求(如CORBA)

序列化对象方式

这种方式主要能够完成简单的单次对象远程传递。 将待传递的对象内存空间进行序列化,然后将序列化数据经过底层传输机制(IPC或者网络等)传递到目标进程内,然后在目标进程内进行反序列化,在内存中生成对象。

基于代理的对象调用方式

这种方式主要基于远程代理设计模式,适合长时间的面向连接的直接对象方法调用。基本思想是在Client端和Server端都增加一个代理(客户端称之为Stud,Server端称之为skeleton),调用请求由Stub封装并基于底层传输机制(IPC或者网络等)传送到skeleton,skeleton解封装后,调用Server的方法,然后再反方向返回。 这种方式,可以使得Client对于远程对象的范围,就如同本地对象一样。

IDL

IDL的伟大之处不是发明了一种新的描述语言,而是解决了异构系统间的远程通信,同时也给出了一个参考的模型(基于远程代理的模型)。一般的平台,当对于远程对象调用的方式基于代理模型实现时,一般都允许开发者为Server写一个IDL的描述,描述Server支持的接口服务,同时,平台会提供一个特殊的xidl工具,如微软的midl,高通的qidl,java的jidl,android的aidl等,主要的作用是,将通用的idl描述语言,翻译成特定的编程语言的接口定义(如C,Java,C++等),同时,自动生成相应的Stub,skeleton的参考代码,该代码的实现与具体的平台绑定,以利用特定的底层传输机制来实现远程访问。 比如,jidl生成的Stub,skeleton中,应该就是使用基于网络的远程对象访问。 而aidl生成的Stub,skeleton中,就是利用Android的IPC机制来完成Stub与skeleton间的通信。

BMP,android中的应用

BMP中的远程对象调用仅使用了基于Stub,skeleton的代理模型,并没有利用序列化对象的方式。 BMP提供QIDL工具,允许开发者为支持远程调用的Service组件写一个IDL的接口描述文件,然后利用QIDL自动生成特定于BMP平台的Stub,skeleton代码。 此后,Client使用远程对象时是完全透明的,完全和使用本地对象的方式一致。

Android中使用了远程代理的方式。 Activity,Service间的Intent传递,Service的远程调用,都使用了远程代理的方式,允许开发者为支持远程调用的Service组件写一个IDL的接口描述文件,然后利用AIDL自动生成特定于Android平台的Stub,skeleton代码(内部其实利用了IPC)。 此后,Client使用远程对象时是完全透明的,完全和使用本地对象的方式一致。

IPC(进程间通信),Remote Call(远程调用),IDL(接口描述语言)架构及其在BMP(BREW移动平台),Android中的应用浅析相关推荐

  1. Android服务函数远程调用源码分析

    在Android服务查询完整过程源码分析中介绍了客户进程向ServiceManager进程查询服务的完整过程,ServiceManager进程根据服务名称在自身维护的服务链表中查找ServiceMan ...

  2. 分布式系统架构的远程调用(RESTFul、RPC)和CAP原理

    文章目录 分布式系统的远程调用 RestFul接口 RPC协议 RestFul和RPC的区别 分布式系统的CAP原理 分布式系统的远程调用 在微服务架构中,通常存在多个服务之间的远程调用的需求.远程调 ...

  3. 【转】DCOM远程调用权限设置

    原文:https://blog.csdn.net/ervinsas/article/details/36424127 最近几天被搞得焦头烂额,由于DCOM客户端程序是在32位系统下开发的,调试时DCO ...

  4. 架构设计:远程调用服务架构设计及zookeeper技术详解(下篇)

    一.下篇开头的废话 终于开写下篇了,这也是我写远程调用框架的第三篇文章,前两篇都被博客园作为[编辑推荐]的文章,很兴奋哦,嘿嘿~~~~,本人是个很臭美的人,一定得要截图为证: 今天是2014年的第一天 ...

  5. SOA架构/测试阶段接口描述语言转换方案

    SOA架构盛行 随着汽车新四化的推进,汽车整车厂在实现车辆网联.自动驾驶和数据驱动的同时,更要在满足用户体验和基本服务的基础上快速响应客户的个性化需求,为更好地解决这些新的挑战,整车厂引入了高性能的芯 ...

  6. 安卓beforetextchanged_【已解决】Android中给EditText添加的TextWatcher中的onTextChanged始终被调用(被执行多次)...

    [问题] Android中,给一个EditText添加了TextWatcher,其中实现了onTextChanged, 但是出现个问题: 对于EditText,只修改了一次(比如用删除键删除一个字符) ...

  7. 【Android Binder 系统】一、Binder 系统核心 ( IPC 进程间通信 | RPC 远程调用 )

    文章目录 一.Binder 系统两个核心 二.IPC 进程间通信 三.RPC 远程过程调用 一.Binder 系统两个核心 Binder 系统 最重要的两个核心是 IPC 和 RPC ; IPC ( ...

  8. RCF--RPC(远程调用框架)

    RPC(远程调用框架) 一. RPC定义 RPC(Remote Procedure Call Protocol)--远程过程调用协议,是一种通过网络从远程计算机请求服务,就像调用本地方法一样,不需要了 ...

  9. IPC进程间通信 D-Bus(Desktop Bus)快速入门(以libdbus-glib库为例)

    文章目录 一.D-Bus简介 1.D-Bus简介 2.不同IPC通信方式比较 3.D-Bus特性 二.D-Bus架构 2.D-Bus接口层 3.D-Bus总线层 测试demo 4.D-Bus封装层 三 ...

最新文章

  1. 文件中数组的最大值及其对应的最小下标
  2. 【深度学习】新的深度学习优化器探索(协同优化)
  3. c/c++如何正确使用结构体?
  4. php使用Header函数,PHP_AUTH_PW和PHP_AUTH_USER做用户验证及缺点
  5. rtmp服务器_nginx+windwos 搭建 rtmp 流媒体服务器
  6. 单元测试02:Open-Cover安装与使用
  7. linux下解析域名
  8. MessageDAL
  9. python 自动补全函数括号_三分钟,让你弄清楚Python中函数的括号使用
  10. idea 运行jmeter源码_JMeter知识系列(2)JMeter连接MongoDB
  11. Quartus II 15详细安装教程
  12. java安装后怎么打开_java安装后怎么打开教程
  13. HTML5 canvas元素绘制花朵等
  14. 第十届“中国电机工程学会杯”全国大学生电工数学建模竞赛 B 题 全面二孩政策对我国人口结构的影响
  15. LTP(Linux Test Project)使用指南
  16. Word文档封面填写打字时字体下方出现空格如何解决
  17. 【2023最新】Git安装配置教程
  18. 编译64位Detours(其他vs版本同理)
  19. 软件工程实践 2017 第一次作业
  20. 赛扬处理器_Intel 宣布8代Coffee Lake处理器停产,同时年末开始退役

热门文章

  1. 【精华】【学以致用】Django精华总结
  2. C# .net 3.5 32位app操作64位操作系统的注册表
  3. 10年,知乎为何依旧“赚钱难”?
  4. 用计算机桁架各杆内力,运用AUTO CAD求解桁架内力(转载)
  5. C/C++笔试题(12)
  6. IE浏览器打不开了...
  7. java毕业设计峨眉山景点介绍及旅游攻略推荐平台Mybatis+系统+数据库+调试部署
  8. java label 标签_Java标签(Label)
  9. “计算机的内存不足。请保存文件并关闭这些程序:xxx”解决方法
  10. Hook源码+插件化实现无闪烁换肤