前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Binder跨进程通信的流程

Binder跨进程通信的流程

作者头像
码农帮派
发布2021-02-25 11:52:15
5380
发布2021-02-25 11:52:15
举报
文章被收录于专栏:码农帮派码农帮派

binder跨进程通信的流程

上图是一次binder调用的通信流程,Client是应用进程,Server是系统服务,应用进程通过binder调用请求系统服务,Client向binder驱动发送BC_Transaction指令,binder在收到该指令指令之后回向Client返回BR_Transaction_Complete指令,同时binder驱动会向系统服务发送BR_Transaction指令,并等待系统服务的处理,系统服务处理完成之后会向binder发送BC_Reply的回持,binder驱动在收到系统服务的回执之后,也会向系统服务发送BR_Transation_Complete的回执,同时向应用进程发送BR_Reply,将处理结果发送给应用进程。

我们可以看到Client在等待binder回执的过程中是处于休眠状态的,系统服务Server在处理binder驱动的指令以外的时间也是处于休眠状态的。

Binder机制启动的流程:

1. 打开binder驱动

2. 将binder驱动的描述符进行内存映射

3. 启动binder线程,为binder线程注册binder驱动,让binder线程进入Loop循环,并不断与binder驱动进行交互

Binder存在的意义

Binder是运行在驱动层的,没有用到Linux的IPC机制。Binder机制相比于Linux底层提供的IPC机制,有以下的一些优点:

  • 1. 性能:Linux系统中常用的IPC机制(管道、socket等)在进行跨进程通信的时候是需要内核做中转的,这就意味着两次数据拷贝,一次是从应用层拷贝到内核,一次是从内核拷贝到应用层;Binder则不一样,Binder是将一块物理内存同时映射到内核和目标进程的内存空间,当应用进程向这块物理内存写入数据的,内核和另外一个进程就可以直接读取到。
  • 2. 方便易用,Binder和共享内存的机制类似,避免了数据的两次拷贝,但是共享内存使用复杂
  • 3. 安全:普通的Linux跨进程通信方式是很不安全的,比如socket的IP地址等信息都是开放的,别人知道这个IP地址就可以进行链接了,又比如管道,别人只要知道管道的名称就可以向管道中写入数据,这种机制是很容易被别人利用的,这都是因为我们拿不到调用方可靠的身份信息。而Binder会在内核态为每个调用方添加可靠的身份信息,这样就大大提高了跨进程通信的安全性。

上面是系统服务的Binder通信架构,在Android中只有系统服务的Binder才能够注册到ServiceManager中,应用的Binder是无权限注册的。上图中Client是应用进程,Server是系统进程,所有的进程在启动的时候,首先都会启动Binder机制。Server启动之后就会将自己的Binder注册到Servicemanager中,ServiceManager启动之后就会进入Loop循环,等到其他进程的请求调用。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-02-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码农帮派 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档