Android学习总结之通信篇
一、Binder跨进程通信的底层实现细节(挂科率35%)
高频问题:“Binder如何实现一次跨进程方法调用?”
候选人常见错误:
- 仅回答“通过Binder驱动传输数据”,缺乏对内存映射和线程调度的描述
- 混淆Binder驱动与AIDL的角色
满分答案:
Binder的跨进程通信依赖于三层协作模型:
-
1. 用户空间与内核空间的交互:
- Client通过BinderProxy调用transact(),将请求封装为Parcel对象
- Binder驱动通过ioctl()系统调用将数据从用户空间拷贝至内核空间(仅一次拷贝,传统IPC需两次)
- 驱动通过红黑树管理Binder实体与引用,根据handle定位目标进程
-
2. 内存映射技术:
- ProcessState初始化时调用mmap(),在内核开辟共享内存区(典型大小1M-8M)
- 数据通过内存映射直接传递,避免多次拷贝(性能比Socket高5-10倍)
-
3. 服务端响应机制:
- Server端的Binder线程池通过IPCThreadState从驱动读取请求
- BBinder的onTransact()解析请求并执行方法,结果通过反向路径返回
二、Binder死亡通知的精准处理(挂科率28%)
高频问题:“服务进程崩溃后,客户端如何感知?”
候选人常见错误:
- 只知道linkToDeath(),但说不清死亡通知的触发条件
- 未处理binderDied()后的资源释放,导致内存泄漏
满分答案:
死亡通知的实现需要三层保障机制:
-
1. 死亡代理注册:
// 客户端代码示例
IBinder.DeathRecipient deathRecipient = new IBinder.DeathRecipient() { @Override public void binderDied() { // 1. 解除死亡通知 mService.unlinkToDeath(this, 0); // 2. 重连服务 rebindService(); }
};
mService.linkToDeath(deathRecipient, 0);
-
2. 内核级监测:
- Binder驱动维护引用计数表,当服务进程终止时,触发BR_DEAD_BINDER命令
- 驱动通过binder_thread_write()向客户端发送死亡信号
-
3. 线程安全处理:
- 死亡回调在客户端的Binder线程执行,需切换至主线程更新UI
- 必须用AtomicBoolean标记重连状态,避免多次重复绑定
避坑指南:
- 死亡通知丢失场景:服务进程连续崩溃导致binderDied()堆积
- 解决方案:在ServiceConnection中增加重试次数限制,配合指数退避算法
三、Binder线程池的运作玄机(挂科率22%)
高频问题:“Binder线程池为什么默认最大15个线程?”
候选人常见错误:
- 误认为线程数越多越好,忽略Linux进程的线程数限制
- 不知道如何优化高频IPC场景的线程调度
满分答案:
线程池设计的三条黄金法则:
-
1. 启动规则:
- 首次Binder调用触发主线程加入线程池
- 后续请求由spawnPooledThread()动态创建新线程(默认上限15)
-
2. 阻塞规避:
- 所有Binder方法必须异步化,同步调用会导致线程池耗尽
- 特殊场景可用FLAG_ONEWAY标记异步调用(但需处理乱序问题)
-
3. 性能调优:
// 修改线程池上限(需系统权限)
ProcessState::self()->setThreadPoolMaxThreadCount(8);
// 预启动线程(避免首次调用延迟)
ProcessState::self()->startThreadPool();
-
- 事务合并技术:将多个小请求打包发送(如批量更新UI)
- 优先级继承:通过setCallingWorkSource()提升关键业务的线程优先级
进阶考点:
- 解释IPCThreadState如何通过talkWithDriver()实现非阻塞通信
- 为什么Binder线程不能执行耗时操作?(会导致服务端所有IPC卡死)
四、AIDL与Binder的隐藏关系(挂科率15%)
高频问题:“手写AIDL生成的Java类结构”
候选人常见错误:
- 混淆Stub与Proxy类的职责边界
- 不会手动实现跨进程回调接口
满分答案:
AIDL编译器的三大魔法:
-
1. 代理模式封装:
// 自动生成的Proxy类(客户端使用)
public static class Proxy implements IMyService { private android.os.IBinder mRemote; Proxy(android.os.IBinder obj) { mRemote = obj; } @Override public void doSomething() throws RemoteException { Parcel _data = Parcel.obtain(); mRemote.transact(TRANSACTION_doSomething, _data, null, FLAG_ONEWAY); }
}
2. 桩类实现:
// 自动生成的Stub类(服务端继承)
public static abstract class Stub extends Binder implements IMyService { @Override protected boolean onTransact(int code, Parcel data, Parcel reply, int flags) { switch(code) { case TRANSACTION_doSomething: this.doSomething(); return true; } return super.onTransact(code, data, reply, flags); }
}
-
3. 跨进程回调:
- 定义ICallback.aidl接口,在服务端持有ICallback.Stub对象
- 客户端传递ICallback.Stub.asInterface()生成的Proxy对象
手写要点:
- 必须处理Parcel的序列化异常(如自定义对象需实现Parcelable)
- 跨版本兼容:通过DESCRIPTOR字段校验接口一致性
五、Binder内存管理的致命陷阱(挂科率10%)
高频问题:“为什么Binder传输数据要限制1MB?”
候选人常见错误:
- 仅回答“防止内存溢出”,未涉及共享内存机制
- 不知道如何传输大文件
满分答案:
内存管理的三重保险:
-
1. 内核缓冲区限制:
- 默认单个事务限制1MB(内核宏定义BINDER_VM_SIZE)
- 修改限制需重新编译内核(风险极高,不推荐)
-
2. 零拷贝传输方案:
// 使用Ashmem共享内存传输大文件
ParcelFileDescriptor pfd = ParcelFileDescriptor.fromFd(fd);
parcel.writeFileDescriptor(pfd.getFileDescriptor());
-
- 通过mmap()将文件映射到内存,避免数据拷贝
-
3. 引用计数管理:
- Binder对象通过incStrong()/decStrong()维护引用
- 跨进程传递时自动调用onFirstRef()/onLastStrongRef()
突破限制的正确姿势:
- 分片传输:将数据拆分为多个小于1MB的块
- 使用Messenger+Message的setData()分批发送
扩展追问:
Binder传输数据量的认知盲区
高频错误答案:"Binder能传1MB数据,超过就崩溃"
技术本质:
- 内核限制:mmap内存映射区默认1M-8K
- 协议限制:事务缓冲区大小通过BINDER_SET_MAX_THREADS设置
优化方案:
-
1. 图片传输:使用Ashmem替代Binder(2MB图片速度提升4倍)
-
2. 大文件方案:Socket+ContentProvider(参考微信文件传输)
// Ashmem核心调用
int fd = ashmem_create_region("buffer", size);
ashmem_set_prot_region(fd, PROT_READ | PROT_WRITE);
实测数据:Binder单次传输超过500KB时,耗时呈指数级增长
正解:Binder传输容量受三重制约:
-
1. 内核限制:mmap内存映射区默认1M-8K(实测单次传输突破900K即触发TransactionTooLargeException)
-
2. 协议限制:事务缓冲区通过BINDER_SET_MAX_THREADS动态调整,超过阈值触发流控
-
3. 性能拐点:传输2MB位图时,Ashmem方案比直接Binder快4倍
优化方案:
// 使用Ashmem传递大图
Bitmap bitmap = BitmapFactory.decodeFile(path);
GraphicBuffer graphicBuffer = GraphicBuffer.createFromBitmap(bitmap);
Parcel parcel = Parcel.obtain();
parcel.writeFileDescriptor(graphicBuffer.getHardwareBuffer().getFileDescriptor());
binder.transact(CODE_TRANSFER_IMAGE, parcel, null, 0); // 引用
Zygote进程通信的协议选择
灵魂拷问:"为什么Zygote用Socket而不用Binder?"
错误认知:
• 57%候选人认为"ServiceManager未启动"
• 32%误答"Binder性能更好"
底层真相:
-
1. 安全隔离:Socket支持SELinux精细策略控制,而Binder依赖SMgr全局注册(存在越权风险)
-
2. 效率差异:fork进程时Socket通信耗时比Binder少0.3ms(实测三星S22数据)
-
3. 生命周期解耦:Zygote存活期间需独立于SystemServer(避免Binder线程池污染)
关键代码片段:
// ZygoteServer通信核心逻辑
bool ZygoteServer::forkAndSpecialize(...) {int socketFd = mSocket.getFileDescriptor();pollfd fds[1] = {{socketFd, POLLIN, 0}};while (true) {int err = poll(fds, 1, -1); // 阻塞监听Socketif (fds[0].revents & POLLIN) {handleNewConnection(); // 处理AMS请求 引用}}
}
Activity启动的跨进程迷雾
经典误区:"冷启动要经历5次跨进程调用"
真实调用链:
• 冷启动(4次IPC):
App进程 -> AMS(跨进程)
AMS -> Zygote(跨进程)
Zygote -> AMS(返回PID)
AMS -> ApplicationThread(跨进程) 引用
热启动(2次IPC):直接通过ApplicationThread调度
性能优化秘籍:
-
1. 窗口预创建:在attach()阶段同步创建Window(减少30ms白屏)
-
2. 主题魔法:通过android:windowBackground实现伪秒开
-
3. 异步加载:采用ViewStub延迟加载非核心布局
// 异步加载方案
override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)val viewStub = findViewById<ViewStub>(R.id.async_content)viewStub.inflateAsync { // 主线程空闲执行initHeavyViews() // 引用}
}
1. Binder 机制的限制
Android 系统中的进程间通信(IPC)是基于 Binder 机制实现的。Binder 是一种高效的通信机制,但它有一个重要的限制,就是事务缓冲区的大小。
-
事务缓冲区限制:Android 的 Binder 事务缓冲区大小通常为 1MB。这并不是 Intent 的限制,而是 Binder 本身的限制。每次通过 Binder 传输数据时,数据必须被写入这个缓冲区,如果数据量超过缓冲区大小,就会导致
TransactionTooLargeException
异常。 -
共享限制:这个事务缓冲区是由系统服务、应用程序等共享的,因此单个 Intent 传输的数据不能太大,以免占用过多的缓冲区空间导致系统不稳定。
2. Intent 设计的初衷
Intent 的设计初衷是用于启动组件(Activity、Service、BroadcastReceiver)和传递少量的键值对数据。因此,设计上并不是为大数据量传输而优化的。
-
轻量级传输:Intent 更适合传递小的、结构化的数据,如字符串、数值和小型对象,而不是大量的二进制数据(如图片、大型文件等)。
3. 内存消耗和性能
传递大量数据通过 IPC 会导致内存消耗和性能问题。
-
效率问题:传递大数据时,进程需要进行大量的内存拷贝操作,这会导致性能下降。
-
内存使用:过多的内存使用可能导致应用程序的垃圾回收行为变得频繁,从而影响应用的响应速度。
4. 如何应对该限制
如果需要传递大数据,推荐使用其他机制,而不是直接通过 Intent:
-
文件存储:将数据写入文件,然后通过 Intent 传递文件的 Uri(例如使用
FileProvider
)。 -
使用共享的应用内存(SharedPreferences):适合存储少量的键值对数据。
-
数据库存储:将大数据存储在 SQLite 数据库中,然后只传递少量必要的索引或 ID 信息。
-
ContentProvider:如果需要跨应用共享数据,可以实现
ContentProvider
并通过 URI 进行数据交换。 -
使用 Bundle 限制:Android API 提供了
putExtras
方法限制 Bundle 的大小,合理使用这些方法来管理传递数据的量。
Bundle的大小限制
在 Android 中,Bundle
是一种用于存储和管理键值对的简单数据结构,通常用于在 Activity
、Fragment
或组件间传递数据。和 Intent
类似,Bundle
也基于 Binder 机制进行数据传输,因此它同样存在数据大小的限制。
Bundle
通过 Binder 传递数据时,会受到 Binder 事务缓冲区大小的限制,约为 1MB。这意味着通过 Bundle
传递的数据在整体上不能超过这个限制。
通过理解这些机制的设计初衷和限制,我们可以更合理地设计应用程序的架构,以避免 TransactionTooLargeException
,并保障应用的性能和稳定性。
相关文章:
Android学习总结之通信篇
一、Binder跨进程通信的底层实现细节(挂科率35%) 高频问题:“Binder如何实现一次跨进程方法调用?” 候选人常见错误: 仅回答“通过Binder驱动传输数据”,缺乏对内存映射和线程调度的描述混淆Binde…...
自动化发布工具CI/CD实践Jenkins部署与配置教程
1. 前言背景 其实一直想把jenkins 的笔记整理下,介于公司这次升级jenkins2.0 ,根据自己部署的一些经验,我把它整理成笔记。 之前我们的jenkins1.0 时代 还一直停留在 free style 或者 maven 风格的项目,随着项目的日益增多&#x…...
kubernet在prometheus+alertmanager+grafana框架下新增部署loki模块
整个框架拓扑图 #mermaid-svg-OK7jgNZ2I7II8nJx {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-OK7jgNZ2I7II8nJx .error-icon{fill:#552222;}#mermaid-svg-OK7jgNZ2I7II8nJx .error-text{fill:#552222;stroke:#552…...
Ubuntu下UEFI安全启动安装Nvdia驱动
简介 众所周知,Ubuntu默认使用Nouveau开源驱动,其性能受限,因此我们需要安装Nvidia专用驱动。 安装专用驱动的一般方法非常简单,只需要sudo ubuntu-drivers devices && sudo ubuntu-drivers autoinstall即可,…...
Java多线程与高并发专题—— CyclicBarrier 和 CountDownLatch 有什么异同?
引入 上一篇我们了解CountDownLatch的原理和常见用法,在CountDownLatch的源码注释中,有提到: 另一种典型用法是将一个问题分解为 N 个部分,用一个Runnable描述每个部分,该Runnable执行相应部分的任务并对闭锁进行倒计…...
【深度学习】不管理论,入门从手写数字识别开始
1. 环境安装 学习深度学习,开发语言是Python。Python开发工具有很多。其中 anaconda vscode的Python开发环境很好用,建议使用这个组合。 编写手写数字识别测试代码,需要在使用Anaconda安装以下4个库: NumpyScipymatplotlibsci…...
Docker使用ubuntu
1. 更换源 sudo nano /etc/docker/daemon.json //daemon.conf查找最新可用的源1、2,手动查找会不断更新! 1.1 添加DNS sudo nano /etc/resolv.confnameserver 8.8.8.8 nameserver 8.8.4.4 2. 修改配置文件后重新加载 sudo systemctl daemon-relo…...
Windows 系统下多功能免费 PDF 编辑工具详解
IceCream PDF Editor是一款极为实用且操作简便的PDF文件编辑工具,它完美适配Windows操作系统。其用户界面设计得十分直观,哪怕是初次接触的用户也能快速上手。更为重要的是,该软件具备丰富多样的强大功能,能全方位满足各类PDF编辑…...
影响HTTP网络请求的因素
影响 HTTP 网络请求的因素 1. 带宽 2. 延迟 浏览器阻塞:浏览器会因为一些原因阻塞请求,浏览器对于同一个域名,同时只能有4个连接(这个根据浏览器内核不同可能会有所差异),超过浏览器最大连接数限制&…...
OpenGL —— 流媒体播放器 - ffmpeg解码rtsp流,opengl渲染yuv视频(附源码,glfw+glad)
🔔 OpenGL 相关技术、疑难杂症文章合集(掌握后可自封大侠 ⓿_⓿)(记得收藏,持续更新中…) 效果 说明 FFMpeg和OpenGL作为两大技术巨头,分别在视频解码和图形渲染领域发挥着举足轻重的作用。本文将综合两者实战视频播放器,大概技术流程为:ffmpeg拉取rtsp协议视频流,并…...
Java + LangChain 实战入门,开发大语言模型应用!
在 Baeldung 上看到了一篇介绍基于 Java LangChain 开发大语言模型应用的基础入门文章,写的非常不错,非常适合初学者。于是,我抽空翻译了一下。 原文地址:https://www.baeldung.com/java-langchain-basics翻译: Java…...
【目标检测】【深度学习】【Pytorch版本】YOLOV1模型算法详解
【目标检测】【深度学习】【Pytorch版本】YOLOV1模型算法详解 文章目录 【目标检测】【深度学习】【Pytorch版本】YOLOV1模型算法详解前言YOLOV1的模型结构YOLOV1模型的基本执行流程YOLOV1模型的网络参数YOLOV1模型的训练方式 YOLOV1的核心思想前向传播阶段网格单元(grid cell)…...
软考《信息系统运行管理员》- 6.2 信息系统硬件的安全运维
硬件安全运行的概念 硬件安全运行的含义是保护支撑信息系统业务活动的信息系统硬件资产免遭自然灾害、人 为因素及各种计算机犯罪行为导致的破坏。硬件安全通常包括环境安全、设备安全和介质安全。 硬件安全运行的影响因素 硬件安全运行的影响因素主要有: (1)自然…...
SQL 视图
SQL 视图 引言 SQL(结构化查询语言)视图是数据库管理系统中的一种重要概念。它提供了一个虚拟的表,该表由一个或多个基本表的数据组成,用户可以通过视图查询数据,而不需要直接操作基本表。本文将详细介绍SQL视图的定…...
Chrome 开发环境快速屏蔽 CORS 跨域限制!
Chrome 开发环境快速屏蔽 CORS 跨域限制【详细教程】 ❓ 为什么需要临时屏蔽 CORS? 在前后端开发过程中,我们经常会遇到 跨域请求被浏览器拦截 的问题。例如,你在 http://localhost:3000 调用 https://api.example.com 时,可能会…...
数值稳定性 + 模型初始化和激活函数
数值稳定性 神经网络的梯度 考虑如下有 d 层的神经网络 h t f t ( h t − 1 ) and y ℓ ∘ f d ∘ … ∘ f 1 ( x ) \mathbf{h}^t f_t(\mathbf{h}^{t-1}) \quad \text{and} \quad y \ell \circ f_d \circ \ldots \circ f_1(\mathbf{x}) htft(ht−1)andyℓ∘fd∘…∘…...
【消息队列】几个mq组件的对比: redis stream/rabbitmq/rocketmq/kafka
1. 消息队列 几个组件: Redis Stream:适用于对性能要求高、可靠性要求不高的场景Rocket MQ:可靠性高,性能优秀,但官方对 go 不太友好,sdk 缺少很多功能支持Rabbit MQ:性能适中,使用…...
TCP协议与wireshark抓包分析
一、tcp协议格式 1. 源端口号 : 发送方使用的端口号 2. 目的端口号 : 接收方使用的端口号 3. 序号: 数据包编号 , tcp 协议为每个数据都设置编号,用于确认是否接收到相应的包 4. 确认序列号 : 使用 tcp 协议接收到数据包,…...
深度学习四大核心架构:神经网络(NN)、卷积神经网络(CNN)、循环神经网络(RNN)与Transformer全概述
目录 📂 深度学习四大核心架构 🌰 知识点概述 🧠 核心区别对比表 ⚡ 生活化案例理解 🔑 选型指南 📂 深度学习四大核心架构 第一篇: 神经网络基础(NN) 🌰 知识点概述…...
springcloud 整合 Redis_Redisson
springcloud 整合 Redis 、Redisson Redis-x64-5.0.14.1 版本 https://blog.csdn.net/wojiubugaosuni12/article/details/134452665 https://www.123pan.com/s/8EpMjv-MTjBv.html spring cloud 整合 redis Redis 5.0.14 Springcloud 2021.0.5 Redis启动 redis-server.exe 点击…...
Windows模仿Mac大小写切换, 中英文切换
CapsLock 功能优化脚本部署指南 部署步骤 第一步:安装 AutoHotkey v2 访问 AutoHotkey v2 官网下载并安装最新版本安装时勾选 "Add Compile Script to context menus" 第二步:部署脚本 直接运行 (调试推荐) 新建文本文件,粘贴…...
基于Spring Boot的木里风景文化管理平台的设计与实现(LW+源码+讲解)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
【银河麒麟系统常识】命令:uname -m(查看系统架构)
命令: uname -m 功能 常用的 Linux/Unix 终端命令,用于显示当前系统的硬件架构; 返回 返回系统的CPU架构类型,用于判断软件兼容性; 输出结果架构说明常见设备x86_64Intel/AMD 64位 CPU主流 PC、服务器aarch64ARM 64位 …...
网络原理-TCP/IP
网络原理学习笔记:TCP/IP 核心概念 本文是我在学习网络原理时整理的笔记,主要涵盖传输层、网络层和数据链路层的核心协议和概念,特别是 TCP, UDP, IP, 和以太网。 一、传输层 (Transport Layer) 传输层负责提供端到端(进程到进…...
【银河麒麟高级服务器操作系统 】虚拟机运行数据库存储异常现象分析及处理全流程
更多银河麒麟操作系统产品及技术讨论,欢迎加入银河麒麟操作系统官方论坛 https://forum.kylinos.cn 了解更多银河麒麟操作系统全新产品,请点击访问 麒麟软件产品专区:https://product.kylinos.cn 开发者专区:https://developer…...
AI-Sphere-Butler之如何使用腾讯云ASR语音识别服务
环境: AI-Sphere-Butler WSL2 英伟达4070ti 12G Win10 Ubuntu22.04 腾讯云ASR 问题描述: AI-Sphere-Butler之如何使用腾讯云ASR语音识别服务,本地硬件配置不高的情况,建议使用云服务商的ASR 解决方案: 1.登…...
Dify 0.15.3版本 本地部署指南
目录 背景 一、单机部署机器配置最低要求 二、系统Python环境安装 安装需要的python依赖 使用pyenv官方安装脚本 安装poetry 三、中间件部署 PostgreSQL本地部署 添加PG官方仓库 安装pg 16 检查pg版本 修改密码为dify默认 创建数据库dify 安装pg vector插件 修改…...
全书测试:《C++性能优化指南》
以下20道多选题和10道设计题, 用于本书的测试。 以下哪些是C性能优化的核心策略?(多选) A) 优先优化所有代码段 B) 使用更高效的算法 C) 减少内存分配次数 D) 将所有循环展开 关于字符串优化,正确的措施包括ÿ…...
Oracle数据库数据编程SQL<递归函数详解>
递归函数是一种在函数体内直接或间接调用自身的函数。这种函数通过将复杂问题分解为更小的相同问题来解决特定类型的编程任务。 目录 一、递归函数基本概念 1. 递归定义 2. 递归工作原理 二、递归函数示例 1. 经典阶乘函数 2. 斐波那契数列 3. 计算数字位数 三、递归查…...
Burp Suite从入门到实战之配置启动
目录 1.Burp Suite配置启动 1.1安装Burp Suite jar包 1.2JDK,JDK包含JRE(Java运行时环境) 1.2.1配置JDK11环境变量配置 1.2.2系统变量里添加JAVA_HOME编辑 1.2.3找到Path变量进行编辑添加bin 1.2.4命令行查看是否配置成功 1.3激活j…...
【力扣hot100题】(016)缺失的第一个正数
题目里这么多条条框框……先不按条条框框做了两下。 第一个思路:你不仁我不义,先排序后遍历(时间不符题意) class Solution { public:int firstMissingPositive(vector<int>& nums) {sort(nums.begin(),nums.end());i…...
(undone) MIT6.824 Lecture 02 - RPC and Threads
知乎专栏:https://zhuanlan.zhihu.com/p/641105196 原视频:https://www.bilibili.com/video/BV16f4y1z7kn?spm_id_from333.788.videopod.episodes&vd_source7a1a0bc74158c6993c7355c5490fc600&p2 看知乎专栏 一、Why we choose go?…...
红宝书第二十一讲:详解JavaScript的模块化(CommonJS与ES Modules)
红宝书第二十一讲:详解JavaScript的模块化(CommonJS与ES Modules) 资料取自《JavaScript高级程序设计(第5版)》。 查看总目录:红宝书学习大纲 一、模块化的意义:分而治之 模块化解决代码依赖混…...
输入百分比校验(数字非负数保留2位不四舍五入)
场景用于输入百分比,限制只能输入非负数,保留2位小数,且不四舍五入 以下举例环境 vue2 element-ui 请自行根据实际场景使用 html部分 <el-inputv-model"item.percentage"placeholder"请输入"maxlength"5"…...
Python----机器学习(KNN:决策边界,决策边界计算,交叉验证步骤)
一、KNN算法简介 1.1、定义 KNN(K-Nearest Neighbor)算法是一种基于实例的学习方法,通过测量数据点之间的距离进行分类或回归分析。它是一种简单易懂的多分类技术,依赖于距离最近的邻居来推断数据点的类别或数值,为许…...
SpringBoot 3+ Lombok日志框架从logback改为Log4j2
r要将Spring Boot 3项目中的日志框架从Logback切换到Log4j2,并配置按日期滚动文件和控制台输出,请按照以下步骤操作: 步骤 1:排除Logback并添加Log4j2依赖 在pom.xml中修改依赖: <dependencies><!-- 排除默…...
实战篇Redis
黑马程序员的Redis的笔记(后面补一下图片) 【黑马程序员Redis入门到实战教程,深度透析redis底层原理redis分布式锁企业解决方案黑马点评实战项目】https://www.bilibili.com/video/BV1cr4y1671t?p72&vd_source001f1c33a895eb5ed820b9a4…...
c++-函数增强
一、编译器对函数名的处理 1. C与C的差异 C编译器:保留原始函数名,无额外处理。例如: int add(int a, int b) { return a b; } 在汇编代码中仍为add。 C编译器:通过name mangling(名称修饰)生成唯一函数…...
BKA-CNN-GRU、CNN-GRU、GRU、CNN四模型多变量时序预测(Matlab)
BKA-CNN-GRU、CNN-GRU、GRU、CNN四模型多变量时序预测(Matlab) 目录 BKA-CNN-GRU、CNN-GRU、GRU、CNN四模型多变量时序预测(Matlab)预测效果基本介绍程序设计参考资料 预测效果 基本介绍 BKA-CNN-GRU、CNN-GRU、GRU、CNN四模型多…...
css基础之浮动相关学习
一、浮动基本介绍 在最初,浮动是用来实现文字环绕图片效果的,现在浮动是主流的页面布局方式之一。 效果/代码 图片环绕 代码 div {width: 600px;height: 400px;background-color: skyblue;}img {width: 200px;float: right;margin-right: 0.5em;}<…...
告别分库分表,时序数据库 TDengine 解锁燃气监控新可能
达成效果: 从 MySQL 迁移至 TDengine 后,设备数据自动分片,运维更简单。 列式存储可减少 50% 的存储占用,单服务器即可支撑全量业务。 毫秒级漏气报警响应时间控制在 500ms 以内,提升应急管理效率。 新架构支持未来…...
1.3 斐波那契数列模型:LeetCode 746. 使用最小花费爬楼梯
动态规划解最小花费爬楼梯问题:LeetCode 746. 使用最小花费爬楼梯 1. 题目链接 LeetCode 746. 使用最小花费爬楼梯 题目要求:给定一个整数数组 cost,其中 cost[i] 是从楼梯第 i 阶向上爬所需支付的费用。你可以从下标 0 或 1 的台阶开始爬&a…...
8.4考研408简单选择排序与堆排序知识点深度解析
考研408「简单选择排序与堆排序」知识点全解析 一、简单选择排序 1.1 定义与核心思想 简单选择排序(Selection Sort)是一种选择排序算法,其核心思想是: 每趟选择:从待排序序列中选择最小(或最大&#x…...
【个人笔记】用户注册登录思路及实现 springboot+mybatis+redis
基本思路 获取验证码接口 验证码操作用了com.pig4cloud.plugin的captcha-core这个库。 AccountControl的"/checkCode"接口代码,通过ArithmeticCaptcha生成一张验证码图片,通过text()函数得到验证码的答案保存到变量code,然后把图…...
LiteDB 数据存储与检索效率优化的最佳实践指导
一、引言 在当今数字化时代,数据处理和存储变得至关重要。对于小型项目或者嵌入式系统而言,需要一种轻量级、高效且易于使用的数据库解决方案。LiteDB 作为一款嵌入式的 NoSQL 数据库,因其零配置、易于集成等特点,受到了开发者的青睐。然而,若要充分发挥其性能优势,就需…...
WEB安全--RCE--RCE的绕过
一、回调函数的绕过(PHP) 1.1、回调函数 1.1.1、原理: 回调函数(Callback Function)指的是将函数名或匿名函数作为参数传递给另一个函数,从而在特定条件下调用该函数。 以一个常见的回调函数为例&#…...
uni-app:指引蒙层
组件说明 指引蒙层组件: 通过id标签,突出对应id中的模块; 可以自定义提示词。 点击任意位置关闭蒙层 效果展示和使用示例 切换id之后的效果: 代码实现 <template><view class="guide-mask" v-if="showMask" @click="hideMask"&g…...
什么是CMS?常用CMS有哪些?
一、内容管理系统(Content Management System) 什么是CMS:位于 Web 前端(服务器)和后端办公系统之间的软件系统,用于内容创建、编辑、审批和发布。支持文本、图片、视频、数据库等各类数字内容的管理…...
【Es】基础入门:开启全文搜索的大门
文章目录 一、Elasticsearch 是什么二、核心概念解读索引(Index)文档(Document)映射(Mapping)分片(Shard)副本(Replica) 三、基本操作入门安…...
74. Linux设备树详解
一、什么是设备树 1、uboot启动内核用到zImage,imx6ull-alientek-emmc.dtb。bootz 80800000 – 83000000. 80800000 —zImage 83000000—dtb 2、设备树:设备和树。 设备树(Device Tree),将这个词分开就是“设备”和“树”,描述设…...