1.进程间通讯的原因

目前操作系统都使用虚拟存储技术,管理内存。

假设是32位机器,0-3G是用户空间,3-4G是系统使用。虚拟内存和逻辑内存都按4K分页。这样虚拟内存和逻辑内存就存在对应关系。

一个进程只能操作自己的内存,无法直接访问其他的进程的物理页。

系统进程可以访问所有的物理应用空间。

进程通讯的本质是数据段交互。

2.进程间通讯的方式

操作系统提供一种共享内存的方式来进行通讯。

可以把2个进程的一块虚拟内存,映射为同一个物理地址,这样数据就可以交互,但是不同进程需要自己控制读写,管理起来很麻烦。

还有一种方式就是,共享同一块kernel内存,这样,通过这块kernel可以交互数据,于是我们把kernel当作数据交互的媒介。

3.用户和内核空间的通讯

  1.系统调用:系统调用是内核提供给应用程序的接口。应用对底层硬件的操作大部分都是通过系统来完成的。

  2.netlink,使用socket API就可以进行。

  3.Procfs:是比较老的一种交互方式。

  4.Sysctl:是一种用户应用来设置和获得运行时的内核配置参数的一种有效方式。

4.Android 进程间通信---binder

  Why Binder?

  常见的Linux的进程间通信机制。

  1. 管道:在创建时分配一个page大小的内存,缓存区大小比较有限;
  2. 消息队列:信息复制两次,额外的CPU消耗;不合适频繁或信息量大的通信;
  3. 共享内存:无须复制,共享缓冲区直接付附加到进程虚拟地址空间,速度快;但进程间的同步问题操作系统无法实现,必须各进程利用同步工具解决;
  4. 套接字:作为更通用的接口,传输效率低,主要用于不通机器或跨网络的通信;
  5. 信号量:常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
  6. 信号: 不适用于信息交换,更适用于进程中断控制,比如非法内存访问,杀死某个进程等;

  Android内核也是基于Linux的,难道那么多的linux社区优秀工程师没有想到binder这样一个优秀的系统吗?事实并非如此。

  五个方面阐述android 使用binder机制原因。

  1.数据拷贝:binder机制只要一次copy,其他机制需要2次copy,只有共享内存不需要copy内存。

  2.稳定性:binder使用经典的C/S架构,client 和Server端相对独立,稳定性好。而共享内存实现方式复杂,同步方式系统不支持,需要自己开发。

  3.安全性:linux的IPC机制,是无法指导UID/PID的。从而无法鉴别身份。Android为每个app分配UID。binder基于C/S架构,当client端连接server端的时候,server端回check权限,在android手机上,就会弹出权限确认的框。

  4.语言层面:linux是基于C语言的,而andriod是基于面向对象的。binder恰恰是面向对象的,将进程间通信,转化为对另一个进程对象的引用。其独特之处,就是binder对象作为一个可以跨进程引用的对象,它的实体位于一个进程中,而它的引用遍布于各个进程中,大家使用同一个进度对象,就像面向对象的类一样,可以供各个系统使用。binder弱化了进程间通信概念,使得调用就像同一个进程一样。这就把进程间的通信演化为面向对象类的调用,所以binder是为android量身定制的。

  5.公司战略考虑。 linux是GPL协议,Google巧妙的把这个协议围在内核层,使得用户层,手机厂商使用Apache-2.0协议,保护了厂商的利益。

  

  一般来说,添加一个IPC机制,需要修改kernel代码,需要liunx分配新的系统编号。所以一般采用虚拟设备的方式,以驱动模块的方式,完成需要在内核完成的功能。

  一般设计可以建立一个伪设备来作为应用与内核之间进行数据交换的渠道。最常用的做法是使用伪字符设备,然后通过icotl,mmap,open,read,write,close这些标准的系统调用和这个设备交互。

  IPC(inter-process communication)概述:

  所有的IPC本质上都是类似的,就是把client端的数据,通过内核空间,传递到另外一个进程Server端。

  

  Binder IPC原理:

  Binder回多一个ServiceManager(c++层)来管理所有的server端。所以server端都需要注册到smgr,而client端就需要从smgr获取server端的IBinder对象。

  

  图中的Client,Server,ServiceManager都是通过binder机制进行通信的,所有也就有Client端 & Server端。

  注册服务:Server 进程要先进行 注册到Smgr,该过程,Server是客户端,Smgr是服务端。(注册的是什么?)

  获取服务:Client 进程要获取Server,需要获取相应的service。(获取的是什么?)该过程:Client端是客户端,Smgr是服务端。

  使用服务:Client端得到与Server的信息,建立与Server的通路。这样Client就可以和Server进行通信。

  C/S模式:

  BpBinder:  BpBinder,transact,发送事物信息。

  BbBinder:  BbBinder,onTransact,接收事物信息。

参考文献:

http://gityuan.com/2015/10/31/binder-prepare/          

Android binder机制---概述的更多相关文章

  1. Android广播机制概述

    1.Android广播机制概述 Android广播分为两个方面:广播发送者和广播接收者,通常情况下,BroadcastReceiver指的就是广播接收者(广播接收器).广播作为Android组件间的通 ...

  2. 【转】Android - Binder机制

    以下几篇文章是分析binder机制里讲得还算清楚的 目录 1. Android - Binder机制 - ServiceManager 2. Android - Binder机制 - 普通servic ...

  3. Android Binder机制彻底梳理二

    根据AIDL了解整体调用流程[重点分析AIDL流程]: 在上一次https://www.cnblogs.com/webor2006/p/11741743.html中我们已经对Android Binde ...

  4. 浅谈android binder机制

    binder机制 是谷歌优化在android上更适合终端的IPC(多进程通信方式),满足系统对通信方式,传输性能和安全性的要求. 特性: 1. 用驱动程序来推进进程间的通信.2. 通过共享内存来提高性 ...

  5. Android Binder机制简单了解

    Binder -- 一种进程间通信(IPC)机制, 基于OpenBinder来实现 毫无疑问, 老罗的文章是不得不看的 Android进程间通信(IPC)机制Binder简要介绍和学习计划 浅谈Ser ...

  6. android binder机制之——(创建binder服务)

      Binder机制编程 前面的几篇文章具体介绍了android中binder机制的方方面面,相信你对binder机制已经有了较深刻的理解.俗话说得好"学以致用",以下我们就通过在 ...

  7. Android Binder机制详解:手写IPC通信

    想要掌握一样东西,最好的方式就是阅读理解它的源码.想要掌握Android Binder,最好的方式就是写一个AIDL文件,然后查看其生成的代码.本文的思路也是来自于此. 简介 Binder是Andro ...

  8. android binder机制详解

    摘要 Binder是android中一个很重要且很复杂的概念,它在系统的整体运作中发挥着极其重要的作用,不过本文并不打算从深层次分析Binder机制,有两点原因:1是目前网上已经有2篇很好的文章了,2 ...

  9. ANDROID BINDER机制浅析

    Binder是Android上一种IPC机制,重要且较难理解.由于Linux上标准IPC在灵活和可靠性存在一定不足,Google基于OpenBinder的设计和构想实现了Binder. 本文只简单介绍 ...

随机推荐

  1. ABP从入门到精通(1):aspnet-zero-core项目启动及各项目源码说明

    一.ABP的简单介绍 ABP是"ASP.NET Boilerplate Project (ASP.NET样板项目)"的简称. ASP.NET Boilerplate是一个用最佳实践 ...

  2. Spring源码情操陶冶-AbstractApplicationContext#obtainFreshBeanFactory

    前言-阅读源码有利于陶冶情操,本文承接前文Spring源码情操陶冶-AbstractApplicationContext 约束: 本文指定contextClass为默认的XmlWebApplicati ...

  3. 【设计模式】Bridge模式(桥接模式)

    最近的一次面试中,被问到桥接模式,以前呢并没有很仔细的研究过这个设计模式,借此机会剖析一下. 先给出自己对这个模式理解后的源码: interface A{ void methodA(); } inte ...

  4. dubbo源码分析(二):超时原理以及应用场景

    dubbo超时原理以及应用场景 *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: ...

  5. Unity 发布的 WenGL 使用SendMessage传递多个参数

    如果要实现Unity与浏览器的数据交互一般都会采用两种方式 方法一: Application.ExternalCall("SayHello","helloworld&qu ...

  6. NYOJ--86--set.find()--找球号(一)

    /* Name: NYOJ--86--找球号(一) Date: 20/04/17 14:45 Description: 理想很美好,现实很残酷,准备用字符串水过,结果TLE了 ╮(╯▽╰)╭ */ # ...

  7. Springboot+redis 整合

    运行环境: JDK1.7. SpringBoot1.4.7 redis3.0.4 1.生成Springboot项目,分别添加web,redis依赖,具体的maven依赖如下 <dependenc ...

  8. k-means算法概述

    算法过程: 随机选取K个种子点 求所有点到种子点的距离,将点纳入距离最近的种子点群 所有点均被纳入群内后,将种子点移动到种子群中心 重复上述2.3过程,直至种子点没有移动 优缺点: 优点:容易实现 缺 ...

  9. C++11 中值得关注的几大变化(网摘)

    C++11 中值得关注的几大变化(详解) 原文出处:[陈皓 coolshell] 源文章来自前C++标准委员会的 Danny Kalev 的 The Biggest Changes in C++11 ...

  10. vue插件编写与实战

    关于 微信公众号:前端呼啦圈(Love-FED) 我的博客:劳卜的博客 知乎专栏:前端呼啦圈 前言 热爱vue开发的同学肯定知道awesome-vue 这个github地址,里面包含了数以千计的vue ...