Binder理论基础(一)------通信结构与通信模型

引言

​ Android的IPC采用的C/S架构,这样的话各个进程可以去实现自己的功能,若需要使用自己未实现但其他进程实现了的功能,则可以很方便的作为调用客户端去访问实现该功能的服务端从而使用其对应功能。例如,要使用视频,音频等功能只需作为客户端去访问实现视频,音频功能接口的进程服务端,然后调用服务端的对应接口方法即可。

为什么是Binder

​ 由于Android是基于Linux系统开发的操作系统,所以Linux的固有的IPC方式,在Android上也是适用的,但要达到上述的C/S架构模式,只有Socket套接字才行,但是Socket的传输性能较差,通常用于低频的IPC通信,所以在Android上实现了一套Binder机制用于在Android上进行IPC通信。

​ 那么Binder为何被选中作为Android的IPC机制呢?上述说到,Linux原本支持的IPC中只有Socket采用的是C/S架构,但性能不好,这当然是原因之一。说到性能的话,我们从传输性能,安全性能方面说起。

传输性能

​ 由于Linux对于进程有着沙盒机制,即每个进程被“沙盒”封装起来,进程间彼此独立,这样当一个进程崩溃的话,其他进程仍可以正常运行,系统仍能正常运行。但有时需要进程间传递数据,进行通信,那么就提供了一系列的IPC方式,如:管道,共享内存,消息队列,信号量和Socket。

​ 但由于进程间通信都需要经过Linux内核,在内核中直接进行通信,所以就涉及到进程将数据拷贝到Linux内核的操作。除共享内存外,其余方式都至少需要拷贝2次(进程用户空间拷贝至内核空间,再从内核空间拷贝至目标进程的用户空间,共享内存无需拷贝)。详情可见下表:

IPC方式 拷贝次数
共享内存 0
Binder 1
管道/消息队列/信号量/Socket 2

为什么Binder只需一次呢?因为Binder在Linux内核空间独立出了一块区域,可直接读取服务端数据,只需要客户端将数据拷贝至此处即可。

​ 由上可看到,传输次数减少了,带来的资源消耗就少了,从而加大了传输性能。

简述之:Binder相对而言减少了数据拷贝次数达到提高传输性能的目的。

安全性能

​ 那么,为什么Binder更具安全性呢?纵观其他的IPC方式,我们无法得知进行通信的端口是否合法(满足要求),即无论是谁,只要搭上了这条链路,即可进行数据交换。然而,Binder对每个进程都分配了UID/PID,当通过Binder进行IPC时,系统会去核对UID/PID是否合法,只要系统认为合法的PID,才能搭上Binder的车。如此,在IPC上增加一道关卡,保障IPC通信安全,所以相对其他IPC方式更具安全性。

简述之:Binder通过UID/PID来保证通信双方的合法性,进而达到IPC间消息传输的安全性。

Binder通信模型

​ 说到通信模型,主要是通信的组成成员和其架构模式。架构上文已说到,采用的C/S架构,那么这里主要说说组成成员。

​ Binder的组成成员共有四员大将:ServerClientServiceManagerBinder驱动。

Binder驱动

​ Binder驱动,虽然叫驱动,但并不是真正的硬件驱动,而只是实现了驱动效果的一套代码而已。并且它运行在内核区,因此它是真正达到IPC效果的地方。

​ 上述说到,它实现了驱动效果,即实现驱动的一些方法如epoll()什么的。使用起来和真正的操作驱动并未差别。

Server和Server中的Binder

​ Server作为Binder架构中服务端,是提供功能的一端,通过Binder暴露功能调用接口给外部,任何进程拿到其Binder,即可通过Binder调用功能接口去调用功能。在Server中,Binder是以实体存在。外部或得的是Binder实体的引用,可以说指针或句柄,都是一个意思,因为是Android开发者,说引用的话比较好理解。

Client和Client中的Binder

​ Client作为Binder架构中的客户端,是调用功能的一端,其拿到的Binder并非是Binder实体,而是指向该Binder实体的引用。

ServiceManager和ServiceManager中的Binder

​ ServiceManager是类似于DNS的存在,存储了Binder名称和Binder实体的对应关系表。类似于域名和IP的对应关系。当有新的Service时,需要向ServiceManager进行注册,以便其他客户端想调用其功能时可以找到该Binder实体的引用。那么这必然是一次IPC过程,那么在还未搭建IPC桥梁的时候进行IPC必然是自相矛盾的,所以系统将ServiceManager的Binder实体的Binder引用干脆暴露出来,让所有进程都知道其Binder引用是什么,这样就可以直接进行注册。当新的Service向ServiceManager注册后,客户端调用时会在请求体中包含请求的Binder名称,ServiceManager会根据名称找到对应Binder的引用,然后告诉客户端,这样客户端就拿到服务端的Binder引用,然后就可以根据该引用去调用服务端的相关接口方法。

特别鸣谢

https://blog.csdn.net/universus/article/details/6211589 -------- Android Bander设计与实现 - 设计篇

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