当前位置: 首页 > news >正文

【安卓跨进程通信IPC】-- Binder

目录

  • Binder
    • Binder是什么?
    • 进程空间分配
    • 进程隔离
    • Binder跨进程通信机制模型
    • 优点
    • AIDL
    • 常见面试题

Binder

夯实基础之超详解Android Binder的工作方式与原理以及aidl示例代码
比较详细的介绍:Android跨进程通信:图文详解 Binder机制 原理
操作系统:图文详解 内存映射
一篇短的介绍:Binder原理解析
很详细的介绍:Android之Binder原理剖析
Android跨进程通信:图文详解 Binder机制 原理
Android之Binder原理剖析
Binder核心原理解析

binder面试题:
【干货满满】关于Binder的一些面试问题

Binder是什么?

是一种IPC方式;
是一种虚拟的物理设备驱动,即Binder驱动,连接service进程、client进程和ServiceManager进程的纽带;
从安卓代码的实现角度,binder是一个类,实现了IBinder接口。

进程空间分配

用户空间:进程间相互隔离
内核空间:进程间共享
进程内用户空间和内核空间进行交互需通过系统调用来实现:copy_from_user()和copy_to_user()

进程隔离

为了保证 安全性 & 独立性,一个进程 不能直接操作或者访问另一个进程,即Android的进程是相互独立、隔离的。
传统的IPC通信需要做2次数据拷贝:用户空间->内核空间->用户空间,效率低下。
而Binder的作用则是:连接两个进程,通过调用mmap()内存映射系统函数,主要负责创建数据接收的缓存空间 & 管理数据接收缓存,最终通过1次数据拷贝就实现了两个进程间的数据通信。

Binder跨进程通信机制模型

是基于Client-Server模式。
基本的流程:(详细流程见原链接)

  1. server进程通过binder驱动向ServiceManager注册服务,binder驱动将注册信息同步给Service Manager进行管理;
    Binder实体是Server进程在Binder驱动中的存在形式;该对象保存Server和ServiceManager的信息(保存在内核空间中);Binder驱动通过内核空间的Binder实体找到用户空间的Server对象。
  2. client进程通过向binder驱动发送获取指定服务的请求,传递要获取的服务名称,binder驱动通过Servcie Manager找到对应的binder实体,发挥实体引用给client进程;
  3. client进程通过binder实体引用使用服务。

binder驱动:一种虚拟设备驱动,连接server进程、client进程和Service Manager的桥梁,具体作用:

  1. 传递进程间的数据:通过内存映射,数据拷贝1次,传输效率高;
  2. 实现线程控制:采用Binder线程池,并由Binder驱动自身进行管理。
    Binder驱动持有每个server进程在内核空间中的binder实体,并给client进程提供binder实体的引用。

内存映射:

  1. binder驱动创建一块接收缓存区;
  2. 实现地址映射关系:实现内核缓存区和接收进程用户空间地址同时映射到同一个共享接收缓存区;
  3. 发送进程通过copy_from_user()发送数据到虚拟内存区域;
  4. 由于内核缓存区和接收进程的用户空间地址存在映射关系,故相当于也发送到了接收进程的用户空间地址,即实现了跨进程通信。

说明:

  1. Client进程、Server进程 & Service Manager 进程之间的交互 都必须通过Binder驱动(使用 open 和 ioctl文件操作函数),而非直接交互。
  2. Binder驱动 & Service Manager进程 属于 Android基础架构(即系统已经实现好了);而Client 进程 和 Server 进程 属于Android应用层(需要开发者自己实现)
  3. Binder请求的线程管理:Binder模型的线程管理 采用Binder驱动的线程池,并由Binder驱动自身进行管理;一个进程的Binder线程数默认最大是16,超过的请求会被阻塞等待空闲的Binder线程。

优点

  1. 高效:数据拷贝只需要1次,而管道、消息队列、Socket都需要2次,通过驱动在内核空间拷贝数据,不需要额外的同步处理。
  2. 安全性高:Binder机制为每个进程分配了UID/PID作为鉴别身份的标志,在Binder通信时会根据其进行有效性检测;传统的IPC方式对于双方的身份并没有做出严格的验证,如Socket通信ip地址都是客户端手动填入,容易出现伪造。
  3. 使用简单:采用CS架构,有AIDL机制使得开发者能够更加容易的使用和集成。

AIDL

Android:学习AIDL,这一篇文章就够了(上)
你真的理解AIDL中的in,out,inout么?

常见面试题

【干货满满】关于Binder的一些面试问题
面试 | 再也不怕被问 Binder 机制了

Android中进程和线程的关系,区别?
为何需要进行IPC,多进程通信可能会出现什么问题?
Android中IPC方式有几种、各种方式优缺点? 为何新增Binder来作为主要的IPC方式?

什么是Binder?
Binder的原理?
Binder Driver 如何在内核空间中做到一次拷贝的?
Binder 驱动加载过程中有哪些重要的步骤?
系统服务是什么时候注册的?
使用Binder进行数据传输的具体过程?
Binder框架中ServiceManager的作用?
系统服务与bindService启动的服务的区别?
系统服务与bindService等启动的服务的区别
【Android话题-2.4系统服务】系统服务和bind的应用服务有什么区别
Activity的bindService流程?
bindService方法流程
Android进阶笔记:bindService的流程–源码解析
Android四大组件系列6 bindService流程
使用 Binder 传输一次数据的最大限制是多少,被占满后会导致什么问题?

什么是AIDL?
AIDL使用的步骤?
AIDL支持哪些数据类型?
AIDL的关键类,方法和工作流程?
如何优化多模块都使用AIDL的情况?
不通过AIDL,手动编码来实现Binder的通信?

相关文章:

  • 简易图像处理器的设计
  • ChatGLM3-6B部署
  • Python代码关系图生成,帮助快速熟悉一个项目
  • Vue.js的核心概念:如何理解Vue.js的声明式渲染、组件系统、Vue实例、Vue生命周期等核心概念。
  • 机器学习实战项目一(卡通化图像)
  • Linux命令篇(一):文件管理部分
  • 阿里云短信服务使用(Java)
  • C# 语言类型(二)—预定义类型之字符串及字符类型简述
  • 深入理解Java中的List集合:解析实例、优化技巧与最佳实践
  • HackTheBox-Machines--Lazy
  • 数据结构——图
  • Lua的几个特殊用法
  • PHP面向对象编程总结
  • Flutter 中的 SliverCrossAxisGroup 小部件:全面指南
  • C++ 变量的声明和初始化方式
  • 11111111
  • 2017 年终总结 —— 在路上
  • centos安装java运行环境jdk+tomcat
  • Java-详解HashMap
  • js作用域和this的理解
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • Lsb图片隐写
  • MySQL用户中的%到底包不包括localhost?
  • React-flux杂记
  • windows下使用nginx调试简介
  • 反思总结然后整装待发
  • - 概述 - 《设计模式(极简c++版)》
  • 工程优化暨babel升级小记
  • 如何进阶一名有竞争力的程序员?
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • 小程序button引导用户授权
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #《AI中文版》V3 第 1 章 概述
  • #职场发展#其他
  • $L^p$ 调和函数恒为零
  • (3)选择元素——(17)练习(Exercises)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第14章泛型第2节(泛型类的类构造函数)
  • (Java)【深基9.例1】选举学生会
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (黑马C++)L06 重载与继承
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (转) 深度模型优化性能 调参
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET 2.0中新增的一些TryGet,TryParse等方法
  • .NET Core 网络数据采集 -- 使用AngleSharp做html解析
  • .net core 依赖注入的基本用发
  • .NET 使用 ILRepack 合并多个程序集(替代 ILMerge),避免引入额外的依赖
  • .NET 依赖注入和配置系统
  • .net实现头像缩放截取功能 -----转载自accp教程网