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

Binder架构

一、架构

如上图,binder 分为用户层和驱动层两部分,用户层有客户端(Client)、服务端(Server)、服务管理(ServiceManager)。

从用户空间的角度,使用步骤如下(三者关系):

  • Server 往 ServiceManager 注册服务;
  • Client 从 ServiceManager 获取服务;
  • Client 使用获取到服务功能。

但其实,三者并不是直接通信的,而是各自调用 binder 驱动(ioctl),由 binder 驱动来做通信转发。这一部分是封装在 Binder API 里的,应用使用时完全不需要关心。

为什么这么设计?

比如,我们开发有一个进程A,想开发一个功能,让手机的手电筒打开;但是,手电筒只有进程B的 OpenLed 函数可以控制;这在商业项目中非常常见,模块高内聚,低耦合,职责非常单一。要做到进程A直接调用进程B的 OpenLed 函数(前面说的RPC),这个时候,进程A就是Client,进程B是Server;进程A,首先找到Binder的大管家ServiceManager获取进程B的句柄handle(进程B提前已经告诉(注册)大管家自己的句柄id是啥了),接着,进程A将 OpenLed 需要的参数进行打包封装,然后通过ioctl拷贝给内核里面的 Binder驱动,驱动拿到这些数据之后,寻思着这是发给谁的呢?一看数据包裹里面的handle就明白了,于是将数据转给(这儿其实是mmap,先有点印象别计较)进程B,进程B拿到之后,看看进程A是想调用我哪个函数?里面有个code给函数编号了,于是乎,进程B就去调用自己本地的OpenLed ,手电筒就打开了。

当然,进程B打开手电筒之后还可以将函数的执行结果信息(返回值,出参啥的)返回给进程A,这个不影响理解,先不管。

下面看看这三个进程分别干了什么:

Client进程:
        open驱动;
        获取服务(向ServiceManager查询服务,获得一个handle);
        向handle发数据;
ServiceManager进程:(下文简写为sm)
        open驱动;
        告诉驱动,我是service manager,我是大管家,以后所有的服务要想使用binder,

        必须告诉我他们叫啥,handle是多少。
        然后就是循环:
                从驱动读取数据;
                解析数据;
                处理数据;其实我们使用sm的功能相对单一,就是两种:注册服务

                (将服务名添加到自己的链表中)和获取服务(从链表查找服务,返回服务handle);
Server进程:
        open驱动;
        注册服务;将自己的服务名发给大管家sm;
        循环:
                从驱动读取数据;
                解析数据,并调用对应的函数;
                返回数据;

二、Binder的作用

到此,我们理解了 CS 架构的优点,以及它的大致原理,但是可能会产生一个疑问:

CS架构看起来并不是和 Binder 强绑定的,使用任意的进程通信方法都可以支撑这个CS架构,那为啥非 Binder 不可呢?

原因就是两个字:效率。

这里包含了运行效率和使用效率。

运行效率高,指的是 Binder 仅需要进行一次数据拷贝。什么意思呢?通常来说,进程间的通信都需要拷贝两次数据:

“进程A --(拷贝到)-- 内核”,“内核 --(拷贝到)-- 进程B”。

而 Binder 的 Server 端,用户空间和内核空间的是做了内存映射的,所以内核和 Server 应用之间的拷贝就可以省了。别小看这一次拷贝,这在 Binder 作为主力 IPC 方法而被大量频繁调用的安卓系统中,节省下来的开销还是很客观的。

相信有人可能又有疑惑了,那共享内存不是更节省开销吗,共享内存一次拷贝都不需要了。这里就不得不提到第二点“使用效率”了。

贡献内存最大的缺点之一就是难以同步,这得在两端约定一套协议规则才行,并且这在服务端对应多个客户端的时候,变得更加麻烦。

相信没人希望没实现一个功能,就要对大量的基础通信的开发调试吧?

所以,Binder 帮大家做好了,Binder 就像是是“半个共享内存 + 进程同步管理”。

三、通信原理

1、Binder底层使用到mmap

Binder是基于内存映射mmap设计实现的,通过这种方式,直接操作映射的这一部分内存,通过mmap,Binder通信时,只需要经历一次数据复制,从而获得更好的性能。

2、一次Binder IPC通信的过程分为以下几个步骤:

首先,Binder驱动在内核空间中开辟出一个数据接收缓冲区
接着,在内核空间中开辟出一个内核缓冲区
将内核缓冲区与数据接收缓冲区建立映射关系
将数据接收缓冲区与接收进程的用户空间地址建立映射关系
发送方进程通过copy_from_user将数据从用户空间复制到内核缓冲区
由于内核缓冲区与数据接收缓冲区有映射关系,同时数据接收缓冲区与接收进程的用户空间地址有映射关系,所以在接收进程中可以直接获取到这段数据

3、这样便完成了一次Binder IPC通信,它的原理如下图所示:

相关文章:

Binder架构

一、架构 如上图,binder 分为用户层和驱动层两部分,用户层有客户端(Client)、服务端(Server)、服务管理(ServiceManager)。 从用户空间的角度,使用步骤如下(…...

大数据治理:解锁数据价值,引领未来创新

目录 引言 一、大数据治理的定义 二、大数据治理的重要性 三、大数据治理的核心组件 四、大数据治理的实践案例 1. 数据标准化 2. 数据质量管理 案例一:医疗行业的大数据治理——智能医疗助手守护健康 引言 在数字化时代,数据已成为企业最宝贵的…...

解决windows下php8.x及以上版本,在Apache2.4中无法加载CURL扩展的问题

本文已首发于:秋码记录 若你也想搭建一个个人博客,可参考:国内 gitee.com Pages 下线了,致使众多站长纷纷改用 github、gitlab Pages 托管平台 在日新月异的信息化下,软件也在跟随着互联网的脚步,逐步推进…...

【韩顺平老师Java反射笔记】

反射 文章目录 基本使用反射机制java程序在计算机有三个阶段反射相关的主要类 反射调用优化Class类的常用方法获取Class对象的6种方式哪些类型有Class对象类加载类加载时机类加载过程图 通过反射获取类的结构信息第一组:java.lang.Class类第二组:java.la…...

Arrays.asList()新增报错,该怎么解决

一、前言 在 Java 开发中,Arrays.asList() 是一个常用的工具方法,它允许开发者快速将数组转换为列表。尽管这个方法非常方便,但许多开发者在使用时可能会遭遇一个常见的错误:尝试向由 Arrays.asList() 返回的列表中添加元素时抛出…...

【热门主题】000072 分布式数据库:开启数据管理新纪元

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 【热…...

基于Springboot开发的云野旅游平台

一、功能介绍 云野旅游平台包含管理员、用户两个角色以及前后台系统。 前台系统功能 用户登录成功后,可以进行查看旅游路线、最新线路、旅游资讯、个人中心、后台管理、购物车、客服等功能模块。进行相对应操作。 后台系统功能 管理员或用户登录成功后&#xf…...

2024金盾信安杯线上赛 MISC ezpng[wp]

下载题目发现给了个password和png 图片发现损坏的 password丢随波逐流一键解 base64 给出解码的结果是 cimbar搜索发现在Github有工具 然后对附件中的图片进行小厨房xor 得到一张新图片 利用工具进行跑出答案...

搭建业务的性能优化指南

这是一篇搭建业务优化的心路历程,也是写给搭建业务的性能优化指南。 前言 直到今天,淘内的页面大多都迁移到了 SSR,从我们终端平台 - 搭建研发团队的视角看,业务大致可以分为两类 —— 搭建派 和 源码派。 这两者互不冲突&#xf…...

电脑提示报错“Directx error”怎么解决?是什么原因导致的?游戏软件提示“Directx error”错误的解决方案

DirectX Error(DX错误)通常指的是在使用基于DirectX技术的应用程序(尤其是游戏)时遇到的问题。这个问题可能由多种因素导致,以下是一些可能的原因及相应的解决方案: 可能的原因 DirectX版本不匹配&#x…...

Linux——自定义简单shell

shell 自定义shell目标普通命令和内建命令(补充) shell实现实现原理实现代码 自定义shell 目标 能处理普通命令能处理内建命令要能帮助我们理解内建命令/本地变量/环境变量这些概念理解shell的运行 普通命令和内建命令(补充) …...

基于matlab程序实现人脸识别

1.人脸识别流程 1.1.1基本原理 基于YCbCr颜色空间的肤色模型进行肤色分割。在YCbCr色彩空间内对肤色进行了建模发现,肤色聚类区域在Cb—Cr子平面上的投影将缩减,与中心区域显著不同。采用这种方法的图像分割已经能够较为精确的将人脸和非人脸分割开来。…...

Unity跨平台基本原理

Unity跨平台基本原理 Unity跨平台基本原理微软的.Net是什么微软做 .Net平台的目的如何实现的.Net跨语言?总结 .Net Framework.Net Framework的体系结构CLR总结 如何实现的跨平台?.Net Core.Net FrameWork 到 .Net CoreMonoMono如何实现跨平台总结如何实现…...

【前端开发】小程序无感登录验证

概述 封装的网络请求库,主要用于处理 API 请求并支持自动处理 token 过期 和 token 刷新,适用于需要身份验证的应用场景,特别是在移动端中。 主要功能 自动附加 Token 在每个请求中自动附加 Authorization 头部,使用存储的 acces…...

Flink常见面试题

1、Flink 的四大特征(基石) 2、Flink 中都有哪些 Source,哪些 Sink,哪些算子(方法) 预定义Source 基于本地集合的source(Collection-based-source) 基于文件的source(…...

spark同步mysql数据到sqlserver

使用Apache Spark将数据从MySQL同步到SQL Server是一个常见的ETL(Extract, Transform, Load)任务。这里提供一个基本的步骤指南,以及一些代码示例来帮助你完成这项工作。 ### 前提条件 1. **安装Spark**:确保你的环境中已经安装了…...

Python Web 开发:FastAPI 基本概念与应用

Python Web 开发:FastAPI 基本概念与应用 目录 ✨ 1. FastAPI 路由(定义请求路径)🚀 2. HTTP 请求方法(GET、POST、PUT、DELETE)🔑 3. 参数类型(路径参数、查询参数、请求体&#…...

Linux设置开启启动脚本

1.问题 每次启动虚拟机需要手动启动网络,不然没有enss33选项 需要启动 /mnt/hgfs/dft_shared/init_env/initaial_env.sh 文件 2.解决方案 2.1 修改/etc/rc.d/rc.local 文件 /etc/rc.d/rc.local 文件会在 Linux 系统各项服务都启动完毕之后再被运行。所以你想要…...

go并发设计模式runner模式

go并发设计模式runner模式 真正运行的程序不可能是单线程运行的,go语言中最值得骄傲的就是CSP模型了,可以说go语言是CSP模型的实现。 假设现在有一个程序需要实现,这个程序有以下要求: 程序可以在分配的时间内完成工作&#xff0…...

nn.RNN解析

以下是RNN的计算公式,t时刻的隐藏状态H(t)等于前一时刻隐藏状态H(t-1)乘以参数矩阵,再加t时刻的输入x(t)乘以参数矩阵,最后再通过激活函数,等到t时刻隐藏状态。 下图是输出input和初始化的隐藏状态,当参数batch_first True时候&…...

How to monitor Spring Boot apps with the AppDynamics Java Agent

本文介绍如何使用 AppDynamics Java 代理监视 Azure Spring Apps 中的 Spring Boot 应用程序。 使用 AppDynamics Java 代理可以: 监视应用程序使用环境变量配置 AppDynamics Java 代理 在 AppDynamics 仪表板中检查所有监视数据 How to monitor Spring Boot app…...

Linux学习笔记12 systemd的其他命令

前文已经介绍了systemd在系统初始化中起到的作用和服务的管理和配置。这里补充一下systemd的其他工具和系统进程的管理 前文 Linux学习笔记10 系统启动初始化,服务和进程管理(上)-CSDN博客 Linux学习笔记11 系统启动初始化,服务…...

NGO-CNN-BiGRU-Attention北方苍鹰算法优化卷积双向门控循环单元时间序列预测,含优化前后对比

NGO-CNN-BiGRU-Attention北方苍鹰算法优化卷积双向门控循环单元时间序列预测,含优化前后对比 目录 NGO-CNN-BiGRU-Attention北方苍鹰算法优化卷积双向门控循环单元时间序列预测,含优化前后对比预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介…...

【分布式】分布式缓存

一、什么是分布式缓存 分布式缓存是一种将缓存数据存储在多个节点上的缓存方案。它通过将数据分散存储在多个节点的内存中,以提高系统的读取性能、降低数据库压力和提高系统可扩展性。 二、分布式缓存的优点 优点明细提高性能:分布式缓存可以将数据缓…...

深度学习中的迁移学习:应用与实践

引言 在深度学习领域,迁移学习(Transfer Learning)是一个非常强大且日益流行的概念,它通过将从一个任务中学到的知识应用于另一个任务,能够显著加快模型训练速度并提高其泛化能力。迁移学习在许多实际应用中都得到了广…...

28.UE5实现对话系统

目录 1.对话结构的设计(重点) 2.NPC对话接口的实现 2.1创建类型为pawn的蓝图 2.2创建对话接口 3.对话组件的创建 4.对话的UI设计 4.1UI_对话内容 4.2UI_对话选项 4.3UI_对话选项框 5.对话组件的逻辑实现 通过组件蓝图,也就是下图中的…...

Redis中的分布式锁(步步为营)

分布式锁 概述 分布式锁指的是,所有服务中的所有线程都去获取同一把锁,但只有一个线程可以成功的获得锁,其他没有获得锁的线程必须全部等待,直到持有锁的线程释放锁。 分布式锁是可以跨越多个实例,多个进程的锁 分布…...

CentOS 7安装mysql+JDK+Tomcat完成流程

一.安装mysql 即使是新的linux服务器,也要先验证是否有mysql已经安装,如果有进行卸载原版本,一定要确认是否mysql已不再使用 原安装情况(直接执行命令即可) whereis mysql rpm -qa | grep -i mysql rpm -e perl-DBD-M…...

C++笔记之不同框架中事件循环的核心函数:io_run()、ros_spin()、app_exec()

C笔记之不同框架中事件循环的核心函数:io_run()、ros_spin()、app_exec() code review! 参考笔记 1.qt-C笔记之使用QtConcurrent异步地执行槽函数中的内容,使其不阻塞主界面 2.qt-C笔记之QThread使用 3.qt-C笔记之多线程架构模式:事件信号监…...

C++异常处理

目录 一、异常的概念 二、异常的使用 (1)异常的抛出和捕获 (2)异常的重新抛出 (3)异常安全 (4)异常规范 三、自定义异常体系 四、c标注异常体系 五、异常的优缺点 在之前我们…...

榆次做网站/网店培训骗局

RocketMQ消息队列安装以及使用,RocketMQ安装常见问题,以及解决方案。 摘要: 我要装MQ rocketmq 安装 安装rocketmq需要环境: 1、jdk1.7以上 2、maven 3、git 复制代码 jdk1.8 wget https://zmatsh.b0.upaiyun.com/blog/tmp/jdk-8u92-linux-x6…...

建设行业管理信息系统官网/1688关键词怎么优化

音视频通信是近几年互联网应用的一个新领域,其应用极其广泛,我们常见的视频电话、会议系统和连麦直播等都是视频通信的具体应用。在移动互联网飞速发展的今天,各种应用都渴望加入视频通信的功能,实现用户与企业,用户与…...

做暧嗳网站/百度网络营销推广

本文来自项目作者评论区的投稿,内容转载自:LABLOG ,博主并未亲测!博主看了一下,操作难道略大,动手能力强的兄弟可以折腾一下!等待作者进一步优化普通用户的可操作性。本项目受 Oneindex启发&…...

做ps的赚钱的网站有哪些/免费b2b网站大全免费

首先 在工程中,右键项目,有个export,选择JAR File,就能导出jar包。一、java项目没有导入第三方jar包1. 首先在Eclipse中打开项目, 右键点击项目,选择“Export”;2. 选择Java/JAR file&#xff0…...

h5和网站的区别/湖北seo服务

简单介绍 FSL-FAST FAST(FMRIB 的自动分割工具)将大脑的 3D 图像分割成不同的组织类型: 灰质(grey matter, GM)、白 质 (white matter, WM)、脑脊液(cerebrospinal fluid, CSF)等。 同时还校正空间强度变化(也称为偏置…...

wordpress 手机浏览器/灰色词首页排名接单

Linux2.6设备驱动常用的接口函数(一)字符设备刚开始,学习linux驱动,觉得linux驱动很难,有字符设备,块设备,网络设备,针对每一种设备其接口函数,驱动的架构都不一样。这么多函数,要每…...