Andorid:关于Binder几个面试问题
1.简单介绍下binder
binder是一种进程间通讯的机制
进程间通讯需要了解用户空间和内核空间
每个进程拥有自己的独立虚拟机,系统为他们分配的地址空间都是互相隔离的。如两个进程需要进行通讯,则需要使用到内核空间做载体,内核空间是所有进程共享的一块内存区域。而用户空间切到内核空间需要使用到系统api ioctl进行通讯。内核获取用户的数据需要使用copy_from_user,内核将数据发送给其他进程需要使用copy_to_user,这两个方法是有性能开销的,对于socket就是使用的这种模式,为了减少这部分的开销,内核提供了binder,binder只需要一次拷贝就可以实现进程通讯.
主要是使用mmap的原理:
在内核空间和用户空间都开辟一块虚拟内存区域同时指向一块物理地址,这样内核需要传递数据给用户空间时,只需要将数据拷贝到对应的虚拟内存地址中,用户可以通过虚拟内存映射关系,获取到内核中的数据,实现了一次拷贝通讯。
binder架构上面使用的是C/S架构:

binder中有三要素:
客户端,服务端和ServiceManager
复制代码
binder整体过程:
1.注册服务2.获取服务3.使用服务

2.Binder的定向制导,如何找到目标Binder,唤起进程或者线程?
数据结构流程:
1.server注册过程 1.server传入一个flat_binder_object给内核态。内核根据这个flat_binder_object创建binder_node节点,为每个进程服务,内部有个binder_proc.proc = server进程2.serviceManager在内核态创建binder_ref引用这个binder_node,内部有一项desc = 1,2,3..,在用户态会创建一个服务链表{name ="server name",handle = "server handle"}
2.client获取服务过程3.client向sm查询服务,传递name4.sm返回handle给驱动程序5.驱动程序在sm的binder_ref_desc红黑树中根据handle找到binder_ref,再根据binder_ref.node找到binder_node,最后给client创建新的binder_ref指向这个binder_node,他的desc从1开始binder_ref{desc=1,node = binder_node},驱动返回desc给client,即handle总结:sm中的handle顺序是根据服务注册顺序显示,返回给client中的handle是根据服务获取的顺序显示的
3.client使用handle过程6.:驱动里面根据handle找到找到binder_ref,根据binder_ref找到binder_node,根据binder_node找到进程server
复制代码
注:
flat_binder_object{type:是binder实体还是引用,只有需要注册的服务可以传binder实体,其他只能传handle引用flag(联合体)binder(实体:处理函数)/handle(引用:服务的引用):cookie
}
复制代码
数据传输过程(进程切换):

数据如何复制:

3.Binder中的红黑树,为什么会有两棵binder_ref红黑树
refs_by_desc主要是通过desc来查找对应的binder_ref
refs_by_node主要是通过node来查找对应的binder_ref
查找方式不一样
4.Binder一次拷贝原理
传统的数据拷贝方式如socket:
用户空间---->内核空间:`copy_from_user `
内核空间---->用户空间:`copy_to_user`复制代码
而binder使用mmap机制
在内核空间和用户空间中间使用物理地址开辟了一个映射关系
内核空间调用copy_from_user会直接将数据拷贝到内核空间并反馈到映射后的物理地址上,
由于用户空间和物理地址也有个映射关系,用户空间可以直接通过映射的虚拟地址指针访问到写入物理地址的数据。
这就是binder一次拷贝的原理复制代码
5.Binder传输数据的大小限制?
对于内核可以传输的是4M,但是应用层限制在1M-8K范围内,这就是在进程间传输过大的数据会导致崩溃的原因
6.系统服务与bindService等启动的服务的区别
系统服务需要将服务注册到ServiceManager,使用的时候需要通过服务名称去ServiceManger中获取服务的引用,
而bindService等启动的服务是将服务注册到AMS中的ServiceMap中,所有的服务的生命周期都由AMS控制。启动服务的进程如果需要使用IPC通讯,都是和获取AMS的代理类进行通讯,AMS也是在SystemServer启动的时候一个注册到ServiceManager的系统服务。
7.Binder多线程
binder线程池默认提供了15个线程进行处理进程间并发事件,如果服务端线程不够用,则驱动会发出一个信号,应用层收到这个信号调用Register_Thread,这样驱动层就可以使用这个新建出来的子线程进行数据的处理
8.Android APP进程天生支持Binder通信的原理是什么?
Android APP进程都是由Zygote进程孵化出来的。常见场景:
点击桌面icon启动APP,或者startActivity启动一个新进程里面的Activity,最终都会由AMS去调用Process.start()方法去向Zygote进程发送请求,让Zygote去fork一个新进程,Zygote收到请求后会调用Zygote.forkAndSpecialize()来fork出新进程,之后会通过RuntimeInit.nativeZygoteInit来初始化Andriod APP运行需要的一些环境,而binder线程就是在这个时候新建启动的
virtual voidonZygoteInit()
{sp proc = ProcessState::self();//启动新binder线程loopproc->startThreadPool();
}
复制代码
9.同一个线程的请求必定是顺序执行,即使是异步请求(oneway)
一般而言,Client同步阻塞请求Service,直到Service提供完服务后才返回,不过,也有特殊的,比如请求用ONE_WAY方式,这种场景一般主要是用来通知,至于通知被谁消费,是否被消费压根不会关心。拿ContentService服务为例子,它是一个全局的通知中心,负责转发通知,而且,一般是群发,由于在转发的时候,ContentService被看做Client,如果这个时候采用普通的同步阻塞势必会造成通知的延时发送送,所以这里的Client采用了oneway,异步。
相关文章:

Andorid:关于Binder几个面试问题
1.简单介绍下binderbinder是一种进程间通讯的机制进程间通讯需要了解用户空间和内核空间每个进程拥有自己的独立虚拟机,系统为他们分配的地址空间都是互相隔离的。如两个进程需要进行通讯,则需要使用到内核空间做载体,内核空间是所有进程共享…...
【剑指Offer-Java】包含min函数的栈?
题目 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。 MinStack minStack new MinStack(); minStack.push(-2); minStack.push(0); minStack.push(-3); minStack.min()…...
红队APT——邮件钓鱼攻击SwaksOffice漏洞RLO隐藏压缩释放
目录 (一)采用自己搭建Ewomail配合Swaks 0x01 搭建过程 0x02 配置转发信息 (二)网页钓鱼-克隆修改...

【Java|基础篇】超详细讲解运算符
文章目录1. 什么是运算符2. 算术运算符隐式类型转换强制类型转换字符串的拼接字符相加自增和自减运算符3.赋值运算符4. 关系运算符5. 逻辑运算符短路与(&&)和短路或(||)6.三目运算符7. 位运算符8. 移位运算1. 什么是运算符 运算符用于执行程序代码运算,会针…...

Promise-异步回调
1.理解Promise promise是ES6提出的异步编程的新的解决方案,通过链式调用解决ajax回调地狱 从语法上看,promise是一个构造函数,自己身上有all、reject、resolve方法,原型上有then、catch方法 从功能上看,Promise对象用…...
【设计模式之美 设计原则与思想:设计原则】21 | 理论七:重复的代码就一定违背DRY吗?如何提高代码的复用性?
在上一节课中,我们讲了 KISS 原则和 YAGNI 原则,KISS 原则可以说是人尽皆知。今天,我们再学习一个你肯定听过的原则,那就是 DRY 原则。它的英文描述为:Don’t Repeat Yourself。中文直译为:不要重复自己。将…...

深度学习 | 入个Pytorch的小门
本文主要参考 1’ 2’ 3 更新:2023 / 3 / 1 深度学习 | 入个Pytorch的小门 - 1. 常见数据操作创建操作算术操作加法索引形状查询形状改变形状广播机制广播条件运算数据类型转换Tensor转NumPyNumPy转Tensor线性回归线性回归的基本要素1. 模型2. 数据集3. 损失函数4.…...
应用上云指导
应用上云指导方法论。应用上云指传统应用迁移到云上,云上应用采用K8S部署。本文旨在提供一种方法、流程,指导应用上云,以求优化上云工作,提供应用上云效率。主要包含以下内容:应用上云工作角色、分工应用上云标准流程及…...

进程概念~
进程概念 (冯诺依曼体系结构,操作系统,进程概念,进程状态,环境变量,程序地址空间) 冯诺依曼体系结构:(计算机硬件体系结构) 输入设备,输出设备&a…...

三天吃透Java基础八股文
本文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点,欢迎star~ Github地址:https://github.com/…...

YOLOv8训练自己的数据集(超详细)
一、准备深度学习环境本人的笔记本电脑系统是:Windows10YOLO系列最新版本的YOLOv8已经发布了,详细介绍可以参考我前面写的博客,目前ultralytics已经发布了部分代码以及说明,可以在github上下载YOLOv8代码,代码文件夹中…...
【洛谷 P1088】[NOIP2004 普及组] 火星人 题解(全排列+向量)
[NOIP2004 普及组] 火星人 题目描述 人类终于登上了火星的土地并且见到了神秘的火星人。人类和火星人都无法理解对方的语言,但是我们的科学家发明了一种用数字交流的方法。这种交流方法是这样的,首先,火星人把一个非常大的数字告诉人类科学…...
基于混合蛙跳算法优化SVM的滚动轴承故障诊断python实现
1.混合蛙跳算法(SFLA)原理 混合蛙跳算法(SFLA)是一种受自然生物模仿启示而产生的基于群体的协同搜索方法,由局部搜索和全局信息交换两部分组成。 混合蛙跳算法中,每个青蛙的位置代表了一个可行解。青蛙在沼泽中跳跃,沼泽在离散的地方有很多石头,青蛙可以跳过这些石头来找…...

如何让AI帮你干活-娱乐(2)
背景:好容易完成朋友的任务,帮忙给小朋友绘画比赛生成一些创意参考图片。他给我个挑战更高的问题,是否可以帮他用AI生成一些视频。这个乍一听以现在AI技术根本不太可能完成。奈何他各种坚持,无奈被迫营业。苦脸接受了这个不可能完…...

文件异步多备常用方案
业务需求上经常存在需要对同一个文件进行双上传,上传到不同云存储桶,以防出现某一个云厂商因各种意外导致自身服务出现不可用的情况,当然,还有其他措施可以避免,现在只针对通过程序业务代码而双写存储的这个场景。 业务…...

java面试八股文之------Redis夺命连环25问
java面试八股文之------Redis夺命连环25问👨🎓1.为什么redis这么快👨🎓2.redis的应用场景,为什么要用👨🎓3.redis6.0之前为什么一直不使用多线程,6.0为甚么又使用多线程了&…...

【数据结构】AVL平衡二叉树底层原理以及二叉树的演进之多叉树
1.AVL平衡二叉树底层原理 背景 二叉查找树左右子树极度不平衡,退化成为链表时候,相当于全表扫描,时间复杂度就变为了O(n) 插入速度没影响,但是查询速度变慢,比单链表都慢,每次都要判断左右子树是否为空 需…...
K8S篇-安装nfs插件
前言 有关k8s的搭建可以参考:http://t.csdn.cn/H84Zu 有关过程中使用到的nfs相关的nas,可以参考: http://t.csdn.cn/ACfoT http://t.csdn.cn/tPotK http://t.csdn.cn/JIn27 安装nfs存储插件 NFS-Subdir-External-Provisioner是一个自动配置…...

xmu 离散数学 卢杨班作业详解【4-7章】
文章目录第四章 二元关系和函数4.6.2911121618.120.222.1232834第五章 代数系统的一般概念2判断二元运算是否封闭348111214第六章 几个典型的代数系统1.5.6.7.11.12151618第七章 图的基本概念12479111215第四章 二元关系和函数 4. A{1,2,3} 恒等关系 IA{<1,1>,<2,2…...

多重背包问题中的二进制状态压缩
1.多重背包问题 经典的多重背包问题和01背包问题的相似之处在于二者的一维遍历顺序都是从右侧往左侧遍历。 同时多重背包的一维写法不比二维写法降低时间复杂度。 2.多重背包标准写法:(平铺展开形式) class Solution {public int maxValue(int N, int C, int[] s…...

华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...

GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...
MySQL 部分重点知识篇
一、数据库对象 1. 主键 定义 :主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 :确保数据的完整性,便于数据的查询和管理。 示例 :在学生信息表中,学号可以作为主键ÿ…...

手机平板能效生态设计指令EU 2023/1670标准解读
手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读,综合法规核心要求、最新修正及企业合规要点: 一、法规背景与目标 生效与强制时间 发布于2023年8月31日(OJ公报&…...

Ubuntu Cursor升级成v1.0
0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...

Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合
作者:来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布,Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明,Elastic 作为 …...