博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Anciroid的IPC机制-Binder概述
阅读量:6910 次
发布时间:2019-06-27

本文共 1702 字,大约阅读时间需要 5 分钟。

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

转载地址:http://vobcl.baihongyu.com/

你可能感兴趣的文章
CRM 2013 切换显示语言
查看>>
Codeforces Round #544 (Div. 3) C. Balanced Team
查看>>
UML-对象图
查看>>
【leetcode】1037. Valid Boomerang
查看>>
一起学Android之Layout
查看>>
PHP网页计时工具——SESSION问题
查看>>
PHP 真正多线程的使用
查看>>
ip黑白名单防火墙frdev的原理与实现
查看>>
ajax全接触
查看>>
ps查看内存占用排序
查看>>
【BZOJ】4873: [Shoi2017]寿司餐厅
查看>>
leetcode-852-山脉数组的峰顶索引
查看>>
你了解HTTPS,但你可能不了解X.509
查看>>
Bootstrap 类解析
查看>>
项目总结12:bootstrap-select下拉框模糊搜索
查看>>
SCRUM 是一个用于开发和维护复杂产品的框架
查看>>
“完成”的定义
查看>>
62. ExtJS + fileuploadfield实现文件上传
查看>>
ThinkPHP/---普通传参
查看>>
计算机网络技术中的网络互连技术
查看>>