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. 导入 theano 失败。“cannot import name gof”

    按照网上教程安装好了 theano 之后,import theano 出现错误."cannot import name gof".网上找了很多教程,都不可行.最后找到如下教程.亲测 ...

  2. Multimodal —— 看图说话(Image Caption)任务的论文笔记(一)评价指标和NIC模型

    看图说话(Image Caption)任务是结合CV和NLP两个领域的一种比较综合的任务,Image Caption模型的输入是一幅图像,输出是对该幅图像进行描述的一段文字.这项任务要求模型可以识别图 ...

  3. 【SpringMVC】使用SpringMVC进行上传文件!

    写在前面: 之前在上传文件的时候,使用的是commons-file-upload这个插件,非常方便,能控制每个文件的大小,总共大小,缓存,以及支持多个文件的同时上传,但是写一次上传文件的后台代码量太大 ...

  4. (转)java for循环的执行顺序和几种常用写法

    算是温习吧.问题比较基础,但是也比较重要.(虽然是C,但是很经典) for循环可以说在每个程序中都少不了的,语句头包括三个部分:初始化,判读条件,一个表达式. 但是这三个部分的执行顺序是什么,这是我们 ...

  5. 【ES6】变量的解构赋值

    1. 数组 var [a, b, c] = [1, 2, 3]; let [a, [b], d] = [1, [2, 3], 4]; 默认值生效的条件是,对象的属性值严格等于undefined. [x ...

  6. 【HTML】dl dt dd

    摘要 看到没怎么使用过的html 标签,记录下 定义 dl 类似于 ul ,无任何样式,自定义列表容器, ul 为无序列表容器,ol 为有序列表容器 dt dd 类似于 li ,无任何样式,为帮助实现 ...

  7. Android与NativeC传递数据不正确问题

    操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Android studio 2.3.3 这两天一直在调试一个BUG,具体为通过 NativeC 来处理上层Android ...

  8. 微信小程序开发-新闻列表之新闻列表绑定

    微信小程序开发-新闻列表之新闻列表绑定开发教程: 1.效果图预览 2.准备工作 在拿到效果图后不要先急着去写代码,而是要去分析一下页面的整体结构,用什么方式定位和布局.小程序里建议使用flex布局,因 ...

  9. 自定义Git之使用centos搭建git 服务器

    Github 公开的项目是免费的,但是如果你不想让其他人看到你的项目就需要收费. 这时我们就需要自己搭建一台Git服务器作为私有仓库使用. 接下来我们将以 Centos 为例搭建 Git 服务器. 1 ...

  10. JSR-303 Bean Validation 介绍及 Spring MVC 服务端参数验证最佳实践

    任何时候,当要处理一个应用程序的业务逻辑,数据校验是你必须要考虑和面对的事情. 应用程序必须通过某种手段来确保输入参数在上下文来说是正确的. 分层的应用很多时候同样的数据验证逻辑会出现在不同的层,这样 ...