Binder-基础知识

一、什么是Binder

Binder是Android系统中用于进程间通信的一种方式
因为Binder的效率很高,所以Android中虽然也有其他的IPC方式,但是大多都是采用的Binder

二、为什么Binder效率高

传统的IPC通信方式传输数据有以下过程:
1.client准备数据
2.client进程复制数据到驱动中(copy_from_usr)
3.server进程从驱动中取出数据(copy_to_usr)

而Binder传输数据则是:
0.server进程初始化Binder时打开Binder驱动,进行mmap映射一片内核空间内存
1.client准备数据
2.client通过Binder驱动直接将数据拷贝(copy_from_usr)到server映射的内核空间中去
3.client将数据头拷贝到驱动中,server从驱动中读出数据头
4.server进程可以直接在用户态读取映射内存中的数据

由此可见,传统的IPC通信方式,数据本身需要在内核与用户态之间拷贝两次,而Binder只需要在内核与用户态之间拷贝一次,所以Binder效率会更高(Binder通信中,数据头是client用来告诉server数据的大小以及地址,这个数据头是需要拷贝两次的).

三、Binder的组成结构

Binder采用了C/S架构,但由于用户层进程间内存是独立的,所以需要通过内核驱动来传输数据,就有了binder驱动,同时,为了管理当前系统中的service,就又有了servicemanager。
所以从组件的角度来看,Binder由四个部分组成:

  • client:向server发送数据的进程
  • server:client数据的目标进程,接收client进程数据的进程
  • servicemanager:一个运行在用户态的进程,提供注册,查询服务的功能,client需要先通过servicemanager查询server进程是否注册,才 能发起传输
  • binder驱动:运行与内核态的驱动,提供binder的底层支持

![Binder组成结构](https://img-blog.csdnimg.cn/20201010155700272.png#pic_center

四、Binder运行机制

在这里插入图片描述

service manager

(1)打开binder驱动
(2)告诉binder驱动这个进程是service manager
(3)进入一个while循环,一直轮询binder驱动,查看是否有需要处理的消息(注册service,查找service等)
(4)如果有需要处理的消息,则进行处理并发送reply给binder驱动

server端

(1)打开binder驱动
(2)向service manager发送数据,注册服务
(3)进入while循环,一直轮询binder驱动,查看是否有需要处理的消息
(4)如果有client发送数据过来,则进行处理

client端

(1)打开binder驱动
(2)向service manager发送数据,查询目标服务是否已经注册
(3)如果目标service已经注册,servicemanager会返回一个目标service的handle给client
(4)client根据handle向binder驱动发送数据给server端

可以看到service manager其实是起了一个管理service的功能,client要向一个service发送数据,则需要先向service manager查询这个service是否已经注册,如果已经注册,service manager则会返回一个handle给client,client拿着这个handle就可以向binder驱动传输数据到指定的目标service进程.

service和server

server就是提供service的进程,一个应用程序,可以注册很多service,这个应用程序就是一个server,是service的提供者。
而service则是被注册到service manager中的各种service,client可以向不同的service发送数据,server中也会有不同的函数用来处理不同的service的数据。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值