在Linux系统中,是以进程为单位分配和管理资源的。出于保护机制,一个进程不能直接访问另一个进程的资源,也就是说,进程之间互相封闭。但是,在一个复杂的应用系统中,通常会使用多个相关的进程来共同完成一项任务,因此要求进程之间必须能够互相通信,从而共享资源和信息。所以,操作系统内核必须提供进程间的通信机制(IPC)。在Linux中,进程间的通信机制有很多种,例如可以采用命名管道(named pipe)、消息队列(message queue)、信号( signal)、共享内存(share memory)、socket等方式,它们都可以实现进程间的通信。但是,在Android终端上的应用软件的通信几乎看不到这些IPC通信方式,取而代之的是Binder方式。Android同时为Java环境和C/C++环境提供了Binder机制。本章主要介绍C/C++环境下的Binder机制,主要包括Binder驱动的实现、运作原理、IPC机制的实现、接口等.我们将详细讲解。

3.1 Binder概述

应用程序虽然是以独立的进程运行的,但相互之间还是需要通信,比如,在多进程的环境下,应用程序和后台服务通常会运行在不同的进程中,有着独立的地址空间,但是因为需要相互协作,彼此间又必须进行通信和数据共享,这就需要进程通信来完成。在Linux系统中,进程间通信的方式有socket、named pipe、message queue、signal、share memory等;Java系统中的进程间通信方式也有socket、narned pipe等,所以Android可以选择的进程间通信的方式也很多,但是它主要包括以下几种方式:

(1)标准Linux Kemel IPC接口

(2)标准D-BUS接口

(3)Binder接口

3.1.1  为什么选择Binder

在上面这些可供选择的方式中,Android使用得最多也最被认可的还是Binder机制。为什么会选择Binder来作为进程之间的通信机制呢?因为Binder更加简洁和快速,消耗的内存资源更小吗?不错,这些也正是Binder的优点。当然,也还有很多其他原因,比如传统的进程间通信可能会增加进程的开销,而且有进程过载和安全漏洞等方面的风险,Binder正好能解决和避免这些问题。Binder主要能提供以下一些功能:

(1)用驱动程序来推进进程间的通信。

3.1.2初识Binder

Binder是通过Linux的Binder Driver来实现的,Binder操作类似于线程迁移(thread migration),两个进程间通信看起来就像是一个进程进入另一个进程去执行代码,然后带着执行的结果返回。Binder的用户空间为每一个进程维护着一个可用的线程池,线程池用于处理到来的IPC以及执行进程的本地消息,Binder通信是同步的而不是异步的。同时,Binder机制是基于OpenBindero来实现的,是一个OpenBinder的Linux实现,Android系统的运行都将依赖Binder驱动。 Binder通信也是基于Service与Client的,所有需要IBinder通信的进程都必须创建一个IBinder接口。系统中有一个名为Service Manager的守护进程管理着系统中的各个服务,它负责监听是否有其他程序向其发送请求,如果有请求就响应,如果没有则继续监听等待。每个服务都要在Service Manager中注册,而请求服务的客户端则向Service Manager请求服务。在Android虚拟机启动之前,系统会先启动Service Manager进程,Service Manager就会打开Binder驱动,并通知Binder Kemel驱动程序,这个进程将作为System Service Manager,然后该进程将进入一个循环,等待处理来自其他进程的数据。因此,我们也可以将Binder的实现大致分为:Binder驱动、Service Manager、Service、Client这几个部分,在后面教程中分别对这几个部分进行详细分析。

最新文章

  1. [自翻]fasthttp中文文档(持续更新)
  2. video.js--很赞的H5视频播放库
  3. 简单轮播js实现
  4. SQL Server 跨网段(跨机房)复制
  5. FastDfs
  6. HTML5 Canvas 高仿逼真 3D 布料图案效果
  7. DOM – (w3school)1.DOM 方法 + 2.DOM属性 + 3.DOM 元素
  8. 关于解决haswell赛扬和奔腾 不能安装的问题
  9. [转]Redis集群的配置
  10. maven环境快速搭建(转)
  11. Activation successful 数据库邮件无法发送
  12. zoj 3529 A Game Between Alice and Bob 博弈论
  13. MAC下配置gradle用eclipse 打包android程序
  14. Android ListView(Selector 背景图片)
  15. hdu5348 MZL's endless loop(欧拉回路)
  16. Jquery点击除了指定div元素其他地方,隐藏该div
  17. 以Windows服务方式运行ASP.NET Core程序
  18. nuxt.js实战之用vue-i18n实现多语言
  19. BZOJ-4-2038: [2009国家集训队]小Z的袜子(hose)-莫队
  20. SpringBoot使用thymeleaf模板引擎

热门文章

  1. MySQL基础(三)
  2. python课程第三周重点记录
  3. [erlang]supervisor(监控树)的重启策略
  4. C#图片保存到本地
  5. 父窗口,子窗口之间的JS"通信"方法
  6. 国际化,java.util.ResourceBundle使用详解
  7. 站内信对话列表sql语句
  8. laravel中如何写验证码文件,并防止中文乱码.
  9. eclipse的maven项目报Missing artifact jdk.toos:jdk.toos:jar:1.6错
  10. java读取properties配置文件总结