「Android」 基于Binder通讯的C/S架构体系认知

  C/S架构(Client/Server,即客户机/服务器模式)分为客户机和服务器两层:第一层是在客户机系统上结合了表示与业务逻辑,第二层是经过网络结合了数据库服务器。简单的说就是第一层是用户表示层,第二层是数据库层。客户端和服务器直接相连,这两个组成部分都承担着重要的角色。数据库

 

  Android内核是基于Linux系统, 而Linux现存多种进程间IPC方式:管道, 消息队列, 共享内存, 套接字, 信号量, 信号。而Android用的是Binder来进行进程间通讯。服务器

  Binder是Android系统提供的一种IPC(进程间通讯)机制。对于Android系统,咱们基本上能够把它看作一个基于Binder通讯的C/S架构,Binder就像网络同样,把系统的各个部分链接在了一块儿,所以它是很是重要的。在Android系统的C/S架构中除了Client端和Server端外,还有一个全局的ServiceManager端,其做用是管理系统中的各类服务,三者的关系以下图:网络

  

  

一、Binder的通讯结构分为三层,以下图所示:

 

二、Server

Server的工做示意图以下:架构

下面是对上图的每一个步骤的解释(在SurfaceFlinger的入口main函数的时候分析过):函数

一、初始化processState:在初始化的过程当中咱们打开了binder虚拟设备,并使用mmap为其分配了内存,因为processState是一个用了单例模式实现的类,所以每一个进程只会打开设备一次;
二、getDefaultServiceManager:顾名思义,获取ServiceManager。因为Server此时是做为客户端,所以获得了BpServiceManager,BpServiceManager中含有BpBinder,其传入的handle为0,表明ServiceManager的BBinder;
三、instantiate:使用BpServiceManager的addService方法注册服务,以字符串标识本身的服务;
四、startThreadPool:这是一个可选的操做,当系统认为服务可能较为繁忙时才会建立多个线程,会为每一个线程设置IPCThreadState(用于通讯),建立完后调用joinThreadPool
五、joinThreadPool:把当前线程加入线程池中,监听来自客户端的请求并处理,获得请求后经过executeCommand方法来处理;
 oop

三、ServiceManager

ServiceManager的工做示意图以下:spa

ServiceManger的工做只有3步线程

binder_open:打开binder设备,与Server在processState初始化时进行的操做相似;
binder_become_contextt_manager:经过ioctl把本身的handle值设置为0,表明独一无二的Manager;
binder_loop:进入一个循环监听请求,并做出响应的处理;3d


注:不是全部Server进程都能往ServiceManager中注册服务的,只有root或system级别的进程才有注册服务的权限。但ServiceManager中还维护了一个allowed的白名单,上面注明了那些服务是容许被注册的,这些服务能够被任意Server进程注册。blog

 

四、Client

Client使用服务只须要分为两步就好:
  (1)经过defaultServiceManager方法获取ServiceManager;
  (2)经过ServiceManager的getService方法传入字符串获取相应的服务并操做;

相关文章
相关标签/搜索