Rust 在汽车 MCU 编程中的进展及安全特性剖析
在当今汽车行业,软件定义汽车的趋势正深刻改变着汽车的设计与用户体验。随着汽车电子系统复杂性的不断提升,对汽车微控制器(MCU)编程的安全性、可靠性和效率提出了更高要求。Rust 作为一种新兴的编程语言,凭借其独特的特性,在汽车 MCU 编程领域逐渐崭露头角,其在安全方面的表现更是备受关注。
一、Rust 在汽车 MCU 编程上的进展
(一)意法半导体与 HighTec 的合作成果
意法半导体(ST)与 HighTec EDV - Systeme 公司的合作成果显著。他们将 HighTec 的 Rust 编译器与意法半导体的 28 纳米 Stellar 微控制器相结合,为汽车行业带来了一套先进的解决方案。这一结合意义重大,Stellar 微控制器基于 Arm Cortex R2 + 内核,具备以安全为核心的硬件架构,且通过了 ISO 26262 ASIL D 级认证,同时符合 ISO 21434 网络安全标准以及 UN155 要求,满足了最新的安全规范。而 HighTec 的 Rust 编译器同样通过了 ISO 26262 ASIL D 级认证,它与 Stellar 微控制器的适配,使得开发者能够将 Rust 代码以及重要的 C/C++ 代码库集成到安全关键项目的 Stellar 芯片上。这不仅加快了安全关键的汽车系统的开发进程,缩短了产品上市时间,还确保了应用严格遵守汽车功能安全和网络安全要求。
HighTec 的 C/C++ 和 Rust 汽车级编译器,为构建汽车应用程序提供了便利。它能够将 Rust 在安全方面的优势与传统 C/C++ 代码进行集成,有助于开发人员充分利用意法半导体 Stellar MCU 的高可靠性和处理性能,适用于具有安全性和多核要求的实时控制环境应用,保障了系统的稳健性、安全性、高性能和数据安全性。
(二)英飞凌的积极推进
2023 年 3 月 7 日,英飞凌宣布其 32 位微控制器 AURIX™系列、TRAVEO™ T2G 系列和 PSoC™ MCU 系列支持 Rust 语言,成为全球领先正式支持 Rust 的半导体公司。英飞凌这一举措极大地推动了 Rust 在汽车 MCU 编程领域的应用。
对于 TRAVEO™,其使用官方 Rust 工具链和 Arm Cortex - M 目标编译器,而英飞凌的工具合作伙伴 HighTec EDV - Systeme 则为 AURIX™开发了专用 Rust 编译器。HighTec Rust 编译器专为 AURIX™ TC3xx 和 TC4x 微控制器量身定制,利用先进的开源 LLVM 技术,为具有安全、可靠、高性能和快速部署要求的应用提供全套 Rust 语言特性,包括内存安全、并发性和互操作性。并且,英飞凌后续还将对 PSoC 和 AURIX TC4x 提供支持,进一步完善其 Rust 生态系统。
英飞凌的 AURIX TC3xx 和 TRAVEO T2G MCU 产品系列本身就提供了广泛的用于功能安全和网络安全的集成硬件功能。引入 Rust 支持后,在软件层面上对这些硬件功能进行了补充。例如,为 AURIX 和 TRAVEO 提供了用于原生访问 MCU 外设的外设访问板条箱(PACS),这些 PACS 可通过工具 svd2rust 生成,并遵循相同的外设访问 API 标准。此外,在 GitHub 上还提供了代码示例,展示了如何在英飞凌 MCU 上使用 Rust,方便开发者学习和实践。
(三)实际项目中的应用案例
在实际项目中,Rust 也展现出了其独特的优势。例如,在一些自动驾驶 ECU 中间件软件的开发中,MCU 部分使用 RTOS 执行实时性要求最高的控制算法,以达到功能安全需要的 ASIL 等级。在这样的系统中,发布订阅服务完全使用 Rust 实现,其实现机制完全基于 Actor 模型,并使用了 Rust 社区知名的 Actor 库 Actix。中间件的底层 IPC 通讯使用 Apache Thrift 的 Rust 版本,提供了共享内存数据通道,让单系统内的多进程能得到更高效的数据传递。
在这个设计中,Rust 语言本身提供的内存安全机制,保证了绝大部分内存问题在编译期间被解决。Actor 设计模式一方面能提供高效的并发模型,另一方面,其监督者机制能够让出问题的 Actor 随时被重启而不影响系统的功能,从软件架构层级提高了软件的稳定性。同时,开发团队还开发了一个可以运行在 RTOS 中的轻量级 “Thrift 运行时” 的 C 语言实现,以及对应的代码生成工具,可以根据 Thrift IDL 生成 C 代码,并实现了 Linux 和 RTOS 之间的数据桥接。通过这样的设计,Rust 和 Actor 模式为系统提供了高性能和高稳定性,这也证明了 Rust 在汽车软件实际开发中的可行性和有效性。
二、Rust 在安全方面的优势
(一)内存安全保障突出
Rust 将内存安全置于首位,其独特的所有权系统规定同一时间只有一个实体可以访问一块内存。这种机制能有效防止许多与内存相关的错误,如缓冲区溢出、空指针解引用等。根据谷歌的安全博客数据,在 2019 年至 2022 年期间,使用 Rust 后内存安全漏洞从 223 个大幅减少到 85 个。如果在汽车固件和软件中广泛应用 Rust,预计汽车行业也会呈现类似的内存安全漏洞显著减少的趋势。在汽车电子系统中,内存安全问题至关重要,因为一个小的内存错误都可能导致严重的后果,例如影响车辆的行驶安全。
以汽车发动机控制单元为例,发动机的运行需要精确控制各种参数,如燃油喷射量、点火时间等。这些控制过程涉及大量的数据处理和内存操作,如果在内存管理上出现问题,如缓冲区溢出,可能导致错误的数据被写入内存,进而使发动机控制出现偏差,影响发动机性能,甚至可能引发安全事故。而 Rust 的内存安全特性可以有效降低因内存问题引发的故障风险,确保发动机控制单元的稳定运行,从而提高汽车电子系统的整体稳定性和可靠性。
(二)运行时效率与 C/C++ 媲美
在执行时间和内存占用方面,Rust 代码的运行时效率可与 C/C++ 相媲美。对于汽车 MCU 编程而言,这一点尤为重要。汽车电子系统对实时性要求极高,例如在发动机控制单元、制动系统等关键部件中,需要程序能够快速响应并高效运行。Rust 在保证内存安全的同时,不牺牲运行效率,使其能够很好地满足汽车 MCU 编程在性能方面的严苛要求,为汽车电子系统的高效运行提供了有力支持。
在汽车的制动系统中,当驾驶员踩下刹车踏板时,制动系统的 MCU 需要迅速处理各种传感器数据,计算出合适的制动力,并控制制动执行机构工作。这一过程对时间延迟极为敏感,稍有延迟就可能影响制动效果。Rust 代码能够以与 C/C++ 相当的效率运行,确保制动系统能够快速响应驾驶员的操作,保障行车安全。而且,Rust 在内存占用上也表现出色,在汽车 MCU 资源有限的情况下,能够合理利用内存,避免因内存占用过多导致系统性能下降。
(三)强大的类型系统和错误处理
Rust 拥有强大的类型系统,它能够在编译阶段检测出许多类型不匹配的错误。在传统的 C/C++ 编程中,类型错误可能在运行时才被发现,这增加了调试的难度和成本。而 Rust 的类型系统能够提前捕获这些错误,提高了代码的可靠性。例如,在定义变量时,Rust 要求明确指定变量的类型,并且在进行类型转换时,需要显式地进行转换操作,这避免了因隐式类型转换导致的错误。
同时,Rust 的错误处理机制也非常强大。它通过 Result 和 Option 枚举类型,提供了一种清晰、安全的方式来处理可能出现的错误。在汽车 MCU 编程中,经常会遇到各种可能出错的情况,如传感器数据读取失败、通信错误等。使用 Rust 的错误处理机制,开发人员可以清晰地定义函数可能返回的错误类型,并在调用函数时进行相应的错误处理,使代码更加健壮,增强了系统的稳定性。
(四)支持并发编程安全
随着汽车电子系统中多核处理器的应用越来越广泛,并发编程变得愈发重要。Rust 在并发编程方面提供了安全的支持,其所有权系统和借用规则能够有效防止数据竞争和死锁等并发问题。在传统的 C/C++ 并发编程中,开发人员需要手动管理锁机制,这容易出现因锁使用不当导致的死锁或数据竞争问题。而 Rust 通过编译器的检查,能够确保在并发环境下,内存访问的安全性。
例如,在汽车的信息娱乐系统中,可能同时存在多个任务,如播放音乐、导航计算、与手机进行蓝牙通信等。这些任务需要并发执行以提高用户体验。使用 Rust 进行编程,可以利用其并发编程特性,确保各个任务在共享资源时不会出现数据冲突,保证信息娱乐系统的稳定运行,为用户提供流畅的使用体验。
三、Rust 在安全方面的劣势
(一)学习曲线陡峭与 “不安全” 特性风险
Rust 的内存安全机制基于全新的所有权等原则,与传统编程语言差异较大,这使得开发人员需要花费更多时间和精力去学习和掌握,从而导致了较陡峭的学习曲线。对于习惯了 C/C++ 编程的汽车行业开发人员来说,理解和适应 Rust 的所有权、借用规则以及生命周期等概念并非易事。这在一定程度上增加了软件开发项目的前期成本和时间投入。例如,开发团队可能需要安排专门的培训课程,让开发人员学习 Rust,并且在项目初期,开发人员可能会因为对 Rust 不熟悉而导致开发效率低下。
并且,Rust 包含 “unsafe ()” 特性,该特性旨在处理一些无法严格遵循 Rust 内存安全规则的特殊情况。然而,这一特性存在被滥用的风险,如果开发人员在不必要的情况下使用该特性,绕过编译器检查,就可能会在代码中留下安全隐患,使得原本因 Rust 特性而避免的内存安全问题重新出现。例如,一些开发人员可能为了追求代码的执行效率,在并非必要的情况下使用 “unsafe ()” 块,从而引入潜在的内存错误,降低了代码的安全性。
(二)语言及工具链存在漏洞风险
尽管 Rust 致力于解决内存安全问题,但 Rust 语言本身及其工具链并非无懈可击。例如,在 2024 年 4 月,曾披露了一个被标识为 CVE - 2024 - 24576 的严重漏洞,该漏洞允许在 Windows 环境中通过 cmd.exe 执行任意代码。此外,编译器生成的机器代码也可能与语言规范不完全一致,或者包含错误,这些都可能在编译过程中引入安全风险,危及源代码的安全性。在汽车 MCU 编程中,任何潜在的漏洞都可能对车辆的安全性造成严重威胁,因此 Rust 语言及工具链的这些漏洞风险不容忽视。
在汽车的自动驾驶系统中,软件的安全性至关重要。如果 Rust 工具链中存在漏洞,可能导致编译后的代码存在安全隐患,在自动驾驶过程中,这些隐患可能引发系统故障,如错误的路径规划、对障碍物的误判等,从而严重威胁行车安全。而且,一旦发现 Rust 语言或工具链中的漏洞,修复这些漏洞并确保其不会对已开发的汽车软件造成负面影响,也是一个复杂且耗时的过程。
(三)生态系统及第三方库带来的安全隐患
Rust 生态系统相对较新,在发展过程中依赖于其他更成熟语言的组件。在复用其他语言组件时,虽然可能会加快开发速度,但这也可能损害 Rust 本身的安全特性。例如,调用其他语言的函数可能会使 Rust 的内存安全保证失效。类似于 Node 包管理器(NPM)生态系统中曾出现的恶意软件包事件,在 Rust 生态系统中也可能发生。在开发汽车电子控制单元(ECU)固件时,如果大量使用第三方库,虽然能够加快交付速度,但也极有可能引入潜在的安全漏洞,对汽车系统的安全性构成威胁。
在开发汽车的电池管理系统时,可能会使用一些第三方的 Rust 库来处理电池数据的采集和分析。如果这些第三方库存在安全漏洞,比如存在数据泄露风险或者对电池状态的误判逻辑,那么可能会导致电池管理系统出现故障,影响电池的使用寿命,甚至可能引发电池过热等安全问题。而且,由于 Rust 生态系统中第三方库的质量参差不齐,开发人员在选择和使用第三方库时,需要花费大量时间进行审查和测试,以确保其安全性。
(四)无法应对非内存相关安全问题
虽然 Rust 在解决内存相关安全问题上表现出色,但在整个软件安全领域,内存相关问题只是其中一部分。在 2023 年十大常见弱点枚举(CWE)中,内存相关问题仅占一半,这意味着另一半的安全问题与内存安全无关。Rust 无法缓解诸如输入验证不足等设计缺陷,而这类缺陷可能导致命令注入或通过路径遍历进行未经授权的访问。例如,在汽车的远程控制系统中,如果对用户输入的指令没有进行充分的验证,黑客就可能通过发送恶意指令,实现对车辆的非法控制。
此外,Rust 对于针对硬件的攻击,如侧信道攻击(利用系统物理实现泄露的信息)或故障注入(故意向系统中引入错误),也无能为力。例如,2023 年 8 月,柏林工业大学的研究人员成功对特斯拉的硬件进行了电压毛刺攻击,绕过了安全启动协议,此类攻击就超出了 Rust 能够防范的范围。在汽车面临越来越多网络安全威胁的今天,Rust 在非内存相关安全问题上的局限性,使得其在保障汽车系统全面安全方面存在一定的不足。
四、应对 Rust 在汽车 MCU 编程中安全劣势的策略
(一)针对学习曲线和 “不安全” 特性的策略
针对 Rust 学习曲线陡峭的问题,汽车行业的企业可以采取一系列措施。首先,组织内部培训课程,邀请 Rust 领域的专家为开发人员进行系统的培训,从基础知识到实际项目案例,逐步引导开发人员掌握 Rust 编程。其次,可以鼓励开发人员参与开源的 Rust 汽车项目,通过实践来加深对 Rust 的理解和运用。同时,建立内部的 Rust 开发社区,让开发人员可以在社区中交流经验、分享问题解决方案,促进共同学习和成长。
对于 “unsafe ()” 特性的滥用风险,企业应制定严格的代码审查制度。在代码审查过程中,重点关注 “unsafe ()” 块的使用情况,要求开发人员详细说明使用该特性的必要性和安全性措施。对于不必要的 “unsafe ()” 使用,及时进行纠正。此外,开发团队可以封装一些安全的 Rust 库,将常用的功能进行抽象,避免开发人员在不必要的情况下直接使用 “unsafe ()” 特性,降低代码的安全风险。
(二)应对语言及工具链漏洞的策略
为了应对 Rust 语言及工具链可能存在的漏洞,企业需要密切关注 Rust 官方发布的安全公告,及时了解和评估新出现的漏洞对汽车项目的影响。建立漏洞预警机制,一旦发现相关漏洞,能够迅速采取措施。例如,及时更新 Rust 编译器和工具链版本,以获取修复漏洞的补丁。同时,在每次更新后,进行全面的回归测试,确保更新不会对已有的汽车软件功能造成负面影响。
此外,企业可以投入一定资源参与 Rust 社区的安全研究,与 Rust 开发者共同探讨和解决潜在的安全问题。通过反馈使用过程中发现的问题,为 Rust 语言及工具链的完善贡献力量,同时也能提高自身在应对相关漏洞时的能力和话语权。
(三)解决生态系统及第三方库安全隐患的策略
在使用 Rust 生态系统中的第三方库时,企业应建立严格的第三方库审查流程。在引入第三方库之前,对其进行全面的安全审查,包括代码质量、漏洞扫描、依赖关系分析等。选择知名、活跃且有良好口碑的第三方库,降低安全风险。并且,定期对已使用的第三方库进行更新和安全复查,确保其安全性始终得到保障。
另外,企业可以考虑自主开发一些核心的 Rust 库,减少对外部第三方库的依赖。对于一些关键的汽车软件功能,如车辆控制算法、安全通信协议等,通过自主开发库来实现,这样可以更好地控制代码的安全性和质量。同时,在开发过程中,遵循严格的安全规范和设计原则,提高代码的可靠性。
(四)弥补非内存相关安全问题防护不足的策略
针对 Rust 无法应对非内存相关安全问题的局限性,企业需要在整体软件设计和安全防护体系上进行补充。在软件设计阶段,加强对输入验证、访问控制等方面的设计,采用安全的设计模式和架构,避免出现常见的设计缺陷。例如,在设计汽车信息娱乐系统的用户交互模块时,对用户输入进行严格的格式验证和权限检查,防止恶意输入导致的安全问题。
在安全防护体系方面,引入其他安全工具和技术。例如,使用入侵检测系统(IDS)来监测车辆网络中的异常流量,及时发现和阻止可能的攻击行为。对于硬件层面的攻击,采用硬件防护技术,如加固硬件设计、增加物理防护措施等,降低硬件被攻击的风险。通过综合运用多种安全手段,弥补 Rust 在非内存相关安全问题防护上的不足,构建全面的汽车系统安全防护体系。
Rust 在汽车 MCU 编程领域已经取得了一定的进展,并且在内存安全保障、运行时效率、类型系统和并发编程等方面展现出明显优势。然而,其在安全方面也存在诸多劣势,如学习曲线、“不安全” 特性、语言及工具链漏洞、生态系统与第三方库隐患以及对非内存相关安全问题的局限性等。在未来汽车 MCU 编程中应用 Rust 时,需要充分权衡其优势与劣势。
相关文章:
Rust 在汽车 MCU 编程中的进展及安全特性剖析
在当今汽车行业,软件定义汽车的趋势正深刻改变着汽车的设计与用户体验。随着汽车电子系统复杂性的不断提升,对汽车微控制器(MCU)编程的安全性、可靠性和效率提出了更高要求。Rust 作为一种新兴的编程语言,凭借其独特的…...
Pytorch 第十四回:神经网络编码器——变分自动编解码器
Pytorch 第十四回:神经网络编码器——变分自动编解码器 本次开启深度学习第十四回,基于Pytorch的神经网络编码器。本回分享VAE变分自动编码器。在本回中,通过minist数据集来分享如何建立一个变分自动编码器。接下来给大家分享具体思路。 本次…...
hive排序函数
在 Hive 中,排序可以通过几种不同的方法来实现,通常依赖于 ORDER BY 或 SORT BY 等函数。这里简要介绍这几种排序方法: 1. ORDER BY ORDER BY 用于对结果集进行全局排序。它会将所有数据加载到一个节点进行排序,因此可能会导致性能问题,尤其是在数据量很大的时候。 语法…...
Android测试王炸:Appium + UI Automator2
Android平台主流开源框架简介 在Android平台上,有多个开源且好用的自动化测试框架。以下是几个被广泛使用和认可的框架: 1.1 Appium Appium是一个跨平台的移动测试工具,支持iOS和Android上的原生、混合及移动Web应用。 它使用了供应商提供的…...
用Python打造增强现实的魔法:实时对象叠加系统全解析
友友们好! 我是Echo_Wish,我的的新专栏《Python进阶》以及《Python!实战!》正式启动啦!这是专为那些渴望提升Python技能的朋友们量身打造的专栏,无论你是已经有一定基础的开发者,还是希望深入挖掘Python潜力的爱好者,这里都将是你不可错过的宝藏。 在这个专栏中,你将会…...
const let var 在react jsx中的使用方法 。
在 JavaScript 里,const 和 let 都是 ES6(ES2015)引入的用于声明变量的关键字,它们和之前的 var 关键字有所不同。下面为你详细介绍 const 和 let 的区别: 1. 块级作用域 const 和 let 都具备块级作用域,…...
C++隐式转换的机制、风险与消除方法
引言 C作为一门强类型语言,类型安全是其核心特性之一。 然而,隐式转换(Implicit Conversion)的存在既为开发者提供了便利,也可能成为程序中的“隐藏炸弹”。 一、隐式转换的定义与分类 1.1 什么是隐式转换…...
Python 为什么要保留显式的 self ?
当你在类中定义方法时,Python要求第一个参数必须表示当前对象实例。当你调用obj.method(),Python 本质上会将它转换为ClassName.method(obj)。 所以你需要通过self参数显式接收这个实例,才能访问该对象的属性和其他方法。如果不加self&#…...
Linux 性能调优之CPU认知
写在前面 博文内容为《性能之巅 系统、企业与云可观测性(第2版)》CPU 章节课后习题答案整理内容涉及: CPU 术语,指标认知CPU 性能问题分析解决CPU 资源负载特征分析应用程序用户态CPU用量分析理解不足小伙伴帮忙指正对每个人而言,真正的职责只有一个:找到自我。然后在心中…...
认识vue中的install和使用场景
写在前面 install 在实际开发中如果你只是一个简单的业务实现者,那么大部分时间你是用不到install的,因为你用到的基本上都是别人封装好的插件、组件、方法、指令等等,但是如果你需要给公司的架构做建设,install就是你避不开的一个…...
C++Cherno 学习笔记day17 [66]-[70] 类型双关、联合体、虚析构函数、类型转换、条件与操作断点
b站Cherno的课[66]-[70] 一、C的类型双关二、C的union(联合体、共用体)三、C的虚析构函数四、C的类型转换五、条件与操作断点——VisualStudio小技巧 一、C的类型双关 作用:在C中绕过类型系统 C是强类型语言 有一个类型系统,不…...
3.神经网络
神经网络 神经元与大脑 神经网络神经元的结构: 输入(Input):接收来自前一层神经元的信息。 权重(Weights):每个输入都有一个权重,表示其重要性。 加权和(Weighted Sum&a…...
CentOS 7安装Python3.12
文章目录 使用pyenv安装python3.12一、gitub下载pyenv二、升级GCC三.升级openssl这样python3.12.9就完成安装在CentOS上啦! 使用pyenv安装python3.12 一、gitub下载pyenv https://github.com/pyenv/pyenv 按照README,pyenv教程安装即可 二、升级GCC 安…...
微服务无感发布实践:基于Nacos的客户端缓存与故障转移机制
微服务无感发布实践:基于Nacos的客户端缓存与故障转移机制 背景与问题场景 在微服务架构中,服务的动态扩缩容、滚动升级是常态,而服务实例的上下线需通过注册中心(如Nacos)实现服务发现的实时同步。但在实际生产环境…...
5.2 自定义通知操作按钮(UNNotificationAction)
在本地推送通知中添加自定义操作按钮可以增强用户交互性,让用户无需打开应用就能执行一些快速操作。本节将详细介绍如何在SwiftUI应用中实现这一功能。 基本概念 UNNotificationAction 和 UNNotificationCategory 是UserNotifications框架中用于定义通知交互的核心…...
Python与链上数据分析:解锁区块链数据的潜力
Python与链上数据分析:解锁区块链数据的潜力 引言 区块链技术的兴起不仅改变了金融行业,也为数据分析领域带来了全新的机遇。链上数据(On-chain Data)是区块链网络中公开透明的交易记录和活动数据,它为我们提供了一个独特的视角,去观察用户行为、市场趋势以及网络健康状…...
数字化转型:未来已来,企业如何抢占先机?
近年来,“数字化转型”从一个技术热词逐渐演变为各行各业的“必选项”。无论是全球市场还是中国市场,数字化浪潮正以不可逆的姿态重塑商业生态。据IDC预测,到2028年,中国数字化转型市场规模将突破7300亿美元,全球投资规…...
Web3游戏全栈开发实战指南:智能合约与去中心化生态构建全解析
在GameFi市场规模突破千亿美元的当下,去中心化游戏系统开发正面临技术架构升级与生态融合的双重机遇。本文基于Solidity、Rust等多链智能合约开发经验,结合Truffle、Hardhat等主流框架,深度解析如何构建高性能、高收益的链游生态系统。 一、…...
Windows 图形显示驱动开发-WDDM 2.0功能_IoMmu 模型
概述 输入输出内存管理单元 (IOMMU) 是一个硬件组件,它将支持具有 DMA 功能的 I/O 总线连接到系统内存。 它将设备可见的虚拟地址映射到物理地址,使其在虚拟化中很有用。 在 WDDM 2.0 IoMmu 模型中,每个进程都有一个虚拟地址空间࿰…...
uniapp微信小程序基于wu-input二次封装TInput组件(支持点击下拉选择、支持整数、电话、小数、身份证、小数点位数控制功能)
一、 最终效果 二、实现了功能 1、支持输入正整数---设置specifyTypeinteger 2、支持输入数字(含小数点)---设置specifyTypedecimal,可设置decimalLimit来调整小数点位数 3、支持输入手机号--设置specifyTypephone 4、支持输入身份证号---设…...
Java 大厂面试题 -- JVM 深度剖析:解锁大厂 Offe 的核心密钥
最近佳作推荐: Java大厂面试高频考点|分布式系统JVM优化实战全解析(附真题)(New) Java大厂面试题 – JVM 优化进阶之路:从原理到实战的深度剖析(2)(New&#…...
小白入门JVM、字节码、类加载机制图解
前提知识~ JDK 基本介绍 JDK 的全称(Java Development Kit Java 开发工具包)JDK JRE java 的开发工具[java, javac,javadoc,javap 等]JDK 是提供给Java 开发人员使用的,其中包含了java 的开发工具,也包括了JRE。可开发、编译、调试…… JRE 基本介绍…...
新能源汽车动力性与经济性优化中的经典数学模型
一、动力性优化数学模型 动力性优化的核心目标是提升车辆的加速性能、最高车速及爬坡能力,主要数学模型包括: 1. 车辆纵向动力学模型 模型方程: 应用场景: 计算不同工况下的驱动力需求匹配电机扭矩与减速器速比案例ÿ…...
高级java每日一道面试题-2025年3月25日-微服务篇[Nacos篇]-Nacos中的命名空间(Namespace)有什么作用?
如果有遗漏,评论区告诉我进行补充 面试官: Nacos中的命名空间(Namespace)有什么作用? 我回答: 在Java高级面试中,关于Nacos中的命名空间(Namespace)的作用,是一个考察候选人对微服务架构和配…...
5.JVM-G1垃圾回收器
一、什么是G1 二、G1的三种垃圾回收方式 region默认2048 三、YGC的过程(Step1) 3.1相关代码 public class YGC1 {/*-Xmx128M -XX:UseG1GC -XX:PrintGCTimeStamps -XX:PrintGCDetails -XX:UnlockExperimentalVMOptions -XX:G1LogLevelfinest128m5% 60%6.4M 75M*/private stati…...
变量、数据、值类型引用类型的存储方式
代码写了也有2年了,对于这些基础的程序名词,说出口也是模棱两可,心里很不爽,很多基础还是模糊不清,清算一下...... Example值类型: int x 10; 变量:“x”是一个标识符,它对应着栈…...
分布式和微服务的区别
1. 定义 在讨论分布式系统和微服务的区别之前,我们先明确两者的定义: 分布式系统:是一组相互独立的计算机,通过网络协同工作,共同完成某个任务的系统。其核心在于资源的分布和任务的分解。 微服务架构:是…...
数组的常见算法一
注: 本文来自尚硅谷-宋红康仅用来学习备份 6.1 数值型数组特征值统计 这里的特征值涉及到:平均值、最大值、最小值、总和等 **举例1:**数组统计:求总和、均值 public class TestArrayElementSum {public static void main(String[] args)…...
Leedcode刷题 | Day27_贪心算法01
一、学习任务 455.分发饼干代码随想录376. 摆动序列53. 最大子序和 二、具体题目 1.455分发饼干455. 分发饼干 - 力扣(LeetCode) 假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。 对…...
springboot集成kafka,后续需要通过flask封装restful接口
Spring Boot与Kafka的整合 在现代软件开发中,消息队列是实现服务解耦、异步消息处理、流量削峰等场景的重要组件。Apache Kafka是一个分布式流处理平台,它具有高吞吐量、可扩展性和容错性等特点。Spring Boot作为一个轻量级的、用于构建微服务的框架&am…...
MYSQL数据库语法补充2
一,数据库设计范式(原则) 数据库设计三大范式: 第一范式: 保证列的原子性(列不可再分) 反例:联系方式(手机,邮箱,qq) 正例: 手机号,qq,邮箱. 第二范式: 要有主键,其他列依赖于主键列,因为主键是唯一的,依赖了主键,这行数据就是唯一的. 第三范式: 多表关联时,在…...
Flask返回文件方法详解
在 Flask 中返回文件可以通过 send_file 或 send_from_directory 方法实现。以下是详细方法和示例: 1. 使用 send_file 返回文件 这是最直接的方法,适用于返回任意路径的文件。 from flask import Flask, send_fileapp = Flask(__name__)@app.route("/download")…...
随机数据下的最短路问题(Dijstra优先队列)
题目描述 给定 NN 个点和 MM 条单向道路,每条道路都连接着两个点,每个点都有自己编号,分别为 1∼N1∼N 。 问你从 SS 点出发,到达每个点的最短路径为多少。 输入描述 输入第一行包含三个正整数 N,M,SN,M,S。 第 22 到 M1M1 行…...
CPP杂项
注意:声明类,只是告知有这个类未完全定义,若使用类里具体属性,要么将访问块(函数之类)放到定义后,要么直接完全定义 C 友元函数/类的使用关键点(声明顺序为核心) 1. 友元…...
Idea将Java工程打包成war包并发布
1、问题概述? 项目开发之后,我们需要将Java工程打包成war后缀,并进行发布。之前在网上看到很多的文章,但是都不齐全,今天将提供一个完整的实现打包war工程,并发布的文章,希望对大家有所帮助,主要解决如下问题: 1、war工程需要满足的相关配置 2、如何解决项目中的JDK…...
多级缓存模型设计
为了有效避免缓存击穿、穿透和雪崩的问题。最基本的缓存设计就是从数据库中查询数据时,无论数据库中是否存在数据,都会将查询的结果缓存起来,并设置一定的有效期。后续请求访问缓存时,如果缓存中存在指定Key时,哪怕对应…...
SGLang实战:从KV缓存复用到底层优化,解锁大模型高效推理的全栈方案
在当今快速发展的人工智能领域,大型语言模型(LLM)的应用已从简单对话扩展到需要复杂逻辑控制、多轮交互和结构化输出的高级任务。面对这一趋势,如何高效地微调并部署这些大模型成为开发者面临的核心挑战。本文将深入探讨SGLang——这一专为大模型设计的高…...
【中大厂面试题】腾讯 后端 校招 最新面试题
操作系统 进程和线程的区别 本质区别:进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位 在开销方面:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销&am…...
数据结构第六章(一) -图
数据结构第六章(一) 图一、图的基本概念1.图的分类、度、权等2.路径、回路、连通等3.连通分量、生成树等 二、几种特殊的图1.完全图2.稠密图、稀疏图3.树、有向树 三、常见考点总结 图 一、图的基本概念 感觉要想怎么定义图,图就是顶点和边组…...
【技术白皮书】外功心法 | 第三部分 | 数据结构与算法基础(常用的数据结构)
数据结构与算法基础 什么是算法?算法效率查询和排序为什么排序如此重要?思考问题如何确定复杂性数据结构连续或链接的数据结构链表的优点数组的优点数组集合Set 声明的一些方法有Multiset多元集合栈和队列何时使用栈和队列数据字典字典Hash的实现时间复杂度对时间的影响什么是…...
spark简介和安装
spark概念 Spark 是一种基于内存的快速、通用、可扩展的大数据分析计算引擎 spark核心模块 Spark Core Spark Core 中提供了 Spark 最基础与最核心的功能,Spark 其他的功能如:Spark SQL,Spark Streaming,GraphX, MLlib 都是在 …...
如何在 CentOS 7 系统上以容器方式部署 GitLab,使用 ZeroNews 通过互联网访问 GitLab 私有仓库,进行代码版本发布与更新
第 1 步: 部署 GitLab 容器 在开始部署 GitLab 容器之前,您需要创建本地目录来存储 GitLab 数据、配置和日志: #创建本地目录 mkdir -p /opt/docker/gitlab/data mkdir -p /opt/docker/gitlab/config mkdir -p /opt/docker/gitlab/log#gi…...
springboot Filter实现请求响应全链路拦截!完整日志监控方案
一、为什么你需要这个过滤器? 日志痛点: 🚨 请求参数散落在各处? 🚨 响应数据无法统一记录? 🚨 日志与业务代码严重耦合? 解决方案: 一个Filter同时拦截请…...
spring mvc 在拦截器、控制器和视图中获取和使用国际化区域信息的完整示例
在拦截器、控制器和视图中获取和使用国际化区域信息的完整示例 1. 核心组件代码示例 1.1 配置类(Spring Boot) import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.spring…...
docker部署jenkins并成功自动化部署微服务
一、环境版本清单: docker 26.1.4JDK 17.0.28Mysql 8.0.27Redis 6.0.5nacos 2.5.1maven 3.8.8jenkins 2.492.2 二、服务架构:有gateway,archives,system这三个服务 三、部署步骤 四、安装linux 五、在linux上安装redis&#…...
android 14.0 工厂模式 测试音频的一些问题(高通)
1之前用tinycap,现在得用agmcap 执行----agmcap /data/test.wav -D 100 -d 101 -i CODEC_DMA-LPAIF_RXTX-TX-3 -T 3 报错1 agmcap data/test.wav -D 100 -d 101 -i CODEC_DMA-LPAIF_RXTX-TX-3 -T 3 Failed to open xml file name /vendor/etc/backend_co…...
vue:前端预览 / chrome浏览器设置 / <iframe> 方法预览 doc、pdf / vue-pdf 预览pdf
一、本文目标 <iframe> 方法预览 pdf 、word vue-pdf 预览pdf 二、<iframe> 方法 2.1、iframe 方法预览需要 浏览器 设置为: chrome:设置-隐私设置和安全性-网站设置-更多内容设置-PDF文档 浏览器访问: chrome://settings/co…...
Axure疑难杂症:详解横向菜单左右拖动效果及阈值说明
亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢! 课程主题:横向菜单左右拖动 主要内容:菜单设计、拖动效果、阈值设计 应用场景:APP横向菜单栏、台账菜单栏、功能选择栏等 案例展示: 案例视频: 横向菜单左右拖动效果 正文内容: 最近很多粉丝私信我,横向…...
多视图几何--立体校正--Bouguet方法
Bouguet算法的数学原理详解 Bouguet算法的核心目标是实现双目相机的极线校正,使左右图像的对应点位于同一水平线上,从而简化立体匹配。其数学原理围绕旋转矩阵分解、极线约束构造和重投影优化展开,以下是分步推导: 一、坐标系定义…...
debian12 mysql完全卸载
MySQL 的数据目录通常是 /var/lib/mysql,配置文件通常在 /etc/mysql 目录下。使用以下命令删除这些目录: sudo rm -rf /var/lib/mysql sudo rm -rf /etc/mysql清理残留文件 sudo find / -name "mysql*" -exec rm -rf {} \; 2>/dev/null验…...