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

Android学习总结之Binder篇

一、Binder 跨进程通信底层实现

Q1:Binder 如何实现一次完整的跨进程方法调用?请描述内核态与用户态交互流程

高频错误:仅回答 “通过 AIDL 生成代码”,未涉及 Binder 驱动三层协作模型
满分答案(附内核交互流程图):

  1. Client 端(用户态)

    • 通过 AIDL 生成的Proxy类调用方法,如proxy.doSomething()
    • 封装请求:创建Parcel对象,写入方法码(TRANSACTION_CODE)和参数
    • 调用IBinder.transact(),触发BinderProxy.transact()
    // AIDL生成的Proxy类核心逻辑
    public void doSomething() throws RemoteException {Parcel data = Parcel.obtain();data.writeInterfaceToken(DESCRIPTOR); // 写入接口描述符mRemote.transact(TRANSACTION_doSomething, data, null, 0); // 触发跨进程data.recycle();
    }
    
  2. Binder 驱动(内核态)

    • 通过ioctl(BINDER_WRITE_READ)系统调用,将Parcel数据从 Client 用户空间拷贝到内核缓冲区(仅 1 次拷贝,传统 Socket 需 2 次)
    • 根据mRemote持有的handle查找 Binder 实体(驱动维护红黑树binder_refbinder_node映射)
    • 将请求加入 Server 端的 Binder 线程池等待队列
  3. Server 端(用户态)

    • Binder线程池中的线程(默认 15 个)通过IPCThreadState.talkWithDriver()读取驱动中的请求
    • 调用BBinder.onTransact()解析TRANSACTION_CODE,分发到具体方法(如Stub.doSomething()
    • 结果通过反向路径返回:Server 的Parcel.reply() → 驱动 → Client 的transact()回调

数据佐证:某大厂实测,Binder 单次调用耗时约 5-10μs,比 Socket 快 5 倍以上,核心优势在于零拷贝内存映射(通过mmap共享内核缓冲区)。

二、Binder 死亡通知与服务重连

Q2:服务进程崩溃后,客户端如何实现可靠的重连机制?

常见错误:未处理binderDied()后的资源释放,导致多次重连失败
满分答案(含防重复重连逻辑):

  1. 注册死亡通知

    private final IBinder.DeathRecipient deathRecipient = new IBinder.DeathRecipient() {@Overridepublic void binderDied() {// 1. 解除旧通知(避免内存泄漏)if (mService != null) {mService.asBinder().unlinkToDeath(this, 0);mService = null;}// 2. 延迟重连(避免服务刚重启就立即连接)new Handler(Looper.getMainLooper()).postDelayed(() -> {if (!mIsReconnecting.getAndSet(true)) { // 原子标记防止并发重连bindService(new Intent(context, MyService.class), connection, Context.BIND_AUTO_CREATE);}}, 500);}
    };// 注册时设置flags=0(阻塞等待死亡通知)
    mService.asBinder().linkToDeath(deathRecipient, 0); 
    
  2. 驱动层触发逻辑

    • 当 Server 进程终止,内核驱动检测到binder_node引用计数为 0,向所有 Client 发送BR_DEAD_BINDER命令
    • 客户端Binder线程收到命令后,回调DeathRecipient.binderDied()
  3. 避坑指南

    • 通知丢失:服务连续崩溃时,通过AtomicBoolean mIsReconnecting标记重连状态,避免重复绑定
    • UI 线程切换binderDied()在 Binder 线程回调,需通过Handler切回主线程更新 UI
    • 熔断机制:设置重连次数上限(如 3 次),超过后提示用户 “服务不可用”

大厂实战:某金融 APP 通过上述方案,将服务重连成功率从 68% 提升至 99.2%,内存泄漏率下降 40%。

三、Binder 线程池调优与异步化设计

Q3:为什么 Binder 线程池默认最大 15 个线程?如何优化高频 IPC 场景?

常见错误:认为 “线程数越多并发处理能力越强”,未考虑 Linux 线程调度开销
满分答案(含线程池源码解析):

  1. 线程池设计原理

    • 初始状态:首次调用Binder.transact()时,主线程加入线程池(spawnPooledThread(true)
    • 动态扩展:后续请求由ProcessState.spawnPooledThread(false)创建新线程,默认上限 15(由g_maxThreads控制,定义在frameworks/native/cmds/servicemanager/binder.cpp
    • Linux 限制:单个进程线程数过多会导致CPU上下文切换开销激增,实测 15 线程时吞吐量达到峰值
  2. 高频 IPC 优化方案

    • 异步调用:通过FLAG_ONEWAY标记无需返回值的调用(如日志上报),避免线程阻塞
      mRemote.transact(CODE_LOG, data, null, IBinder.FLAG_ONEWAY); // 异步调用
      
    • 事务合并:将多次小请求合并为批量操作(如一次传输 100 条数据),减少线程池竞争
    • 优先级调整:通过Binder.setCallerWorkSource()提升关键业务线程优先级
      // 提升当前线程优先级为前台服务等级
      Binder.setCallerWorkSource(WorkSource.fromUid(Process.myUid()));
      
  3. 源码级解释

    // Binder线程池核心逻辑(frameworks/native/libs/binder/ProcessState.cpp)
    void spawnPooledThread(bool isMain) {sp<Thread> t = sp<Thread>(new BinderThread(isMain));t->run("Binder_"); // 启动线程,名称格式为Binder_1, Binder_2...
    }
    
     

    关键:超过 15 个线程时,新请求会在队列中等待,而非无限制创建线程。

四、AIDL 生成类结构与手写要点

Q4:手写 AIDL 生成的 Stub 和 Proxy 类,并解释跨进程回调实现

常见错误:混淆Stub(服务端)与Proxy(客户端)的职责,未处理Parcelable自定义类型
满分答案(完整类结构 + 回调实现):

  1. Proxy 类(客户端代理)

    public static class Proxy implements IMyService {private final IBinder mRemote; // 持有服务端Binder引用public Proxy(IBinder remote) {mRemote = remote;}@Overridepublic String getString() throws RemoteException {Parcel data = Parcel.obtain();Parcel reply = Parcel.obtain();try {data.writeInterfaceToken(DESCRIPTOR);mRemote.transact(TRANSACTION_getString, data, reply, 0); // 同步调用reply.readException(); // 检查远程异常return reply.readString(); // 读取返回值} finally {data.recycle();reply.recycle();}}
    }
    
  2. Stub 类(服务端实现)

    public abstract class Stub extends Binder implements IMyService {public static IMyService asInterface(IBinder obj) {if (obj == null) return null;// 客户端收到服务端Binder时,转换为Proxy对象return (obj instanceof Stub) ? (IMyService) obj : new Proxy(obj);}@Overrideprotected boolean onTransact(int code, Parcel data, Parcel reply, int flags) {data.enforceInterface(DESCRIPTOR);switch (code) {case TRANSACTION_getString:data.readException(); // 忽略请求异常String result = getString(); // 调用服务端具体实现reply.writeString(result); // 写入返回值return true;default:return super.onTransact(code, data, reply, flags);}}
    }
    
  3. 跨进程回调实现

    • 定义 AIDL 回调接口
      interface ICallback {void onResult(String data);
      }
      
    • 服务端持有回调 Stub
      private final ICallback.Stub mCallback = new ICallback.Stub() {@Overridepublic void onResult(String data) {// 服务端主动调用客户端回调new Handler(Looper.getMainLooper()).post(() -> {// 执行业务逻辑});}
      };
      
    • 客户端传递 Proxy 对象
      // 客户端绑定服务时传递回调
      service.registerCallback(ICallback.Stub.asInterface(binder));
      

关键:自定义类型需实现Parcelable,并提供CREATOR常量,否则 AIDL 编译会报错。

五、Binder 内存管理与大文件传输(美团 / 滴滴高频坑题)

Q5:为什么 Binder 单次传输数据不能超过 1MB?如何安全传递大文件?

常见错误:认为 “超过 1MB 直接崩溃”,未掌握 Ashmem 共享内存方案
满分答案(含底层原理与实战代码):

  1. 三重限制解析

    • 内核限制Binder驱动的 mmap 共享内存区默认大小 1MB(可通过adb shell getprop ro.binder.vmsize查看)
    • 协议限制:单个事务缓冲区大小由BINDER_VM_SIZE宏定义,超过会触发TransactionTooLargeException
    • 性能瓶颈:实测数据显示,传输 500KB 耗时约 10μs,1MB 耗时骤增至 50μs,超过后耗时呈指数级增长
  2. 大文件传输方案

    • Ashmem 匿名共享内存(推荐方案):
      // 服务端创建Ashmem区域并写入文件
      int ashmemFd = Ashmem.create("large_file", fileSize);
      FileInputStream fis = new FileInputStream(filePath);
      FileDescriptor fd = fis.getFD();
      mmap(ashmemFd, 0, fileSize, PROT_READ, MAP_SHARED, 0, 0); // 映射内存
      // 通过Parcel传递文件描述符
      Parcel data = Parcel.obtain();
      data.writeFileDescriptor(ashmemFd);
      mRemote.transact(CODE_TRANSFER_FILE, data, null, 0);
      
    • 分片传输(适用于非连续数据):
      // 拆分为多个1MB块
      int chunkSize = 1024 * 1024;
      for (int i=0; i<data.length; i+=chunkSize) {int end = Math.min(i+chunkSize, data.length);Parcel chunk = Parcel.obtain();chunk.writeInt(i);chunk.writeByteArray(data, i, end-i);mRemote.transact(CODE_CHUNK, chunk, null, FLAG_ONEWAY);
      }
      
  3. 避坑指南

    • 文件描述符泄漏:通过ParcelFileDescriptor管理 Ashmem 文件描述符,确保close()及时释放
    • 版本兼容:Android 10 + 需使用MediaStoreDocumentsProvider传递大文件,避免READ_EXTERNAL_STORAGE权限问题

相关文章:

Android学习总结之Binder篇

一、Binder 跨进程通信底层实现 Q1&#xff1a;Binder 如何实现一次完整的跨进程方法调用&#xff1f;请描述内核态与用户态交互流程 高频错误&#xff1a;仅回答 “通过 AIDL 生成代码”&#xff0c;未涉及 Binder 驱动三层协作模型 满分答案&#xff08;附内核交互流程图&a…...

very_easy_sql(SSRF+SQL注入)

题目有一行提示&#xff1a; you are not an inner user, so we can not let you have identify~&#xff08;你不是内部用户&#xff0c;所以我们不能让你进行身份验证&#xff09;联想到可能存在SSRF漏洞&#xff0c;一般情况下&#xff0c;SSRF攻击的目标是外网无法访问的内…...

MCP认证全解析:从零到微软认证专家

MCP认证全解析&#xff1a;从零到微软认证专家 什么是MCP认证&#xff1f; Microsoft Certified Professional&#xff08;MCP&#xff09;是由微软官方颁发的技术认证&#xff0c;旨在验证IT从业者在微软技术栈&#xff08;如Azure、Windows Server、SQL Server等&#xff0…...

leetcode刷题日记——反转链表

[ 题目描述 ]&#xff1a; [ 思路 ]&#xff1a; 题目要求将链表中指定位置的部分进行翻转反转的部分&#xff0c;其实可以看做使用头插法插入链表运行如下&#xff1a; struct ListNode* reverseBetween(struct ListNode* head, int left, int right) {struct ListNode te…...

【day04】Fibonacci数列 | 单词搜索 | 杨辉三角

1.Fibonacci数列 题目链接&#xff1a; Fibonacci数列_牛客题霸_牛客网 解题思路&#xff1a; 求斐波那契数列的过程中&#xff0c;判断⼀下&#xff1a;何时n会在两个fib数之间。 #include <bits/stdc.h>using namespace std;#define int long longsigned main() {i…...

win11指定Microsoft Print To PDF的输出路径(电子书djvu转pdf输出路径)

首先&#xff0c;看一张效果图 前面都是废话&#xff0c;解决方法看最后&#xff0c;看最后 Microsoft Print To PDF功能作为Windows操作系统内置的一项便捷工具&#xff0c;为用户提供了将任何可打印内容高效转换为PDF格式的能力。本文深入探讨了Microsoft Print To PDF的工作…...

第3章 数据和C

目录 3.1 示例程序3.2 变量与常量数据3.3 数据&#xff1a;数据类型关键字3.4 C数据类型3.4.1 int类型3.4.2 其它整数类型3.4.3 使用字符&#xff1a;char类型3.4.4 _Bool类型3.4.5 可移植的类型&#xff1a;inttypes.h3.4.6 float、double和long double类型3.4.7 复数和虚数类…...

迁移学习:如何加速模型训练和提高性能

&#x1f4cc; 友情提示&#xff1a; 本文内容由银河易创AI&#xff08;https://ai.eaigx.com&#xff09;创作平台的gpt-4-turbo模型生成&#xff0c;旨在提供技术参考与灵感启发。文中观点或代码示例需结合实际情况验证&#xff0c;建议读者通过官方文档或实践进一步确认其准…...

Kotlin zip 函数的作用和使用场景

1. zip 函数的作用 zip 是 Kotlin 集合操作中的一个函数&#xff0c;用于将两个集合按照索引一一配对&#xff0c;生成一个新的 List<Pair<T, R>> 集合。 作用&#xff1a;将两个集合的元素按位置组合成键值对&#xff08;Pair&#xff09;。返回值&#xff1a;一…...

通用分布式锁组件

Redisson的分布式锁使用并不复杂&#xff0c;基本步骤包括&#xff1a; 1&#xff09;创建锁对象 2&#xff09;尝试获取锁 3&#xff09;处理业务 4&#xff09;释放锁 但是&#xff0c;除了第3步以外&#xff0c;其它都是非业务代码&#xff0c;对业务的侵入较多&#x…...

FastDFS,分布式文件存储系统,介绍+配置+工具类

FastDFS 什么是分布式文件存储系统 随着文件逐渐增多&#xff0c;单台计算机已经存储不下这么多数据&#xff0c;需要用多台计算机存储不同的数据或进行备份&#xff0c;这样就需要有一个管理系统管理不同的计算机节点&#xff0c;这就是分布式管理系统。 使用分布式管理系统的…...

查询nvidia边缘设备的软硬件版本jetson_release

通过jetson_release命令可查询nvidia边缘设备的软硬件版本 nvidianvidia-desktop:~/leo/test_onnx$ jetson_release Software part of jetson-stats 4.2.12 - (c) 2024, Raffaello Bonghi Model: NVIDIA Orin Nano Developer Kit - Jetpack 5.1.1 [L4T 35.3.1] NV Power Mode[…...

[学习]RTKLib详解:ppp.c与ppp_ar.c

文章目录 RTKLib详解&#xff1a;ppp.c与ppp_ar.cPart A&#xff1a; ppp.c一、整体作用与工作流程二、核心函数说明1. pppos2. res_ppp3. tide_solid4. prectrop5. corrmeas6. udbias_ppp 三、数学原理补充四、代码特点 Part B: ppp_ar.c一、整体作用与工作流程分析二、函数功…...

ntdll!LdrpSnapThunk函数分析之LdrpNameToOrdinal函数返回之后得到函数地址

第一部分&#xff1a; OrdinalNumber LdrpNameToOrdinal( ImportString, ExportDirectory->NumberOfNames, DllBase, NameTableBase, …...

LeetCode 267:回文排列 II —— Swift 解法全解析

文章目录 摘要描述题解答案题解代码分析统计字符频率判断是否可能构成回文构建半边字符数组回溯生成半边排列 示例测试及结果时间复杂度空间复杂度实际使用场景&#xff1a;回文排列在真实项目里能干啥&#xff1f;文本处理、数据清洗类系统游戏开发&#xff1a;名字合法性验证…...

【渗透测试】命令执行漏洞的原理、利用方式、防范措施

文章目录 命令执行漏洞的原理、利用方式、防范措施一、原理**1. 定义与触发条件****2. 攻击链流程图** 二、利用方式**1. 利用手法与分类**(1) 系统命令注入(2) 代码执行漏洞(3) 框架漏洞利用 **2. 案例** 三、防范措施**1. 输入过滤与验证****2. 禁用危险函数****3. 安全开发*…...

旧版谷歌浏览器Chrome v116.0.5845.141下载

63位和32位均有&#xff1a; https://bbs.pcbeta.com/forum.php?modviewthread&tid1978299 https://www.31du.cn/open/google-chrome-v116-0-5845-141.html v116.0.5845.141的win32位版本&#xff1a; https://www.cr173.com/soft/435106.html v116.0.5845.97版本&…...

行业洞察| 当大模型开始协同工作:多智能体系统的崛起与挑战

你有没有想过&#xff0c;如果一群AI智能体拉了个工作群&#xff0c;它们会聊些什么&#xff1f; 程序员AI&#xff1a;“这段代码我来写&#xff01;” 产品经理AI&#xff1a;“需求还没说完呢&#xff01;” 辩论家AI&#xff1a;“我觉得这个方案不行&#xff01;” 吃瓜…...

The Action Replay Process

Preface A commonly used inequality − x > ln ⁡ ( 1 − x ) , 0 < x < 1 -x > \ln(1 - x), \quad 0 < x < 1 −x>ln(1−x),0<x<1 Proof: Let f ( x ) ln ⁡ ( 1 − x ) x f(x) \ln(1 - x) x f(x)ln(1−x)x, for 0 < x < 1 0 < …...

Python基于Django的病人信息管理系统及安全策略分析(附源码,文档说明)

博主介绍&#xff1a;✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3…...

YOLOv1:开创实时目标检测新纪元

一、引言 在计算机视觉领域&#xff0c;目标检测一直是重要的研究方向&#xff0c;广泛应用于自动驾驶、安防监控、智能机器人等场景。2016年&#xff0c;Joseph Redmon等人提出的YOLO&#xff08;You Only Look Once&#xff09;v1模型&#xff0c;以其端到端、单阶段、实时性…...

【今日三题】跳台阶扩展问题(找规律) / 包含不超过两种字符的最长子串 / 字符串的排列(回溯—全排列)

⭐️个人主页&#xff1a;小羊 ⭐️所属专栏&#xff1a;Linux 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 跳台阶扩展问题(找规律)包含不超过两种字符的最长子串(字符串哈希)字符串的排列(回溯—全排列) 跳台阶扩展问题(找规律) 跳台阶扩…...

MySQL 中常见的日志

1. MySQL 中常见的日志有哪些&#xff1f; MySQL 主要包含以下几种日志&#xff1a; 错误日志&#xff08;Error Log&#xff09;&#xff1a;记录 MySQL 服务器的启动和停止过程中的信息&#xff0c;以及运行过程中出现的错误或警告信息。默认情况下&#xff0c;错误日志文件…...

ubuntu nobel + qt5.15.2 设置qss语法识别正确

问题展示 解决步骤 首选项里面的高亮怎么编辑选择都没用。如果已经有generic-highlighter和css.xml&#xff0c;直接修改css.xml文件最直接&#xff01; 在generic-highlighter目录下找到css.xml文件&#xff0c;位置是&#xff1a;/opt/Qt/Tools/QtCreator/share/qtcreator/…...

线程池技术

线程池基本概念 线程池就是在任务还没有到来前&#xff0c;预先创建一定数量的线程放入空闲列表。这些线程都是处于阻塞状态&#xff0c;不消耗CPU&#xff0c;但占用较小的内存空间。 当新任务到来时&#xff0c;缓冲池选择一个空线程&#xff0c;把任务传入此线程中运行&…...

matlab App自动化安装和卸载

这个是文件mlappinstall安装和卸载的使用函数&#xff0c;并且包括运行函数。File must be a toolbox file (*.mlappinstall) Package and Share Apps — Functions matlab.apputil.createCreate or modify app project file interactively using the Package App dialog box…...

MATLAB技巧——命令行输入的绘图,中文是正常的,到了脚本(m文件)里面就变成乱码的解决方法

文章目录 文件编码&#xff08;根本性措施&#xff09;字体设置使用 sprintf 或 text 函数系统语言设置示例代码 使用mlx方法 总结 在 M A T L A B MATLAB MATLAB中&#xff0c;中文字符在命令行和脚本中的显示问题通常与字符编码设置有关。以下是一些可能导致中文乱码的原因及…...

使用OpenCV 和 Dlib 实现人脸融合技术

文章目录 引言一、技术概述二、环境准备三、关键代码解析1. 人脸关键点定义2. 获取人脸掩模3. 计算仿射变换矩阵4. 检测并提取人脸关键点5. 颜色校正 四、完整流程五、效果展示六、总结 引言 本文将介绍如何使用Python、OpenCV和dlib库实现人脸融合技术&#xff0c;将一张人脸…...

Codeforces Round 1022 (Div. 2)

Problem - A - Codeforces 看这数据量&#xff0c;算出每个排列来&#xff0c;是不现实的&#xff0c;需要找找规律 来看找规律代码 #include <bits/stdc.h> using namespace std;int main() {int t;cin >> t;while (t--){int n;cin >> n;vector<int&g…...

uniapp 震动功能实现

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 在项目中有时候需要一些功能&#xff0c;比如震动 描述 提示&#xff1a;这里描述项目中遇到的问题&#xff1a; 在移动应用中&#xff0c;震动反馈是提升用户体验的重要方式。uniapp 提供了两种震…...

uniapp 搭配 uCharts

在插件市场导入插件到项目中 <view class"charts-box-main"> <qiun-data-charts type"area" :opts"opts" :chartData"chartData" /> </view> data&#xff08;&#…...

Kubernetes(k8s)学习笔记(八)--KubeSphere定制化安装

1执行下面的命令修改上一篇中yaml文件来实现定制化安装devops kubectl edit cm -n kubesphere-system ks-installer 主要是将devops几个配置由False改为True 然后使用下面的命令查看安装日志 kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l …...

阿里云codeup以及本地gitclone+http

cmd命令行乱码问题、解决 chcp 65001 git代码提交 git add . git commit -m init git push origin master...

Spring Boot 多数据源事务管理

在 Spring Boot 中&#xff0c;当需要操作多个数据源时&#xff0c;事务管理会变得更加复杂。因为默认的 DataSourceTransactionManager 只支持单数据源事务&#xff0c;跨数据源的事务需要使用 分布式事务&#xff08;Distributed Transaction&#xff09; 或 柔性事务&#x…...

4.系统定时器基本定时器

目录 系统定时器 系统定时器&#xff08;systick&#xff09;--内核 系统定时器结构 系统滴答定时器寄存器--内核 定时周期的确定公式 配置滴答定时器 系统定时器应用 应用1.定时器构造时间点任务&#xff0c;解决while循环阻塞问题 应用2.定时器构造精准的ms延时 应…...

lvgl多语言设置

搭建开发环境 安装node.js 安装node.js&#xff0c;点击进入官网地址 安装lv_i18n lv_i18n项目地址&#xff1a;Github&#xff1a;https://github.com/lvgl/lv_i18ngit运行命令安装lv_i18n&#xff1a;npm i lv_i18n -g。测试命令&#xff1a;lv_i18n -h 搭建过程报错 …...

ICode国际青少年编程竞赛—Python—4级训练场—复杂嵌套循环

ICode国际青少年编程竞赛—Python—4级训练场—复杂嵌套循环 icode练习时遇到卡顿没有思路时怎么办&#xff0c;题目也很难找到不会的那道题&#xff5e;针对这个问题&#xff0c;我们开发了通过“步数”、“积木行数”来快速定位到你不会的题目&#xff5e; 题目会持续更新…...

【Windows】怎么解决Win 10家庭版WMI Provider Host占用CPU过高的问题?-篇一【2025.05.07】

本文面向两种用户&#xff0c;普通小白和windows开发程序员。 对于小白&#xff0c;目标就是阻止wmi对资源的高占用。解决方法有以下几步&#xff1a; 查出谁在调用这个wmiprvse.exe winR 组合键打开运行&#xff0c;输入命令services.msc&#xff0c;回车或确认。 找到如下蓝色…...

Matlab 多策略改进蜣螂优化算法及其在CEC2017性能

1、内容简介 Matlab214-多策略改进蜣螂优化算法及其在CEC2017性能 可以交流、咨询、答疑 2、内容说明 对蜣螂优化算法&#xff08;Dung Beetle Algorithm&#xff0c;DBA&#xff09;进行多种策略改进&#xff0c;以提高其在CEC2017基准测试中的表现。 蜣螂优化算法是一种仿…...

深度学习中常见的矩阵变换函数汇总(持续更新...)

1. 转置操作 (Transpose) 概念&#xff1a;将矩阵的行和列互换应用场景&#xff1a; 在卷积神经网络中转换特征图维度矩阵乘法运算前的维度调整数据预处理过程中的特征重排 原始矩阵 A [[1, 2, 3], 转置后 A^T [[1, 4],[4, 5, 6]] [2, 5],[3, 6]]代码…...

react+ts中函数组件父子通信方式

1. 父组件通过 Props 向子组件传递数据 这是最常见也是最基本的父子组件通信方式。父组件通过 props 将数据或回调函数传递给子组件。 示例代码&#xff1a; // 子组件接收来自父组件的数据 interface ChildProps {message: string; }const ChildComponent: React.FC<Chi…...

string--OJ3

链接: li1 #include <iostream> using namespace std;int main() {string a;getline(cin, a);cout << a.size() - a.find_last_of(" ")-1;{}}链接: li2 class Solution { public:bool isPalindrome(string s) {for (int i 0; i < s.size(); i){i…...

项目文档归档的最佳实践有哪些?

项目文档归档的最佳实践包括&#xff1a;明确归档标准与流程、使用集中式文档管理系统、实施严格的版本控制、定期审查与更新文档库。其中&#xff0c;明确归档标准与流程尤为关键&#xff0c;确保团队成员能统一理解并遵守文档管理规范。这包括明确文档命名规则、分类标准、归…...

C语言学习之字符函数和字符串函数

在C语言前面的内容中&#xff0c;我们学习到的库函数主要还是针对输入输出以及数字相关的内容&#xff0c;今天我们来学习一下有关于字符相关的函数&#xff0c;来对字符和字符串进行操作。 目录 字符分类函数 字符转换函数 以下的函数到strtok函数使用均需要包含头文件 st…...

自编码器(Autoencoder)

自编码器 是一种无监督学习的神经网络&#xff0c;主要用于数据的压缩和重构。它的核心思想是通过一个编码器将输入数据编码成一个低维表示&#xff08;编码&#xff09;&#xff0c;然后再通过一个解码器将这个低维表示重构回原始数据。自编码器的目标是让重构后的数据尽可能…...

黄金分割法(0.618 法)

黄金分割法简介 黄金分割法属于区间缩小法&#xff0c;通过逐步缩小包含极值的区间长度&#xff0c;逼近极值点。在每一次迭代中&#xff0c;使用黄金分割点 0.618 将区间分为两部分&#xff0c;比较这两点处的函数值&#xff0c;舍弃较差区间&#xff0c;从而逐渐逼近最优解。…...

电商双11美妆数据分析实验总结

数据分析方法与应用 数据分类与绘图 数据分类方法&#xff1a;通过指定列名和函数&#xff08;如SUM&#xff09;来分类数据&#xff0c;确保数据集中包含所需列&#xff0c;否则会报错。 嵌套柱形图应用&#xff1a;嵌套柱形图用于展示多层次分类的数据&#xff0c;如按店名和…...

TB6600HG是一款PWM(脉宽调制)斩波型单芯片双极性正弦波微步进电机驱动集成电路。

该驱动器支持电机的正向和反向旋转控制&#xff0c;并具有多种激励模式&#xff0c;包括2相、1-2相、W1-2相、2W1-2相和4W1-2相。 使用这款驱动器&#xff0c;只需时钟信号即可驱动2相双极性步进电机&#xff0c;且振动小、效率高。 主要特点&#xff1a; 单芯片双极性正弦波…...

java每日精进 5.07【框架之数据权限】

数据权限&#xff0c;实现指定用户可以操作指定范围的数据。 数据权限不支持指定用户只能查看数据的某些字段&#xff1b; 权限可以分成三类&#xff1a;功能权限、数据权限、字段权限。 目前可以使用数据脱敏实现一定程度的字段权限控制&#xff1b; 1.数据权限实现步骤 1.1插…...

2:点云处理—3D相机开发

1.包含相机库目录 1.include D:\中科\Ainstec3DViewer\AinstecCamSDK\AinstecCamSDK_CPP\include 2.lib D:\中科\Ainstec3DViewer\AinstecCamSDK\AinstecCamSDK_CPP\lib\win 3.release D:\中科\Ainstec3DViewer\AinstecCamSDK\AinstecCamSDK_CPP\bin 4.示例程序 D:\中科\A…...