Binder 笔记

最近重新复习Android Binder知识,以下为笔记内容,方便自己后序复习

Linux 进程的通信方式:

1. 管道:分一个page页的内存,传递消息,空间不足,需要复制两次
2. 共享内存: 分配一块空间作为共享空间,不需要复制,但是需要同步机制
3. socket: 套接字,效率低,需要复制两次
4. 信息队列: 需要复制一次进内核空间,再复制出用户空间,需要复制两次
5. 信号量: 资源互斥,锁机制
6. 信号: 一般作为中断控制,杀死进程等

binder

![binder][1]

为什么采用binder?

binder只需要复制一次数据到内核空间,只比共享内存多一次。
Linux的IPC机制无法获得进程的UID/PID等,所以无法鉴别身份。
Android为每个安装好的应用程序分配了自己的UID,故进程的UID是鉴别进程身份的重要标志。


binder功能

  1. 使用驱动进行进程通信
  2. 使用共享内存提高性能
  3. 为进程请求提供线程池处理
  4. 同步调用
  5. 面向对象的处理方式,对其他进程的通信操作转而对binder对象的引用的操作

原理

binder使用client-servier的模式

  1. client
  2. server
  3. binder驱动
  4. serviceManager

其中client和server、serviceManager是运行在用户空间,binder驱动是允许在内核空间。

binder驱动和设备驱动一样吗?

不一样,binder驱动只是内核空间的一段代码,负责在用户空间和内核控件来回搬运数据。

binder驱动的功能

  1. 负责建立binder节点对象
  2. 负责进程间传递binder对象
  3. 使用引用计数法
  4. 数据包在进程传递交互
  5. 建立和管理缓存空间

serviceManager

  1. 负责管理service系列,整个系统只有一个serviceManager进程,与
  2. 通过向binder驱动发送BINDER_SET_CONTEXT_MGR命令使其成为serviceManager,获得的句柄是0,binder建立一个结点(binder_node),addService()
  3. 进入无限的循环,等待client的请求
  4. 将client持有的字符形式的Binder名字转化成Client中对该Binder的引用,使得Client能够通过Binder名字获得对Server中Binder实体的引用

server

  1. 提供服务的server通过binder驱动,获取0号句柄,向serviceManager注册自己的binder实体和名字。
  2. Binder是一个实体位于Server中的对象

client

  1. Client利用0号引用向SMgr请求访问某个Binder
  2. Binder 在Client端的表述 – Binder引用

binder协议

binder协议主要通过icotl()函数来实现,命令+数据


binder缓存

  1. 由Binder驱动负责管理数据接收缓存,使用mmap()命令,映射
  2. 创建一个数据接收的缓存空间,mmap分配的内存是在数据的接收方上。
  3. binder驱动负责创建和管理缓存空间,使用最佳分配算法为数据包分配一个空间,而接收方只需要提供缓存来存放大小固定,可以预测的消息头。
  4. 由于mmap()分配的内存是映射在接收方用户空间里的,所有数据只做了一次从发送方用户空间到接收方用户空间的直接数据拷贝,省去了内核中暂存这个步骤,提升了一倍的性能。
  5. Linux内核实际上没有从一个用户空间到另一个用户空间直接拷贝的函数,需要先用copy_from_user()拷贝到内核空间,再用copy_to_user()拷贝到另一个用户空间。为了实现用户空间到用户空间的拷贝,mmap()分配的内存除了映射进了接收方进程里,还映射进了内核空间。

binder线程管理

  1. 线程迁移: client端的线程A通过binder引用请求server端,server端会有一个线程B执行任务,执行完后会唤醒A,B相当于A代理执行任务,会将A的优先级付给B。
  2. server端:线程池

参考:
http://www.jianshu.com/p/6546a2ef0bca
https://www.zhihu.com/question/39440766
[1]: http://img.blog.csdn.net/20141126170909147?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGlubWlhbnNoZW5n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center

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

推荐阅读更多精彩内容