DP读书:鲲鹏处理器 架构与编程(十四)ACPI与软件架构具体调优
一分钟速通ACPI和鲲鹏软件移植
- 操作系统内核
- 鲲鹏软件移植
- 鲲鹏软件移植流程
- 编译工具选择
- 编译参数移植案例
- 源码修改案例
- 鲲鹏分析扫描工具 Dependency Advisor
- 鲲鹏代码迁移工具 Porting Advisor
- 鲲鹏软件性能调优
- 鲲鹏软件性能调优流程
- CPU与内存子系统性能调优
- 网络子系统性能调优
- 磁盘I/O子系统性能调优
- 应用程序性能调优
- 基础软件性能调优
- 鲲鹏性能优化工具 Tuning Kit
操作系统内核
ACPI(Advanced Configuration and Power Interface)
是一种由英特尔、微软、惠普、索尼等公司共同开发的电源管理标准。它提供了一种通用的电源管理接口,用于管理计算机系统的电源状态、性能和配置等方面。
在计算机系统中,ACPI负责处理电源管理事件,例如系统启动、关机、休眠、唤醒等。它还提供了对硬件设备、散热设备、电池和其他设备的控制能力。
ACPI在计算机系统中扮演着重要的角色,它能够提高系统的能源效率和延长电池寿命,同时提供更好的系统性能和稳定性。
ARM64平台的Device Tree定义在Linux源码的arch/arm64/boot/dts/
目录下。Device Tree是用于描述系统硬件的一种数据结构,它被用于在引导过程中初始化硬件。
下面是一个简单的ARM64平台Device Tree的示例,这是一个虚拟设备树,只为了理解基本概念。在实际设备树中,会有更多详细的属性和配置。
对不起,我不能直接处理C语言的代码。但是我可以帮你理解一个ARM64平台设备树(Device Tree)的基本结构,并且我可以给你一个例子。
git clone https://github.com/torvalds/linux.git
cd linux
cd scripts/dtc/make
sudo make install PREFIX=/usr/local// SPDX-License-Identifier: GPL-2.0
/** Example Device Tree for ARM64 SoC** This is a simple example showing the basic structure of a Device Tree for an ARM64 platform.*//dts-v1/;/ {compatible = "example,arm64";model = "Example ARM64 SoC";memory@80000000 {device_type = "memory";reg = <0x0 0x80000000 0x0 0x80000000>; // 2 GiB of memory starting from 0x80000000};chosen {bootargs = "console=ttyAMA0,115200";};uart@9000000 {compatible = "example,uart";reg = <0x0 0x9000000 0x0 0x1000>;interrupt-parent = <&gic>;interrupts = <0 13 4>; // interrupt number 13, active high, level triggered};gic: interrupt-controller {compatible = "example,gic-v3";interrupt-controller;#interrupt-cells = <3>;interrupt-parent = <&gic_cpuif>;};gic_cpuif: interrupt-controller@5000 {compatible = "example,gic-v3-cpuif";reg = <0x0 0x5000 0x0 0x1000>;interrupts = <0 8 1>; // interrupt number 8, active high, edge triggeredinterrupt-parent = <&gic>;};
};
鲲鹏软件移植
鲲鹏软件移植流程
鲲鹏软件移植流程包括以下步骤:
- 准备JDK:安装ARM版本JDK。
- 配置环境变量:配置JDK路径等环境变量。
- 编译:Java源码生成字节码。
- 测试:启动Java程序,调试功能。
以上就是鲲鹏软件移植的完整流程
编译工具选择
编译工具的选择主要取决于你使用的编程语言和开发环境。以下是一些常见的编译工具:
- Microsoft Visual Studio:这是一个完整的开发工具集,适用于C/C++/C#等编程语言,适用于微软支持的所有平台。它包括了UML工具、代码管控工具、集成开发环境(IDE)等,是一个非常实用且强大的代码编写开发软件。
- GCC:GNU Compiler Collection(GCC)是一个用于编程语言编译的软件,它支持C、C++、Objective-C、Fortran、Ada等语言。
- Clang:Clang是一个基于LLVM的C/C++/Objective-C编译器,它主要用于优化编译效率和代码质量。
- Java Development Kit (JDK):如果你正在开发Java应用程序,那么你需要JDK,它包含了Java编译器(Javac)和其他工具。
- Python解释器和编译器:Python是一种解释型语言,因此它不需要编译器。但是,Python有各种解释器和编译器,如CPython、Jython、IronPython等。
这只是其中的一部分,实际上还有很多其他的编译工具可供选择。你应该根据自己的具体需求和习惯来选择适合你的编译工具。
编译参数移植案例
在编译过程中,一些特定的编译参数可能会影响到编译的结果和适应性。以下是一些编译参数的案例,这些参数在移植过程中可能会起到关键作用:
1. -march 和 -mtune:这两个参数用于指定目标处理器架构。例如,-march=native 将使编译器优化为运行在本地硬件上,而 -march=x86_64 将优化为运行在64位x86处理器上。
2. -fPIC (Position-Independent Code):该参数用于生成位置无关的代码,这在实现共享库时非常重要。
3. -I:该参数用于指定头文件的搜索路径。在移植过程中,可能需要修改此参数以适应新的环境。
4. -L:该参数用于指定库文件的搜索路径。同样,在移植过程中,可能需要修改此参数。
5. -l:该参数用于指定要链接的库。这可能涉及到链接到不同的库文件,以适应新的环境。
6. -D:该参数用于定义宏。在移植过程中,可能需要定义新的宏以适应新的环境。
请注意,以上只是一些常见的编译参数示例,实际上还有许多其他的编译参数可以在移植过程中使用。具体的参数选择将取决于你的需求和目标平台的具体情况。
源码修改案例
源码修改案例主要是针对特定的需求或问题,对程序源代码进行修改和优化。以下是一个简单的源码修改案例:
假设我们有一个C语言程序,其中有一个函数名为 calculate_average
,它接收一个整数数组和数组的长度作为输入,计算数组的平均值并返回结果。
double calculate_average(int* arr, int length) {double sum = 0.0;for (int i = 0; i < length; i++) {sum += arr[i];}return sum / length;
}
现在我们想要修改这个函数,使其能够忽略数组中的任何负数并直接跳过计算。我们可以添加一个简单的判断语句来实现这个功能。
double calculate_average(int* arr, int length) {double sum = 0.0;for (int i = 0; i < length; i++) {if (arr[i] >= 0) {sum += arr[i];}}return sum / length;
}
通过这个修改,函数现在只会计算数组中的非负数,并返回它们的平均值。这可以应用于任何包含负数的数组,以忽略它们并获得更准确的结果。
请注意,这只是一个简单的例子,实际的源码修改可能会更加复杂和涉及更多的细节。在修改源代码之前,建议进行充分的测试和备份(在虚拟机上跑没问题再上),以确保修改不会引入错误或破坏原始功能。
鲲鹏分析扫描工具 Dependency Advisor
Dependency Advisor 是一款可以简化客户应用迁移到鲲鹏服务器过程的工具。它主要安装在X86服务器上,用于分析可移植性和移植投入。该工具支持检查用户软件资源包(RPM、JAR、TAR、zip、gzip 文件)中包含的 SO 依赖库,并评估 SO 依赖库的可移植性;检查指定的用户软件安装路径下的 SO 依赖库,并评估 SO 依赖库的可移植性;检查用户软件 C/C++ 软件构建工程文件,并评估该文件的可移植性;以及检查用户软件 C/C++ 源码,并评估软件源文件的可移植性。
此外,Dependency Advisor 会自动分析并输出指导报告,提供软件移植报告以及移植工作量评估。它还支持命令行方式和 Web 两种工作模式。
鲲鹏代码迁移工具 Porting Advisor
Porting Advisor 是一款可以帮助开发者将应用从 x86 平台迁移到鲲鹏平台的代码迁移工具。具体功能包括:
- 分析可迁移性:Porting Advisor 可以分析用户的源代码以及相关依赖,判断其是否可以迁移到鲲鹏平台。
- 自动分析:Porting Advisor 可以自动分析出需要修改的代码内容,并给出修改建议。
- 提供指导:Porting Advisor 可以帮助开发者解决在迁移过程中遇到的问题,提供相应的解决方案。
使用 Porting Advisor 进行代码迁移可以降低人工排查的工作量,提高整体迁移效率。
鲲鹏软件性能调优
鲲鹏软件性能调优流程
鲲鹏软件性能调优流程包括以下步骤:
- 建立基准:在优化或监视开始之前,首先要建立一个基准数据和优化目标。这包括硬件配置、组网、测试模型、系统运行数据(CPU/内存/IO/网络吞吐/响应延时等)。我们需要对系统做全面的评估和监控,才能更好的分析系统性能瓶颈,以及实施优化措施后系统的性能变化。优化目标即是基于当前的软硬件架构所期望系统达成的性能目标。
- 压力测试与监视瓶颈:使用峰值工作负载或专业的压力测试工具,对系统进行压力测试。使用一些性能监视工具观察系统状态。在压力测试期间,建议详细记录系统和程序的运行状态,精确的历史记录将更有助于分析瓶颈和确认优化措施是否有效。
- 性能分析:基于压力测试的结果,进行性能分析,找出性能瓶颈。这包括查找CPU、内存、I/O、网络等方面的瓶颈。
- 优化:根据性能分析的结果,采取相应的优化措施。优化的具体方法可能因系统和应用的不同而有所不同。
- 再测试:在实施优化措施后,需要重新进行压力测试和性能监视,确认优化效果。
- 迭代:性能调优是一个反复迭代的过程,需要持续进行,不断优化系统的性能。
以上就是鲲鹏软件性能调优的一般流程,具体实施时可能需要根据具体情况进行调整。
CPU与内存子系统性能调优
为了进行CPU和内存子系统的性能调优,可以采取以下措施:
-
CPU方面:
- 多线程优化:合理地利用多线程,将计算任务划分为多个线程并行执行,充分利用多核CPU的性能。
- 减少上下文切换:减少线程之间的频繁切换,避免由于上下文切换带来的开销。
- 缓存优化:充分利用CPU缓存,避免缓存未命中带来的性能损失。例如,使用局部性原理优化数据访问模式,减少缓存未命中。
-
内存方面:
- 内存分配优化:合理设置内存分配策略,避免频繁的内存分配与释放。可以采用对象池、内存池等技术来优化内存管理。
- 内存访问模式优化:充分利用局部性原理,优化内存的访问模式。例如,通过连续访问、对齐访问等方式减少内存访问的随机性。
- 内存压缩与分片:对于内存占用较大的数据结构或对象,可以考虑进行内存压缩或分片,以减少内存占用和提高访问效率。
另外,还可以通过性能监控和性能分析工具,对CPU和内存子系统进行监测和分析,找出性能瓶颈,并采取相应的优化策略。不同的应用场景和需求可能需要采取不同的优化手段,因此建议结合具体情况进行调优,并进行性能测试和评估,以验证优化效果。
网络子系统性能调优
对于网络子系统的性能调优,可以采取以下措施:
-
减少网络延迟:
- 使用高性能网络设备:选择高性能的网络交换机、路由器等网络设备,以减少数据包的传输延迟。
- 使用更快速的网络协议:例如,采用更快速的传输协议(如TCP Fast Open、QUIC)来减少握手延迟和连接建立时间。
- 优化网络拓扑结构:合理规划网络拓扑结构,减少数据包的传输距离,降低网络延迟。
-
提高网络带宽:
- 网络负载均衡:通过配置负载均衡设备或软件,将网络流量均匀分配到多个服务器上,提高整体网络带宽。
- 数据压缩与加速:使用数据压缩和加速技术,减少数据传输量,从而提高可用带宽。
- 增加带宽容量:升级网络设备,增加带宽容量,以满足高并发的网络请求。
-
优化网络协议和策略:
- TCP/IP参数调优:根据具体应用场景,调整TCP/IP协议的参数,如窗口大小、拥塞控制算法等,以提高网络传输效率。
- 数据包优先级管理:通过配置网络设备的QoS(Quality of Service)功能,对不同类型的数据包进行优先级管理,确保重要数据的及时传输。
-
缓存与缓冲区管理:
- CDN加速:使用内容分发网络(CDN)来缓存静态资源,加快数据的传输速度。
- 缓存技术应用:根据实际需求,合理地使用缓存技术,将热门数据、查询结果等缓存在内存中,加快数据访问速度。
- 缓冲区大小优化:针对网络设备的缓冲区大小进行优化,避免过大或过小的缓冲区导致的性能问题。
此外,还可以通过监控和分析网络流量、延迟等指标,找出网络性能瓶颈,并进行相应的调优策略。综合考虑应用程序的特点、网络环境以及业务需求,选择合适的调优方案,并进行性能测试和评估,以验证优化效果。
磁盘I/O子系统性能调优
对于磁盘I/O子系统的性能调优,可以采取以下措施:
优化磁盘I/O性能的常见措施包括:
-
使用RAID技术:RAID技术可以提供更高的磁盘读写性能和冗余容错能力。
-
块大小优化:根据应用程序的访问模式和数据块大小,调整磁盘块的大小以提高磁盘I/O性能。
-
操作系统参数调优:操作系统参数调整相关参数来改善磁盘I/O性能。
-
文件系统选择与优化:选择适合特定应用场景的文件系统,并进行相应的优化。
-
I/O缓存与缓冲区管理:I/O缓存和缓冲区管理技术来减少磁盘I/O操作次数。
-
应用程序优化:应用程序优化,减少不必要的磁盘I/O操作。
-
磁盘性能监控与故障诊断:磁盘性能监控磁盘的性能指标,及时发现潜在问题,并采取相应的故障诊断和修复措施。
这些措施综合起来可以提升磁盘I/O子系统的性能和可靠性。但需要根据具体情况进行调优,并进行性能测试和评估,以验证优化效果。
应用程序性能调优
对于应用程序的性能调优,可以采取以下措施:
- 代码优化:优化算法和数据结构和提高代码执行效率。
- 数据库优化:数据库索引优化和提高数据检索操作。
- 缓存技术应用:使用缓存技术和提高读取速度。
- 网络通信优化:减少网络请求次数和提高速度。
- 性能监控与调试:使用性能监控工具和评估系统的性能表现。
-
代码优化:
- 优化算法和数据结构:选择高效的算法和数据结构,减少不必要的计算和内存消耗,提高代码执行效率。
- 减少资源占用:及时释放不再使用的资源,避免资源泄露。合理使用内存、文件句柄、数据库连接等资源,避免资源瓶颈。
- 并发编程优化:合理使用多线程、多进程或异步编程模型,利用多核处理器和异步操作提高并发性能。
-
数据库优化:
- 数据库索引优化:分析数据库查询的频率和模式,创建适当的索引来加速数据检索操作。
- 数据库连接管理:合理维护和管理数据库连接,减少连接的建立和关闭开销。
- 批量操作和事务管理:将多个数据库操作批量提交或使用事务进行管理,减少单次数据库交互的次数,提高效率和数据一致性。
-
缓存技术应用:
- 使用缓存技术:将频繁读取的数据缓存在内存中,减少对底层存储系统(如数据库)的访问,提高读取速度。
- 合理设置缓存策略:根据数据的更新频率和重要性,设置合适的缓存策略,如缓存过期策略、LRU(最近最少使用)策略等。
-
网络通信优化:
- 减少网络请求次数:合并多个网络请求、采用批量操作,减少网络开销和延迟。
- 压缩和加速数据传输:使用数据压缩和加速技术,减少网络传输数据量,提高速度。
-
性能监控与调试:
- 使用性能监控工具:通过监控工具来获取应用程序的性能指标,如CPU使用率、内存占用、数据库查询时间等,找出性能瓶颈和潜在问题。
- 进行性能测试:模拟实际使用场景,进行负载测试和性能测试,评估系统的性能表现,及时发现和解决性能问题。
除了以上措施,还可以根据具体应用场景和需求进行针对性的优化。关注应用程序的瓶颈和低效点,不断进行测试和改进,以提高应用程序的性能和响应速度。同时,注意平衡性能调优和可维护性之间的关系,避免过度优化导致代码难以理解和维护。
基础软件性能调优
基础软件(如操作系统、数据库、Web服务器等)的性能调优,可以采取以下措施:
-
增加硬件资源:
- 增加CPU、内存和磁盘等硬件资源,以提高基础软件的执行速度和并发处理能力。
- 使用更快的存储设备或网络传输设备,以提高数据的访问速度和传输效率。
-
调整软件参数:
- 根据应用的工作负载和硬件配置,调整操作系统或数据库的参数,以达到最优性能。
- 对于Web服务器,可以调整连接池大小、缓存策略、请求过滤等参数,以提高并发处理和响应速度。
-
优化软件架构和设计:
- 应用合适的软件设计模式和开发框架,以提高代码复用性和可维护性。
- 良好的软件架构可以提高基础软件的并发处理能力和可扩展性。
-
资源的合理利用:
- 对于数据库系统,可以通过使用数据库缓存、合理索引等手段,减少访问磁盘的次数,提高数据访问速度。
- 对于Web服务器,可以使用缓存技术对经常访问的数据进行缓存,降低数据库访问的频率。
-
进行性能测试和优化:
- 对基础软件进行负载测试和性能测试,找出瓶颈和性能瓶颈。
- 评估不同参数组合或优化技术的性能效果,选择最优方案。
-
系统监控和调试:
- 通过系统监控工具实时监控系统的性能、资源利用率等指标,在系统出现异常时及时进行调试和修复。
- 收集日志信息,及时发现潜在问题,并对系统进行诊断。
除了以上措施,还可以根据不同的基础软件进行针对性的调优。例如,对于数据库系统,还可以使用分区、分片等技术,提高数据处理的并行性和可扩展性。对于Web服务器,还可以使用负载均衡技术,提高并发处理能力和可用性。总之,基础软件的性能调优需要多方面的考虑和综合处理。
鲲鹏性能优化工具 Tuning Kit
Tuning Kit 是一款针对鲲鹏计算平台的性能分析和优化工具,能收集处理器硬件、操作系统、进程/线程、函数等各层次的性能数据,分析出系统性能指标,定位到系统瓶颈点及热点函数。
Tuning Kit 支持以下功能特性:
- 系统配置全景分析:采集整个系统的软硬件配置信息,分析并针对不合理项提供优化建议。
- 系统性能全景分析:借鉴业界的 USE(utilization、saturation、errors)方法,通过采集系统 CPU、内存、存储 IO、网络 IO 等资源的运行情况,获得它们的使用率、饱和度、错误等指标,识别系统瓶颈。
- 针对部分系统指标项,根据已有的基准值和优化经验提供优化建议。
- 系统资源调度分析:基于 CPU 调度事件分析 CPU 核、进程/线程在各时间点的运行状态,进程/线程切换情况,给出相应的优化建议。
Tuning Kit 可以帮助用户更好地了解系统性能,识别和解决系统瓶颈,提高系统整体效率。
鲲鹏开发者社区:https://www.hikunpeng.com/developer/boostkit
Kunpeng官方文档地址
https://www.hikunpeng.com/document/detail/zh/kunpengdevps/porting/qs/qs-pa-kunpengdevps.html
鲲鹏小智
https://www.hikunpeng.com/zh/airobot
参考文献:
[1]GB/T 7714:戴志涛、刘健培.鲲鹏处理器架构与编程:华为智能计算技术丛书[M].北京:清华大学出版社,2020.
[2]https://www.hikunpeng.com/
[3]戚正伟、管海兵.深入浅出系统虚拟化:原理与实践[M]北京:清华大学出版社,2021.
相关文章:

DP读书:鲲鹏处理器 架构与编程(十四)ACPI与软件架构具体调优
一分钟速通ACPI和鲲鹏软件移植 操作系统内核鲲鹏软件移植鲲鹏软件移植流程 编译工具选择编译参数移植案例源码修改案例鲲鹏分析扫描工具 Dependency Advisor鲲鹏代码迁移工具 Porting Advisor 鲲鹏软件性能调优鲲鹏软件性能调优流程CPU与内存子系统性能调优网络子系统性能调优磁…...

4.正则提取html中的img标签的src内容
我们以百度贴吧的1吧举例 目录 1 把网页搞下来 2 收集url 3 处理url 4 空的src 5 容错 6 不使用数字作为文件名 7 并不是所有的图片都用img标签表示 8 img标签中src请求下来不一定正确 9 分页 1 把网页搞下来 搞下来之后,双击打开是这样的 2 收…...

安装对应版本pytorch和torchvision
遇见报错: ERROR: Could not find a version that satisfies the requirement torch (from versions: none) ERROR: No matching distribution found for torch 解决方法: 1、网站找到对应torch和torchvision版本,cp对应python版本ÿ…...

酷克数据与华为合作更进一步 携手推出云数仓联合解决方案
在一起,共迎新机遇!8月25-26日,2023华为数据存储用户精英论坛在西宁召开。酷克数据作为国内云原生数据仓库的代表企业,也是华为重要的生态合作伙伴,受邀参与本次论坛,并展示了云数仓领域最新前沿技术以及联…...

若依 MyBatis改为MyBatis-Plus
主要内容:升级成mybatis-plus,代码生成也是mybatis-plus版本 跟着我一步一步来,就可完成升级! 检查:启动程序,先保证若依能启动 第一步:添加依赖 这里需要在两个地方添加,一个是最…...

docker-ubuntu
docker ps docker images 拉取ubuntu镜像 docker pull ubuntu 启动 docker start podid docker run -itd -e TZAsia/Shanghai --name ubuntu-test -v /share:/shared -d ubuntu:latest 进入bash界面 docker exec -it podid /bin/bash 安装sudo apt-get install sudo …...

Mock 基本使用
mock解决的问题 开发时,后端还没完成数据输出,前端只好写静态模拟数据。数据太长了,将数据写在js文件里,完成后挨个改url。某些逻辑复杂的代码,加入或去除模拟数据时得小心翼翼。想要尽可能还原真实的数据,…...

MySql学习笔记08——事务介绍
事务 基本概念 事务是一个完整的业务逻辑,是一个最小的工作单元,不可再分。 一个完整的业务逻辑包括一系列的操作,这些操作是整个业务逻辑中的最小单元,这些操作要么同时成功,要么同时失败。 由于只有DML语句中才会…...

AMEYA360:思瑞浦推出汽车级超低静态功耗高压LDO—TPL8031Q
聚焦高性能模拟芯片和嵌入式处理器创新研发的半导体公司——思瑞浦3PEAK(股票代码:688536),推出全新一代汽车级超低静态功耗高压线性稳压器——TPL8031Q。 TPL8031Q拥有支持3V~42V宽输入电压范围、3μA超低静态功耗、多种封装可选等性能优势,…...

保留 N 条数据功能 实现方案
需求:用户浏览某信息后 就插入一条浏览记录,该浏览记录限制只保留 N 条。 实现方案: 1. 插入记录 2. 查询总记录 3. 判断:总记录 是否大于 阈值 3.1 如果大于:总记录 - 阈值 获取到超出数量,将对超出数…...

SOME/IP TTL 在各种Entry 中各是什么意思?有什么限制?
1 服务发现 SOME/IP SD 服务发现主要用于 定位服务实例检测服务实例状态是否在运行发布/订阅行为管理SOME/IP SD 也是 SOME/IP 消息,遵循 SOME/IP 消息格式,有固定的 Message ID、Request ID 以及 Message Type 等。并对 SOME/IP Payload 进行了详细的定义。 SOME/IP SD …...

CSS中如何实现元素的旋转和缩放效果?
聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 元素的旋转和缩放效果⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅!这个专栏是为那些对Web开发感兴趣、刚刚踏…...

Unity通过偏移UV播放序列帧动画
大家好,我是阿赵。 在Unity引擎里面用shader播放序列图,估计很多人都有用到了,我自己而已写过好几个版本。这里大概介绍一下。 一、原理 先说目的,我现在有一张这样的图片: 这张图片上面,有9个格子&a…...

无涯教程-Android - List fragments函数
框架的ListFragment的静态库支持版本,用于编写在Android 3.0之前的平台上运行的应用程序,在Android 3.0或更高版本上运行时,仍使用此实现。 List fragment 的基本实现是用于创建fragment中的项目列表 List in Fragments 示例 本示例将向您说明如何基于…...

【图解RabbitMQ-3】消息队列RabbitMQ介绍及核心流程
🧑💻作者名称:DaenCode 🎤作者简介:CSDN实力新星,后端开发两年经验,曾担任甲方技术代表,业余独自创办智源恩创网络科技工作室。会点点Java相关技术栈、帆软报表、低代码平台快速开…...

jmeter源码二次开发
本文以jmeter5.5为例,扩展“TCP Socket支持定长的返回字节流”功能。 一、 源码本地编译运行 1、在jmeter官网下载源码:jmeter各版本源码地址 2、在idea中用gradle导入jmeter源码,idea中要配置jdk,gradle,我用的是j…...

深入实现 MyBatis 底层机制的任务阶段4 - 开发 Mapper 接口和 Mapper.xml
😀前言 在我们的自定义 MyBatis 底层机制实现过程中,我们已经深入研究了多个任务阶段,包括配置文件的读取、数据库连接的建立、执行器的编写,以及 SqlSession 的封装。每个任务阶段都为我们揭示了 MyBatis 内部工作原理的一部分&a…...

分享一下在微信上有哪些微信活动可以做
微信营销活动是吸引更多用户和提高品牌知名度的有效策略。下面是一些微信营销活动的做法: 抽奖活动:通过设置奖品和参与条件,吸引用户参与抽奖活动。例如,可以设置关注公众号、转发活动页面等条件,吸引更多用户参与抽奖…...

视频监控/视频汇聚/视频云存储EasyCVR平台接入国标GB协议后出现断流情况,该如何解决?
视频监控汇聚平台EasyCVR可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。安防监控平台EasyCVR既具备传统安防视频监控的能…...

没有软件怎么管理固定资产
在当今数字化的世界中,我们已经习惯了使用各种软件来管理我们的日常生活和工作。然而,当我们面临一个看似简单的问题——如何管理固定资产时,我们可能会感到困惑。那么,如果没有软件,我们该如何进行资产管理呢…...

几种反序列化漏洞
1.PHP魔术方法 <?php class c {private $name hacker;function __construct() { // 构造方法,new时调用echo construct<br>;}function __serialize() { // 序列化时调用echo serialize<br>;return [hack];}function __unserialize($data) { // 反…...

华为OD机试 - 找出符合要求的字符串子串(Java 2023 B卷 100分)
目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出 华为OD机试 2023B卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(A卷B卷)》…...

深度学习环境搭建笔记(二):mmdetection-CPU安装和训练
文章目录 第一步:安装anaconda第二步:安装虚拟环境第三步:安装torch和torchvision第四步: 安装mmcv-full第五步: 安装mmdetection第六步:测试环境第七步:训练-目标检测7.1 准备数据集7.2 检查数据集7.3 训练网络 第一步…...

Ubuntu18.04安装cuDNN
注册账号 https://developer.nvidia.com/rdp/cudnn-archive 该网站下载安装包需要先进行注册。登录成功后,找到与CUDA对应的版本。 选择Linux版本进行下载。 下载后的格式为.tar.xz 解压 tar xvJf cudnn-linux-x86_64-8.9.3.28_cuda12-archive.tar.xz配置环境 su…...

Java逻辑控制
目录 一、顺序结构 二、分支结构 1、if语句 (1) 语法格式1编辑 (2)语法格式2编辑 (3)语法格式3 2、switch 语句 三、循环结构 1、while循环 2、break 3、continue 4、for 循环 5、do whil…...

easyExcel合并单元格导出
一、导入maven依赖 (很多旧项目自定义了一套Excel导出工具,poi版本可能不兼容,一般poi新旧版本不兼容分界线在3.17,选择3.17版本不会发生代码不兼容情况) <dependency><groupId>com.alibaba</groupId&…...

SpringBoot项目--电脑商城【用户注册】
1.创建数据表 1.1 创建t_user表 CREATE TABLE t_user (uid INT AUTO_INCREMENT COMMENT 用户id,username VARCHAR(20) NOT NULL UNIQUE COMMENT 用户名,password CHAR(32) NOT NULL COMMENT 密码,salt CHAR(36) COMMENT 盐值,phone VARCHAR(20) COMMENT 电话号码,email VARCH…...

HCIP学习-IPv6
目录 前置学习内容 IPv6解决的一些IPv4的缺陷 无限的地址 层次化的地址结构 即插即用 简化报文头部 IPv4和IPv6报头比较 端到端的网络罗完整性 安全性增强 挣钱QoS特性 IPv6地址介绍 格式 首选格式 压缩格式 内嵌IPv4地址格式的IPv6地址格式 IPv6的网络前缀和接…...

golang高精度十进制数扩展包decimal用法
在Go语言中,没有内置的十进制数(decimal)类型或相关的标准库。然而,有一些第三方包可用于处理十进制数,其中比较常用的是decimal包。 decimal包提供了一个big.Float的子类型decimal.Decimal,可以用于表示和…...

STM32F4X RNG随机数发生器
STM32F4X RNG随机数发生器 随机数的作用STM32F4X 随机数发生器RNG控制寄存器RNG状态寄存器RNG数据寄存器RNG数据步骤RNG例程 随机数的作用 随机数顾名思义就是随机产生的数字,这种数字最大的特点就是其不确定性,你不知道它下一次产生的数字是什么。随机…...