C++基础:SGI STL二级空间配置器内存池
2024/12/14-2024/12/ :
这篇稍微写一下阅读SGI STL内存池的收获。
reference:
[1] 深度剖析SGI STL二级空间配置器内存池源码
[2] C++内存管理:new / delete 和 cookie
[3] 侯捷 内存管理
文章目录
- 一、写在前面
- 二、二级空间配置器解读
- 2.1 从 malloc 和 free 开始
- 2.2 SGI STL 内存池结构
- 2.3 内存分配操作
- 2.4 内存切分操作
- 2.3 纰漏
一、写在前面
SGI STL由Silicon Graphics Computer Systems公司参照HP STL实现,主要设计者仍然是STL之父Alexandar Stepanov,被Linux的C++编译器GCC所采用。
在重构SGI STL的源码时,我看到了社区中许多很完善的源码解析,之前有篇写了一半的,实在没别人完善所以直接删掉了,因为既然做的没别人好,也给不了读者什么参考价值。但是,最近开始对重构项目进行复盘,好像也看到了写一篇复盘文章的必要性——有时候就算做的没有别人好,自己的理解似乎也有存在的必要。因此按照侯捷的内存管理课程重新做了一下复盘。
让我有些意外的是,在回头复盘这个项目的时候,看见了之前背过八股和别的项目一些相似细节的影子,这也许就是在学习中有所收获的印证。
二、二级空间配置器解读
2.1 从 malloc 和 free 开始
在SGI STL中若申请一块较大的内存(界限为128b)则采用一级空间配置器,而一级空间配置器直接调用 malloc 和 free 实现内存块的分配,二级空间配置器也使用了 malloc 和 free(不如说这两个函数是一个内存池无法避开的必要操作),但是二级空间配置器使用这两个函数的频率并没有一级空间配置器这么频繁。
对于如何优化内存分配的效率,一般有两个方面的考量:
- 内存分配层面:
在这个层面,我们希望达到一次申请,多次分配的效果。也就是说一次申请一大块的内存,后面需要分配直接在这一大块内存里面用指针的方式直接拿。 - cookie开销层面:
在malloc中,分配内存带有cookie,即一部分存储当前分配内存空间大小等信息的额外空间,如果能减少这一部分的开销,对内存空间的利用一定更充分。
众所周知,new的操作步骤一共两步,即内存分配和对象构造,前者调用::operator new,而在普通的内存分配方式(一级空间配置器)中,::operator new直接调用malloc来实现内存的分配。因此,如果需要实现内存池,我们就需要对对象的operator new进行重载操作(同理,需要重载::operator delete实现内存的回收)。
ps. 本文用的单位都是byte,按照侯捷讲的来。实际上根据代码来应该是B(字节),但是这也并不影响理解。
2.2 SGI STL 内存池结构
SGI STL 内存池的结构如下,内存池维护了一个 free_list 指针数组,每个指针指向一串内存块链表,如 #0 指向的内存块为8b,#1 指向一串由16b内存块构成的内存块链表…以此类推。可知 #15 指向的内存块链表中每一块内存的大小为128b。
那么大于128b的内存块该怎么办?这就不需要使用二级空间配置器了,直接使用一级空间配置器的mallco即可,这样的设计可以理解——cookie可以看作内存块的浪费率,内存块越大,cookie的大小不变,而浪费率自然就更小,我们可以接受这样的浪费。
2.3 内存分配操作
另一个层面思考,过大的内存块意味着更大的连续内存,我们看到下面可以知道,如果池中有足够内存,内存块链表会一次申请一大块连续内存(roundup(size)*20)来扩充自己的大小(池中内存连一个内存块都不够则继续用malloc申请内存),如果 free_list 支持更大的256b乃至512b的内存块链表,这么一大块的连续内存可能并不存在,这就很容易给我们的内存分配带来麻烦,所以不如直接交给malloc来申请离散的内存块。
至于roundup函数的作用,是为了将申请的内存向上对齐至8b(1B)单位(比如申请31b,则对齐至4B(32b),申请9b,则对齐至2B(16b)),因为我们维护的free_list 里面的内存块链表都是以8b为单位增长的,如果不加上一个对齐的操作,可能会在内存分配的时候产生内部碎片。
下图展示了当用户申请32b时内存池中进行的操作。顺便可以注意到,返回给用户的第一个内存块(绿色)上面是一个小的蓝色内存块,这个指的是这次malloc附带的cookie。
除此之外,内存池做了一个记录累计申请量的操作,同时,也更新了池中start_free指针和end_free指针的指向,来指向池中剩下的可用内存块。
下图中,申请的内存块为64b,虽然池中的余量不足 roundup(size)*20,但是仍有 roundup(size)*9 即9块符合要求的内存块,数量在1-20之间。这里将第一块给用户,剩下的构成 #7 下的内存块链表。此时池中内存分配完,start_free 和 end_free 重合,因为没有用malloc继续申请内存,所以没有多出新的小块cookie内存。
问题来了,如果剩下的内存块不足一个,因为我们内存对齐的操作,这块内存的大小一定在8-128b之间,且以8B为单位对齐(无论是将池中的内存分配给内存块链表还是用malloc扩展内存池,我们的操作是始终对齐8b的)。处理这块内存碎片的方法很简单,将其接入适合其大小的内存块链表即可。
接下来申请96b的内存,可是池中剩余内存为0,则继续使用malloc增加池中内存再分配给用户以及内存块链表。申请的内存大小为roundup(96b)202 + roundup(累计申请量/16),然后给用户一块roundup(96b),剩下roundup(96b)*19即19块内存接到对应的内存块链表上。因为是第二次malloc,所以上面带了一个小块红色cookie。
可以看到,累计申请量是会越来越大的,所以池在每次扩张时额外申请的内存也会越来越大,这比较符合平时的设计经验。
接下来其实就是以此类推了:
下图则展示了申请size大小的内存块时,roundup(size)对应位置的内存块链表上面还有内存块的情况:
这里展示的其实就是继续从池中分配内存的操作了:
在这里我们可以看到,当池中剩下不足一块时,对待内存碎片的处理方法和我们之前讲过的一样。可以看到,#9 下面的内存块链表多出了一块:
接下来的操作之前都做过了:
2.4 内存切分操作
该操作在系统内存不够,malloc申请失败时进行。此时虽然余下内存不够分配,但是内存块链表中还有许多白色的内存块未被分配。下图中就申请了一个72b的内存块,但是malloc失败,这时候,找比72b更大的8b单位内存块,80b、88b等等都是可用的。算法会取一个最接近的80b,将其切分为两部分,即72b和8b。将这两个内存挂到对应的#8以及#0下,然后将72b的部分交给用户。
下图又申请了一个72b内存块,此时malloc失败且#8(72b)、#9(80b)都没有内存了。这时拿一个#9(88b)下的内存块,同样做一次切分,切成72b以及16b然后挂在对应的内存块链表下,再将72b那块分配给用户。
2.3 纰漏
但是如果我们申请一个稍大的120b内存块,这时malloc失败,剩下的内存链表中也找不到比它大的内存块了。如下图:
对于这种情况,我们仍然有两种补救措施:
- 利用池中更小的内存块组成所需的大内存块:
这可能是我们第一时间的想法,这种方法可以看作是切分的逆操作,但是用代码实现的难度会高很多。 - 改变malloc的策略:
malloc申请失败并不意味着堆上真的没空间了,只能说明malloc申请量大于该空间大小。上面也说过,malloc的内存申请大小是受到当前申请的内存块大小以及内存池累计申请大小的影响,不如对计算申请量的公式略作修改,少申请一点内存便能很容易解决这个问题。
在代码中给出的解决方案是直接使用malloc来分配对应大小的内存,不多不少。
还有一点,在内存池的deallocate中并没有调用free,这就是说整个内存池的大小是只会增加不会减少的。在一些情况下,我们是不希望内存池这么做的。deallocate实际上做了一个将分配给对象的内存块重新挂到对应的内存块链表上的操作。
相关文章:
C++基础:SGI STL二级空间配置器内存池
2024/12/14-2024/12/ : 这篇稍微写一下阅读SGI STL内存池的收获。 reference: [1] 深度剖析SGI STL二级空间配置器内存池源码 [2] C内存管理:new / delete 和 cookie [3] 侯捷 内存管理 文章目录 一、写在前面二、二级空间配置器解读2.1 从 malloc 和 fr…...
Python简介
Python 是一种高级编程语言,以其简洁易读的语法和强大的功能而广受欢迎。以下是对 Python 的详细简介: python官网:https://www.python.org/ python中文官网:Python中文网 官网 历史与起源: Python 由荷兰人 Guido…...
Linux之ARM(MX6U)裸机篇----7.蜂鸣器实验
一,蜂鸣器模块 封装步骤: ①初始化SNVS_TAMPER这IO复用为GPIO ②设置SNVS_TAMPPER这个IO的电气属性 ③初始化GPIO ④控制GPIO输出高低电平 bsp_beep.c: #include "bsp_beep.h" #include "cc.h"/* BEEP初始化 */ void beep_init…...
手机实时提取SIM卡打电话的信令声音-双卡手机来电如何获取哪一个卡的来电
手机实时提取SIM卡打电话的信令声音 --双卡手机来电如何获取哪一个卡的来电 一、前言 前面的篇章《手机实时提取SIM卡打电话的信令声音-智能拨号器的双SIM卡切换方案》中,我们论述了局域网SIP坐席通过手机外呼出去时,手机中主副卡的呼叫调度策略。 但…...
GPU 进阶笔记(一):高性能 GPU 服务器硬件拓扑与集群组网
记录一些平时接触到的 GPU 知识。由于是笔记而非教程,因此内容不求连贯,有基础的同学可作查漏补缺之用 1 术语与基础 1.1 PCIe 交换芯片1.2 NVLink 定义演进:1/2/3/4 代监控1.3 NVSwitch1.4 NVLink Switch1.5 HBM (High Bandwidth Memory) 由…...
Unresolved plugin: ‘org.apache.maven.plugins:maven-site-plugin:3.12.1‘
问题 使用idea 社区办加载项目提示下面问题: Unresolved plugin: org.apache.maven.plugins:maven-site-plugin:3.12.1 问题解决 maven插件地址: https://maven.apache.org/plugins/maven-dependency-plugin/plugins.html Maven 中央仓库地址&#…...
GO性能优化的一些记录:trace工具的使用
使用场景: 1 想要查看接口延时性偏高 2 深入了解协程具体如何运营的详细信息(运行时长,或者什么原因导致了协程运行受阻) 可以使用 trace 功能,程序便会对下面的一系列事件进行详细记录,并且会依据所搜集到…...
springboot maven 构建 建议使用 --release 21 而不是 -source 21 -target 21,因为它会自动设置系统模块的位置
使用 --release 选项代替 -source 和 -target 是一种更安全、更兼容的方式,特别是在构建使用较新版本 JDK 的项目时。以下是详细解释和建议: 1. 为什么推荐使用 --release 问题点: 使用 -source 和 -target 标志时,仅设置了代码的语言级别和字节码目标版本,但编译器仍可…...
设计模式-创建型-单例模式
1. 单例模式简介 单例模式(Singleton Pattern)是一种常见的创建型设计模式,它确保一个类只有一个实例,并提供全局访问点。在很多情况下,我们只希望某个类在整个应用程序中有一个唯一的实例,且该实例需要在…...
linux 网卡配置
linux网卡可以通过命令和配置文件配置,如果是桌面环境还可以通过图形化界面配置. 1.ifconfig(interfaces config)命令方式 通常需要以root身份登录或使用sudo以便在Linux机器上使用ifconfig工具。依赖于ifconfig命令中使用一些选项属性,ifconfig工具不仅可以被用来…...
python文件操作相关(excel)
python文件操作相关(excel) 1. openpyxl 库openpyxl其他用法创建与删除操作单元格追加数据格式化单元格合并单元格插入图片公式打印设置保护工作表其他功能 2. pandas 库3. xlrd 和 xlwt 库4. xlsxwriter 库5. pyxlsb 库应用场景参考资料 在 Python 中&a…...
利用Abel_Cain软件实现ARP欺骗
ARP协议是“Address Resolution Protocol”(地址解析协议)的缩写。在局域网中,网络中实际传输的是“帧”,帧里面是有目标主机的MAC地址的。在以太网中,一个主机要和另一个主机进行直接通信,必须要知道目标主…...
搭建android开发环境 android studio
1、环境介绍 在进行安卓开发时,需要掌握java,需要安卓SDK,需要一款编辑器,还需要软件的测试环境(真机或虚拟机)。 早起开发安卓app,使用的是eclipse加安卓SDK,需要自行搭建。 目前开…...
使用 Python -m build打包 Python 项目:详解过程与细节
使用 Python -m build 打包 Python 项目:详解过程与细节 Python 项目的打包是发布和分发软件的核心环节。本文将基于用户提供的 pyproject.toml 文件和项目目录结构,详细说明 Python -m build 命令的执行过程,并解答 是否会将 oe_eval 中的代…...
019-spring-基于aop的事务控制原理
1、事务配置: <tx:annotation-driven transaction-manager"transactionManager"/> transaction-manager 默认是找这个bean:transactionManager 2、从命名空间开始找到对应的解析配置如下: 对应的是这个 后续跟源码没有搞明…...
210.xxl-job定时任务:架构,可视化,GLUE模式,负载均衡,分片
目录 一、为什么要用xxl-job 二、xxl-job架构 三、启动调度中心 1.初始化数据库 2.编译源码 四、启动执行器 五、GLUE模式运行 六、负载均衡 七、分片 1.分片环境准备 2.分片实现 八、感谢支持 一、为什么要用xxl-job 以前我们用quartz实现定时任务,但是那是单机…...
LVS 负载均衡原理 | 配置示例
注:本文为 “ LVS 负载均衡原理 | 配置” 相关文章合辑。 部分内容已过时,可以看看原理实现。 未整理去重。 使用 LVS 实现负载均衡原理及安装配置详解 posted on 2017-02-12 14:35 肖邦 linux 负载均衡集群是 load balance 集群的简写,翻…...
堆内存易碎片化
堆内存容易碎片化主要是由于其内存分配和释放的特性以及管理方式的复杂性所导致的。以下是对堆内存容易碎片化的详细解释: 一、内存分配和释放的非连续性 堆内存的分配和释放并不是连续的,这意味着在多次分配和释放后,原本连续的内存空间可…...
Docker镜像瘦身:从1.43G到22.4MB
Docker镜像瘦身:从1.43G到22.4MB 背景1、创建项目2、构建第一个镜像3、修改基础镜像4、多级构建5、使用Nginx背景 在使用 Docker 时,镜像大小至关重要。我们从 create-react-app (https://reactjs.org/docs/create-a-new-react-app.html)获得的样板项目通常都超过 1.43 GB…...
Linux套接字通信学习
Linux套接字通信 代码源码:https://github.com/say-Hai/TcpSocketLearn/tree/CThreadSocket 在网络通信的时候, 程序猿需要负责的应用层数据的处理(最上层),而底层的数据封装与解封装(如TCP/IP协议栈的功能)通常由操作系统、网络协…...
XIAO Esp32S3制作网络摄像头——音频获取
1、功能介绍 本文主要是基于XIAO Esp32S3(Sense)做的一款网络摄像头,主要包含以下功能 1 音频获取/保存 2 视频获取/视频保存 3 行人检测/火焰检测/行人追踪(告警) 4 指定区域 5 摄像头旋转 。。。 本文主要实现第一步,音频获取,后续会陆续实现后面的功能,敬请期…...
Docker搭建RocketMQ
Docker搭建RocketMQ 操作系统: CentOS 7 x64 版本号: CentOS Linux release 7.9.2009 (Core) IP地址: 192.168.157.130 Docker 信息: Client: Docker Engine - Community Version: 24.0.7 API version: 1.43 Go version: go1.20.10 Git commit: …...
Python 迭代器与生成器
Python 中的迭代器和生成器是处理集合元素的重要工具,它们在处理大量数据时特别有用,因为它们不需要一次性将所有数据加载到内存中。 迭代器(Iterator) 迭代器是一个实现了迭代器协议的对象,这意味着它有两个方法&am…...
细说STM32F407单片机通过IIC读写EEPROM 24C02
目录 一、操作说明 二、工程配置 1、时钟、DEBUG、GPIO、USART6、NVIC、Code Generator 2、 IIC2 (1)Master Features组,主设备参数 (2)Slave Features组,从设备参数 三、软件设计 1、KELED 2、E…...
Redis 深度解析:从入门到精通
引言 Redis 是一个开源的、高性能的键值存储系统,它支持多种数据结构,并且提供了丰富的功能和接口。作为内存数据库,Redis 以其快速的数据访问速度、灵活的数据模型以及持久化选项而闻名。本文将详细介绍 Redis 的核心概念、工作原理及其应用…...
6-pandas数据读取
前言 一、分组聚合 1.groupby使用: groupby() 是 pandas 库中用于对数据进行分组操作的一个非常重要的方法。 import pandas as pddata {城市: [北京, 上海, 广州, 北京, 上海, 广州],人口: [2154, 2424, 1303, 2154, 2424, 1303],年龄: [25, 30, 35, 25, 30, 3…...
omi friend实战记录
一、简介 omi friend是国外githab上开源的一个“AI硬件”的制作教程,它的形状是个三角形,属于项链佩戴这类的。可以接入llm进行对话,他有麦克风、扬声器,还有电池。外形好看,功能实用。还有专属的一系列app可以供方便…...
马原复习笔记
文章目录 前言导论物质实践人类社会资本主义社会主义共产主义后记 前言 一月二号下午四点多考试,很友好,不是早八,哈哈哈。之前豪言壮语和朋友说这次马原要全对,多做了几次测试之后,发现总有一些知识点是自己不知道的…...
VIM: Vision Mamba基于双向状态空间模型的高效视觉表示学习
这篇文章的主要内容可以概括如下: 背景与动机: 近年来,状态空间模型(SSM)在长序列建模中展现出巨大潜力,尤其是Mamba模型在硬件感知设计上的高效性。 然而,现有的SSM模型在处理视觉数据时面临…...
CannotRetrieveUpdates alert in disconnected OCP 4 cluster解决
环境: Red Hat OpenShift Container Platform (RHOCP) 4 问题: Cluster Version Operator 不断发送警报,表示在受限网络/断开连接的 OCP 4 集群中无法接收更新。 在隔离的 OpenShift 4 集群中看到 CannotRetrieveUpdates 警报: …...
libmodbus源码中重要的两个结构体讲解
文章目录 一、libmodbus重要数据结构讲解**1. 结构体 `_modbus`**定义成员解析小结**2. 结构体 `_modbus_backend`**定义成员解析小结**3. 两者关系和工作流程****关系****工作流程**一、libmodbus重要数据结构讲解 这两个结构体是 libmodbus 的核心,定义了 Modbus 通信上下文…...
PostgreSQL的一主两从集群搭建部署 (两同步)
一、实验环境 虚拟机名IP身份简称keep-postgres12-node1192.168.122.87主节点node1keep-postgres12-node2192.168.122.89备节点node2keep-postgres12-node3192.168.122.90备节点node3 二、安装数据库 源码包方式(主) 1、创建用户 [rootkeep-postgre…...
CPT203 Software Engineering 软件工程 Pt.5 软件测试(中英双语)
文章目录 8. 软件测试8.1 Testing(测试)8.1.1 A note of testing under the V & A framework8.1.2 The Basics8.1.3 The Goals8.1.4 The Stages 8.2 Developing testing(开发测试)8.2.1 Unit testing(单元测试&…...
在 Blazor 和 ASP.NET Core 中使用依赖注入和Scoped 服务实现数据共享方法详解
依赖注入(Dependency Injection,简称 DI)是一种设计模式,用于将对象的依赖关系从对象内部解耦出来,由外部容器进行管理和提供。在 Blazor 和 ASP.NET Core 中,DI 是内置的核心功能,它通过服务生…...
【信号滤波 (下)】采样条件,多种滤波算法对比(Matlab/C++)
目录 一、信号采样条件采样定理ADC的SPS设置 二、常用滤波算法对比A.滑动平均滤波B.陷波滤波陷波滤波器简介FIR(有限脉冲响应)滤波器和IIR(无限脉冲响应)滤波器 基于IIR实现陷波滤波滤波原理讲解双二阶滤波器计算过程陷波滤波优势 在上一篇中,介绍了信号时域到频域的…...
将广播发送和接收端实现一遍,完成一个发送端发送信息,对应多个接收端接收信息实验。
1、将广播发送和接收端实现一遍,完成一个发送端发送信息,对应多个接收端接收信息实验。 接受端 #include<myhead.h> #define handel_err(res,val) if(val-1){perror(res);return-1;} int main(int argc, const char *argv[]) {int rfdsocket(AF_…...
Nginx 负载均衡详解
一、Nginx 简介 Nginx 是一个高性能的开源 Web 服务器和反向代理服务器,以其轻量级、高并发、低内存消耗等特点著称。Nginx 不仅适用于静态资源的快速分发,还广泛应用于负载均衡、反向代理等场景。通过Nginx,可以轻松地构建一个高效、可靠且…...
自动驾驶新纪元:城区NOA功能如何成为智能驾驶技术的分水岭
目录 一、NOA 的定义 二、NOA 的主要特点 导航集成 场景覆盖 智能决策 高级感知能力 驾驶员参与 三、NOA 的优势 四、NOA的衡量指标 定性评价指标 安全性评价指标定义 可靠性评价指标定义 舒适性评价指标定义 通行效率评价指标 定量评价指标 五、代表厂商的实测…...
FFmpeg 编码和解码
文章目录 音频格式AACADIF音频数据交换格式ADTS音频数据传输流 音频解码音频编码 视频格式H264GOP图像组I帧,P帧,B帧H264压缩技术H264压缩级别H264视频级别H264码流结构SPSPPS 解码视频编码视频 音频格式 AAC AAC全称 Advanced Audio Coding࿰…...
【Ubuntu】Ubuntu server 18.04 搭建Slurm并行计算环境(包含NFS)
Ubuntu server 18.04 搭建Slurm并行计算环境(包含NFS) 一、Munge 认证模块 1.1、安装 munge 主节点和子节点都安装munge #安装 sudo apt update && sudo apt install munge libmunge-dev#设置开机启动 sudo systemctl enable munge sudo syste…...
WPF 绘制过顶点的圆滑曲线 (样条,贝塞尔)
在一个WPF项目中要用到样条曲线,必须过顶点,圆滑后还不能太走样,捣鼓一番,发现里面颇有玄机,于是把我多方抄来改造的方法发出来,方便新手: 如上图,看代码吧: ----------…...
Spring 的不同事务传播行为
目录 Spring 的不同事务传播行为 PROPAGATION_REQUIRES_NEW事务传播行为什么情况下会使用? 一、PROPAGATION_REQUIRES_NEW的含义 二、使用场景 三、注意事项 PROPAGATION_NESTED事务传播行为什么情况下会使用? 一、PROPAGATION_NESTED的含义 二、使用场景 三、嵌套事…...
PlantUML 时序图 基本例子
基本的例子 序列-> 用于绘制两个参与者之间的信息。参与者不必明确声明。 要有一个点状的箭头,就用--> 也可以用<- 和<-- 。这不会改变绘图,但可能提高可读性。注意,这只适用于顺序图,其他图的规则不同。 plantum…...
QILSTE H8-C414SY高亮黄光LED灯珠 发光二极管LED
在电子组件的复杂世界中,H8-C414SY型号的LED以其精确的技术参数和卓越的性能,成为了工程师和技术人员不可忽视的选择。本文将通过对这款高亮黄光LED的技术参数进行深入分析,增加文本的复杂性和突发性,以提供一份详尽的技术参考。 …...
git clone 和 conda 换源
文章目录 git clone 通过 sshconda 创建虚拟环境通过 env.yml 文件conda 换源 git clone 通过 ssh git clone ssh://用户名IP地址:/仓库名字.gitconda 创建虚拟环境通过 env.yml 文件 conda env create -f environment.ymlconda 换源 Step 1 生成 .bashrc 文件在家目录下。…...
Spring Boot 多数据源解决方案:dynamic-datasource-spring-boot-starter 的奥秘(下)
在上一篇博客《Spring Boot 多数据源解决方案:dynamic-datasource-spring-boot-starter 的奥秘》介绍了dynamic-datasource-spring-boot-starter的自动配置类和配置属性类之后,本文继续来剖析多数据源是如何切换的,什么时候切换的。 前文中提…...
移动 APP 设计规范参考
一、界面设计规范 布局原则: 内容优先:以内容为核心进行布局,突出用户需要的信息,简化页面导航,提升屏幕空间利用率.一致性:保持界面元素风格一致,包括颜色、字体、图标等,使用户在…...
yolov6算法及其改进
yolov6算法及其改进 1、YOLOV6简介2、RepVGG重参思想3、YOLOv6架构改进3.1、Backbone方面3.2、SPP改进3.3、Neck改进3.4、Head改进 4、正负样本匹配与损失函数4.1、TaskAligned样本匹配4.2、VFL Loss分类损失函数4.3、SIOU损失函数4.4、DFL损失函数 1、YOLOV6简介 YOLOv6设计主…...
java自定义注解对枚举类型参数的校验
目录 1.前提准备条件 1.1 pom.xml文件依赖: 1.2 枚举类: 1.3 controller接口: 1.4 实体参数: 1.5 knife4j的配置 2.实现要求 3.实现步骤 3.1 自定义注解类: 3.2 使用注解: 3.3 添加注解校验类: …...
K8S-LLM:用自然语言轻松操作 Kubernetes
在 Kubernetes (K8s) 的日常管理中,复杂的命令行操作常常让开发者感到头疼。无论是部署应用、管理资源还是调试问题,都需要记住大量的命令和参数。Kubernetes 作为容器编排的行业标准,其强大的功能伴随着陡峭的学习曲线和复杂的命令行操作。这…...