Android Binder 进程间通信简单理解(无源码解析)

为了加深对android中binder进程间通讯流程的记忆,这里记录一下自己对binder的理解思路。

首先Android中binder的进程间通讯其实可以类比java中线程间的通讯,只不过binder的进程间通讯多了一些约束而已。具体流程看下面;

与线程间通信类比

假设现在有线程Thread1和线程Thread2需要通讯,Thread1需要把一个数据data传递给Thread2那最简单的方法就是利用一个静态变量做一下中转,这里就把这个静态变量定为MiddleWare.temp,那具体流程就可以用下面这段伪代码来表示;

MiddleWare.temp = thread1.data;
thread2.data = MiddleWare.temp;

那么再进行如下类比

  • MiddleWare类比Binder驱动(Binder驱动可以简单的理解成内核中的一个应用)
  • Thread1类比进程1
  • Thread2类比进程2

那上面伪代码中的两个流程就是Binder驱动进程间通信的核心逻辑了,是不是很简单。总结一下Binder的作用就是暂存一下数据并且交给另一方;

mmap的理解

Binder和其它进程间通讯手段有一个不同就是Binder可以实现一次copy来完成数据通信,这里继续通过上面那个类比来说明一下mmap的原理;

普通跨进程通信两次拷贝方案

上面的例子中通过类比了解了Binder(也就是例子中的MiddleWare)的角色,说白了其实就是一个中转站,而Thread1Thread2则是真正通信的对象。但是这里类比中有一个关键的地方线程和进程是不同的;就是进程之间的内存是不共享的;

这里先补充2个背景知识:

  1. Linux内存分布:Linux内存分为内核区用户区的,我们一般的进程(如app应用)都是跑在用户区的,而一些系统进程(如Binder驱动)则是跑在内核区的;
  2. 内核区和用户区区别:这里只要明白内核区是可以访问(通过Copy)用户区的数据,用户区是无法访问内核区的数据就可以了;当然用户区的不同进程自然不可以互相访问数据,不然要搞出一个Binder有啥用;

这里对内核区用户区做一个简单的总结:Binder所在的内存区域权限最高,Binder可以拿到进程1的数据也可以拿到进程2的数据,同理也可以把数据给进程1和进程2,而进程1和进程2拿不到Binder所在内存的数据,进程1和进程2的数据是互相不共享的;

继续上面用线程来类比,那现在的情况就是这样的:

  • MiddleWare独自在一个线程;
  • Thread1在自己的线程1;
  • Thread2在自己的线程2;
  • MiddleWare需要通过数据Copy来获取或赋予Thread1``Thread2的数据

那具体流程就变成了下面这段伪代码:

MiddleWare.temp.copyFrom(thread1.data);
MiddleWare.temp.copyTo(thread2.data);

这里就是一般的跨进程通信的核心流程了,而从上面分析可以看出一般跨进程通信需要对数据进行两次Copy

mmap数据的一次拷贝

Android为什么用Binder作为跨进程通信的手段自然是因为Binder的高性能了,Binder通过mmap来将两次Copy优化至一次Copy;

mmap是什么?mmap的全称为MemoryMap也就是内存映射,简单的说可以把内核区也就是Binder所在的内存空间中的内存映射到用户区,这样用户区拿这部分数据就可以不用Copy了。

mmap既然可以直接映射内存把内核区的映射到用户区那假如按照如下方案:


mmap_error.png

如图按照上图的做法是不是只要两次映射,都不需要Copy就完成数据的传输也就是跨进程的通讯了?这里我一开始也是这样想的,但事实不是这样的;

这里有一点需要注意,就是mmap内存映射后,用户区的数据要到内核区还是需要通过Copy才能完成的,而用户区获取数据则可以直接通过mmap内存映射读取内核区的数据,不再需要再经过Copy(好像还需要一次浅拷贝,替换一下内核区的引用?)

那继续就上面这个类比的例子目前经过mmap优化过以后的伪代码就是这样的:

//把Thread1的数据 从用户区Copy到 Thread2在MiddleWare中
//的映射区域MiddleWare.thread2MapData中去
MiddleWare.thread2MapData.copyFrom(thread1.data);

//Thread2通过mmap内存映射获取对应映射区
//域MiddleWare.thread2MapData的数据
thread2.data = MiddleWare.thread2MapData;

这里再附上一个图帮助理解


binder_mmp.png

(Thread MiddleWare的类比关系应该不用在说了吧)

这里就可以清楚的看到Binder中mmap是怎么通过一次Copy来完成数据的传输的;
至于Binder的C/S架构谁是Client谁是Server,在当前的例子中自然是Thread1(进程1)是Client,Thread2(进程2)是服务端了。当然这个角色都是会发生变化的,比如Thread1发送数据后Thread2处理完数据要把结果返回给Thread1,那此时Thread2就是Client端,Thread1就是Server端了。这里不变的依据就是谁接受数据并且处理数据谁就是Server端,谁发送数据谁就是Client端;

上面就是我自己对Binder通信流程的一部分理解和总结了,通过线程间通讯来类比也是为了方便记忆。当然这里还没有完,这里还有几个疑问:

  1. 进程1是如何找到进程2的,或者说找到进程2在内核区映射的内存地址?
  2. 相对于Native层Framework层Binder的架构又是怎样的?
  3. Binder看起来很虚,那我们平时要怎么用Binder这个东西?(AIDL?它的实质是什么)

上面这些疑问我后面会陆续整理的,至于BpBinder、BBinder、BinderProxy、IBinder这些乱七八糟的也都是为了完成这个架构而提出的,有时间会再整理说明。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容