一:为什么要使用Binder?
一个系统中存在很多很多进程,每个软件都有一个或以上多个进程,因为进程是相互隔离的,一个进程不能直接对另外一个进程直接进行操作,所以Android的进程是相互独立的,相互隔离的,而这个时候我们有业务需要进程相互通信,所以Binder由此产生了。
二:基本实现原理?
一个进程控件存在内核空间和用户空间,用户空间数据是不可以共享的,而内核空间是可以数据共享的,而所有进程都公用一个内核空间,举个例子:假设A,B两个进程,A需要向B发送数据,这个时候调用系统函数,把A进程的数据拷贝至内核空间中,然后再经过系统函数从内核空间拷贝至B进程中,完成一次跨进程通信。这是传统的跨进程通信原理,这样的缺点是效率低下:因为数据进行了2次拷贝:用户->系统->用户。
而Binder驱动的出现就是解决了这种效率低下的,采用了mmap内存映射原理。仅拷贝一次数据就可以完成进程通信。
三:内存映射
有关内存映射 推荐 阅读https://www.jianshu.com/p/719fc4758813
四:Binder驱动
定义:一种虚拟设备驱动
作用:链接Service,Client,ServiceManager的桥梁
具体实现:内存映射,调用了mmap()内存映射函数
实际用途:创建数据接收缓存空间,地址映射
实现流程:
1、Binder创建一块接收缓存地址
2、进行映射关系创建,Service进程空间地址和系统内核缓存区同时映射到一个共享数据接收缓存中,(这里的意思就是,只要内核缓存区里面有数据进来了,那么对应的进程空间地址也会有相同的数据)
3、Client调用copy_from_user()函数把数据拷贝至系统内核缓存区(数据拷贝一次)
4、由于存在映射关系,这个时候数据也同时可以理解为“发送”给Service进程进行相关处理,跨进程通信完成。
五:额外补充
Clien进程,Service进程,ServiceManager进程都是通过Binder驱动进行交互,并非直接进行交互,而ServiceManager进程和Binder驱动是Android系统进程已经实现好了的,而Client,Service进程是App应用层需要实现的相关逻辑。
网友评论