Chinaunix首页 | 论坛 | 博客
  • 博客访问: 668258
  • 博文数量: 160
  • 博客积分: 2384
  • 博客等级: 大尉
  • 技术积分: 1366
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-01 11:35
文章分类
文章存档

2015年(45)

2014年(36)

2012年(28)

2011年(37)

2010年(2)

2009年(10)

2008年(2)

分类: LINUX

2011-08-15 10:01:47

IT168技术】在Linux系统中,是以进程为单位分配和管理资源的。出于保护机制,一个进程不能直接访问另一个进程的资源,也 就是说,进程之间互相封闭。但是,在一个复杂的应用系统中,通常会使用多个相关的进程来共同完成一项任务,因此要求进程之间必须能够互相通信,从而共享资 源和信息。所以,操作系统内核必须提供进程间的通信机制(IPC)。

  在Linux中,进程间的通信机制有很多种,例如可以采用命名管道 (named pipe)、消息队列(message queue)、信号(signal)、共享内存(share memory)、socket等方式,它们都可以实现进程间的通信。但是,在Android终端上的应用软件的通信几乎看不到这些IPC通信方式,取而代 之的是Binder方式。Android同时为Java环境和C/C++环境提供了Binder机制。本章主要介绍C/C++环境下的Binder机制, 主要包括Binder驱动的实现、运作原理、IPC机制的实现、接口等,所以本章可能会涉及部分系统运行库的源代码,我们将详细讲解。

  一、Binder概述

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

  1、标准Linux Kernel IPC接口

  2、标准D-BUS接口

  3、Binder接口

  二、为什么选择Binder

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

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

  2、通过共享内存来提高性能。

  3、为进程请求分配每个进程的线程池。

  4、针对系统中的对象引入了引用计数和跨进程的对象引用映射。

  5、进程间同步调用。

  三、初识Binder

   Binder是通过Linux的Binder Driver来实现的,Binder操作类似于线程迁移(thread migration),两个进程间通信看起来就像是一个进程进入另一个进程去执行代码,然后带着执行的结果返回。Binder的用户空间为每一个进程维护 着一个可用的线程池,线程池用于处理到来的IPC以及执行进程的本地消息,Binder通信是同步的而不是异步的。同时,Binder机制是基于 OpenBinder [1]来实现的,是一个OpenBinder的Linux实现,Android系统的运行都将依赖Binder驱动。

   Binder通信也是基于Service与Client的,所有需要IBinder通信的进程都必须创建一个IBinder接口。系统中有一个名为 Service Manager的守护进程管理着系统中的各个服务,它负责监听是否有其他程序向其发送请求,如果有请求就响应,如果没有则继续监听等待。每个服务都要在 Service Manager中注册,而请求服务的客户端则向Service Manager请求服务。在Android虚拟机启动之前,系统会先启动Service Manager进程,Service Manager就会打开Binder驱动,并通知Binder Kernel驱动程序,这个进程将作为System Service Manager,然后该进程将进入一个循环,等待处理来自其他进程的数据。因此,我们也可以将Binder的实现大致分为:Binder驱动、 Service Manager、Service、Client这几个部分,下面将分别对这几个部分进行详细分析。

  关于OpenBinder的更多信息,可以参考~hackbod/openbinder/docs/html/index.html。

阅读(1171) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~