Android binder机制---概述
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机制---概述的更多相关文章
- Android广播机制概述
1.Android广播机制概述 Android广播分为两个方面:广播发送者和广播接收者,通常情况下,BroadcastReceiver指的就是广播接收者(广播接收器).广播作为Android组件间的通 ...
- 【转】Android - Binder机制
以下几篇文章是分析binder机制里讲得还算清楚的 目录 1. Android - Binder机制 - ServiceManager 2. Android - Binder机制 - 普通servic ...
- Android Binder机制彻底梳理二
根据AIDL了解整体调用流程[重点分析AIDL流程]: 在上一次https://www.cnblogs.com/webor2006/p/11741743.html中我们已经对Android Binde ...
- 浅谈android binder机制
binder机制 是谷歌优化在android上更适合终端的IPC(多进程通信方式),满足系统对通信方式,传输性能和安全性的要求. 特性: 1. 用驱动程序来推进进程间的通信.2. 通过共享内存来提高性 ...
- Android Binder机制简单了解
Binder -- 一种进程间通信(IPC)机制, 基于OpenBinder来实现 毫无疑问, 老罗的文章是不得不看的 Android进程间通信(IPC)机制Binder简要介绍和学习计划 浅谈Ser ...
- android binder机制之——(创建binder服务)
Binder机制编程 前面的几篇文章具体介绍了android中binder机制的方方面面,相信你对binder机制已经有了较深刻的理解.俗话说得好"学以致用",以下我们就通过在 ...
- Android Binder机制详解:手写IPC通信
想要掌握一样东西,最好的方式就是阅读理解它的源码.想要掌握Android Binder,最好的方式就是写一个AIDL文件,然后查看其生成的代码.本文的思路也是来自于此. 简介 Binder是Andro ...
- android binder机制详解
摘要 Binder是android中一个很重要且很复杂的概念,它在系统的整体运作中发挥着极其重要的作用,不过本文并不打算从深层次分析Binder机制,有两点原因:1是目前网上已经有2篇很好的文章了,2 ...
- ANDROID BINDER机制浅析
Binder是Android上一种IPC机制,重要且较难理解.由于Linux上标准IPC在灵活和可靠性存在一定不足,Google基于OpenBinder的设计和构想实现了Binder. 本文只简单介绍 ...
随机推荐
- 可存放任意类型变量的动态数组--C语言实现
之前在训练营的时候被要求用C语言实现一个可以存放任意类型数据的栈.现在尝试实现一个数组版本. 首先用到的结构体如下(接触了Win32编程所以长得有点像里面的那些类型): typedef struct ...
- 【mysql】常用操作
2.mysql service mysql status mysql --version mysql -h 服务器主机地址 -u 用户名 -p 用户密码 exit 退出 mysql -h 主机名 - ...
- python2.7 + selenium3.4.3浏览器的选择
大家都知道,selenium2对火狐浏览器兼容性比较好,和谷歌和IE相比,好处是无需安装相应的driver.exe来支持启动浏览器,但是缺点是最高支持火狐47版本. 现在selenium3出来了,是不 ...
- Filter ,Interceptor,AOP
一.Filter: Filter也称之为过滤器,它是Servlet技术中比较激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态 ...
- 微服务(二)hystrix
特性 1.延迟和失败容忍 防止级联错误,错误回退,优雅降级.快速失败和恢复 线程和信号量隔离 2.实时监控和配置更改 3.并发 并行执行,请求缓存,自动批处理失败请求 总运行流程 当你发出请求后,hy ...
- 记Angular与Django REST框架的一次合作(2):前端组件化——Angular
注:这是这个系列的第二部分,主要集中在Angular的使用方面.之前使用过AngularJS(Angular 1.x),混在Django的模板中使用,这些页面一般完全是结果展示页.在有Django表单 ...
- 6.linux下部署 web 项目
安装java 1.下载 linux 环境的jdk 2.上传该压缩包到 linux 系统中并且解压 tar -zxvf 压缩包名 3.配置环境变量并且刷新配置 export JAVA_HOME=/ali ...
- python之禅 the zen of python
>>> import this The Zen of Python, by Tim Peters Beautiful is better than ugly. Explicit is ...
- C#使用Xamarin开发可移植移动应用(3.Xamarin.Views控件)附源码
前言 系列目录 C#使用Xamarin开发可移植移动应用目录 源码地址:https://github.com/l2999019/DemoApp 可以Star一下,随意 - - 说点什么.. .NET ...
- 升级项目到.NET Core 2.0,在Linux上安装Docker,并成功部署
概述 容器,顾名思义是用来存放并容纳东西的器皿: 而容器技术伴着Docker的兴起也渐渐的映入大家的眼帘,它是一个抽象的概念,同时也是默默存在世上多年的技术,不仅能使应用程序间完全的隔离,而且还能在共 ...