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

高并发内存池(定长内存池基础)

定长内存池的设计

      • 定长内存池
      • 定长内存池的原理讲解
      • 代码实现
            • 定义对象
            • New对象的主要逻辑
            • delete对象的主要逻辑
            • 完整代码

定长内存池

为什么我们要设计这个定长内存池呢?首先malloc是c标准库中向堆申请空间的接口,变相的说malloc是普遍性,而我们要实现的高并发内存池是特殊性,是针对某种情况下把效率提高到极致的一种申请空间的方法。在后续我们的项目中也会用到定长内存池,所以定长内存池的设计有两方面,一是让我们熟悉一下内存的分配问题,二是他会作为我们的高并发内存池的一个基础组件。

定长内存池的原理讲解

首先我们需要在内存中申请一块固定大小的空间,如下图:
在这里插入图片描述

后面我们考虑如何分配空间以及管理后续的空间。这里我们像系统申请了一大块空间,如果再有用户需要申请空间这个时候我们就可以直接从我们管理的那一大块空间中取出空间,从而避免了重复申请和释放空间的效率问题。但是这里用户归还的空间我们也不能直接还给操作系统,所以我们需要使用一个freelist(自由链表)将归还的空间管理起来

在这里插入图片描述
在这里插入图片描述
每次从上面取完空间后,归还空间我们就直接头插到链表中。下次如果在需要申请,我们就可以直接使用_freelist中的空间直接给到用户使用。

代码实现

定义对象

我们先定义一个class ObjectPool类对象

#pragma once
#include<iostream>
using std::endl;
using std::cout;template<class T>
class Object {
public:
private:char* _memory = nullptr; //指向内存池的起始位置size_t _remain = 0;      //内存剩余空间大小void* _freelist = nullptr; //指向自由链表的第一个节点的指针
};

这里定义三个私有成员变量,具体用处见上述代码注释。

New对象的主要逻辑

首先我们对于空间申请的类,肯定就是new 和 delete两个重要的接口。我们先来写new:

T* New()
{T* obj = nullptr; //先顶一个返回的objif (_freelist)    //如果自由链表不为空,此时我们直接使用自由链表的空间{//这里就相当于链表的头删void* next = *(void**)_freelist; //定义一个next存储链表下一个节点的地址 obj = (T*)_freelist; //再让obj指向分配内存的首地址_freelist = next;    //再将自由链表连接到下一个节点处}else{if (_remain<sizeof(T))  //如果内存空间剩余大小小于当前类型的大小{//重新像系统申请一块大空间_remain = 128 * 1024; //更新内存剩余空间大小_memory = (char*)malloc(_remain); //开辟空间if (_memory == nullptr)  //如果_memory为空则报错{throw std::bad_alloc();}}obj = (T*)_memory;  //obj接收被切割的首地址size_t objsize = sizeof(T) < sizeof(void*) ?  sizeof(void*) : sizeof(T);  //这里为了防止开辟的空间没有办法储存地址,所以如果类型大小小于地址的大小,则开辟地址大小字节的空间,否则开辟类型大小的空间。_memory += objsize; //随后_memory指向后面的空间_remain -= objsize; //_remain减少//显示调用一下构造,应对string等这些类型的构造new(obj)T;return obj;}
}
delete对象的主要逻辑

delete就相当于是链表的头插

void Delete(T* obj)
{obj->~T();*(void**)obj = _freelist;_freelist = obj;
}

这里的主要逻辑就结束了,接下来对代码进行优化一下。
我们这里使用的还是malloc,所以我们还可以完全脱离malloc使用系统调用接口virtualalloc这个接口直接在堆上申请空间,接下来就是完整代码,还有一段测试的例子我们可以清楚的看到我们的定长内存池在申请同一类型的空间时效率的提升有多夸张。

完整代码

这里我们使用了条件编译用来区分windows和Linux中不同的系统调用接口。

#pragma once
#include<iostream>
#include<vector>using std::cout;
using std::endl;#ifdef _WIN32
#include<windows.h>
#else
// 
#endif
// 直接去堆上按页申请空间
inline static void* SystemAlloc(size_t kpage)
{
#ifdef _WIN32void* ptr = VirtualAlloc(0, kpage << 13, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
#else// linux下brk mmap等
#endifif (ptr == nullptr)throw std::bad_alloc();return ptr;
}template<class T>
class ObjectPool{
public:T* New(){T* obj = nullptr;if (_freelist)//如果自由链表不为空则使用自由链表中的空间{void* next = *(void**)_freelist;obj = (T*)_freelist;_freelist = next;}else {if (_remain < sizeof(T)){_remain = 128 * 1024;//_memery = (char*)malloc(_remain);_memery = (char*)SystemAlloc(_remain>>13);if (_memery == nullptr){throw std::bad_alloc();}}obj = (T*)_memery;size_t objsize = sizeof(T) < sizeof(void*) ? sizeof(void*) : sizeof(T);_memery += objsize;_remain -= objsize;}new(obj)T;return obj;}void Delete(T* obj){obj->~T();*(void**)obj = _freelist;_freelist = obj;}private:char* _memery = nullptr;//内存池起始地址size_t _remain = 0; //内存池剩余字节数void* _freelist = nullptr; //自由链表起始地址
};struct TreeNode
{int _val;TreeNode* _left;TreeNode* _right;TreeNode():_val(0), _left(nullptr), _right(nullptr){}
};void TestObjectPool()
{// 申请释放的轮次const size_t Rounds = 5;// 每轮申请释放多少次const size_t N = 100000;std::vector<TreeNode*> v1;v1.reserve(N);size_t begin1 = clock();for (size_t j = 0; j < Rounds; ++j){for (int i = 0; i < N; ++i){v1.push_back(new TreeNode);}for (int i = 0; i < N; ++i){delete v1[i];}v1.clear();}size_t end1 = clock();std::vector<TreeNode*> v2;v2.reserve(N);ObjectPool<TreeNode> TNPool;size_t begin2 = clock();for (size_t j = 0; j < Rounds; ++j){for (int i = 0; i < N; ++i){v2.push_back(TNPool.New());}for (int i = 0; i < N; ++i){TNPool.Delete(v2[i]);}v2.clear();}size_t end2 = clock();cout << "new cost time:" << end1 - begin1 << endl;cout << "object pool cost time:" << end2 - begin2 << endl;
}

Debug:在这里插入图片描述
Release:
在这里插入图片描述

相关文章:

高并发内存池(定长内存池基础)

定长内存池的设计 定长内存池定长内存池的原理讲解代码实现定义对象New对象的主要逻辑delete对象的主要逻辑完整代码 定长内存池 为什么我们要设计这个定长内存池呢&#xff1f;首先malloc是c标准库中向堆申请空间的接口&#xff0c;变相的说malloc是普遍性&#xff0c;而我们…...

element-ui plus 中 filter-method 函数多次触发问题解决

前情提要 点进这个文章的小伙伴&#xff0c;应该都是为了解决一个需求&#xff0c;把原本的前端过滤改为后端过滤&#xff0c;但是将filter-method修改为后端取数据后&#xff0c;发现其触发了很多次。博主也是在修改表格过滤时用到了这个坑&#xff0c;本篇文章为大家解决一下…...

物联网场景实战:智能电表数据管理与分析(一)

智能电表与物联网的融合 在当今数字化时代&#xff0c;随着物联网&#xff08;IoT&#xff09;技术的飞速发展&#xff0c;各行业都在积极探索如何利用这一技术实现转型升级 。电力行业也不例外&#xff0c;智能电表作为电力系统与物联网融合的关键节点&#xff0c;正发挥着越来…...

网络中的基本概念

这篇文章主要介绍我们在学习网络的过程中&#xff0c;会碰到的一系名词&#xff0c;对其概念进行解释&#xff0c;让大家知道这些都是干什么的。 网络&#xff1a;若干个节点和连接这些节点的链路组成的&#xff0c;用于实现信息交换资源共享。 节点&#xff1a;网络中各种接地…...

行锁(Row Locking)和MVCC(多版本并发控制)

在数据库系统中&#xff0c;**行锁&#xff08;Row Locking&#xff09;和MVCC&#xff08;多版本并发控制&#xff09;**是两种不同的并发控制机制&#xff0c;它们的使用场景和原理有显著区别。以下是详细对比和适用场景分析&#xff1a; 一、行锁&#xff08;Row Locking&am…...

AlexNet神经网络详解及VGGNet模型和

AlexNet模型细节 一共8层&#xff0c;5个卷积层&#xff0c;3个全连接层 AlexNet工程技巧 多GPU训练&#xff0c;ReLU激活函数&#xff0c;LRN归一化&#xff0c;Dropout&#xff0c;重叠池化&#xff0c;数据增强等 多GPU训练 除了将模型的神经元进行了并行&#xff0c;还使…...

【Linux网络】Socket 编程TCP

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343 &#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/qinjh_/category_12891150.html 目录 TCP socket API 详解 socket(): bind(): listen(): accept(): connect V0…...

代码训练day27贪心算法p1

贪心的本质是选择每一阶段的局部最优&#xff0c;从而达到全局最优 贪心算法一般分为如下四步&#xff1a; 将问题分解为若干个子问题找出适合的贪心策略求解每一个子问题的最优解将局部最优解堆叠成全局最优解 1.分发饼干 先将饼干数组和小孩数组排序。 然后从后向前遍历…...

基于RV1126开发板的车辆检测算法开发

1. 车辆检测简介 车辆检测是一种基于深度学习的对人进行检测定位的目标检测&#xff0c;能广泛的用于园区管理、交通分析等多种场景&#xff0c;是违停识别、堵车识别、车流统计等多种算法的基石算法。 人脸检测算法mAP0.5CAR0.78029 基于EASY-EAI-Nano硬件主板的运行效率&…...

Leetcode——137 260找出只出现一次的数

文章目录 找出只出现一次的数引入Leetcode 260Leetcode 137 找出只出现一次的数 对于数组中有一类题&#xff0c;即某些数据在数组中只出现一遍&#xff0c;需要我们找出&#xff0c;今天我们来看看这个类型的题。 引入 想必大家应该见过这么一道题&#xff1a; 现给定一个数…...

【多线程-第四天-自己模拟SDWebImage的下载图片功能-看SDWebImage的Demo Objective-C语言】

一、我们打开之前我们写的异步下载网络图片的项目,把刚刚我们写好的分类拖进来 1.我们这个分类包含哪些文件: 1)HMDownloaderOperation类, 2)HMDownloaderOperationManager类, 3)NSString+Sandbox分类, 4)UIImageView+WebCache分类, 这四个文件吧,把它们拖过来…...

【5G学习】基本概念之多频资源以及子载波和信道

在5G通信中&#xff0c;子载波、信道以及时域、频域、码域、空域是构建无线传输系统的核心概念。它们共同定义了信号的传输方式、资源分配和多维复用技术。以下是详细解释及其相互关系&#xff1a; 一、核心概念定义 1. 子载波&#xff08;Subcarrier&#xff09; 定义&#…...

鸿蒙动画与交互设计:ArkUI 3D变换与手势事件详解

大家好&#xff0c;我是 V 哥。 在鸿蒙 NEXT 开发中&#xff0c;ArkUI 提供了丰富的 3D 变换和手势事件功能&#xff0c;可用于创建生动且交互性强的用户界面。下面详细介绍 ArkUI 的 3D 变换和手势事件&#xff0c;并给出相应的 ArkTS 案例代码。 1. ArkUI 3D 变换 ArkUI 支…...

敏感数据触发后怎么保障安全?

当敏感数据被触发或泄露时&#xff0c;需立即采取系统化措施控制风险。以下为分阶段应对策略&#xff0c;结合技术与管理手段&#xff1a; 一、即时响应阶段 阻断扩散 隔离受影响系统&#xff1a;立即断开网络连接、暂停服务或关闭相关端口。 终止可疑进程&#xff1a;通过华…...

【CVE-2024-10929】ARM CPU漏洞安全通告

安全之安全(security)博客目录导读 目录 一、概述 二、CVE详情 三、受影响产品 四、建议措施 五、致谢 六、版本历史 一、概述 在部分基于Arm架构的CPU中发现了一个潜在安全问题&#xff0c;称为Spectre-BSE&#xff08;Branch Status Eviction&#xff0c;分支状态驱逐…...

高级java每日一道面试题-2025年4月06日-微服务篇[Nacos篇]-如何诊断和解决Nacos中的常见问题?

如果有遗漏,评论区告诉我进行补充 面试官: 如何诊断和解决Nacos中的常见问题&#xff1f; 我回答: 在Java高级面试中诊断和解决Nacos常见问题的综合回答 在Java高级面试中&#xff0c;当被问及如何诊断和解决Nacos中的常见问题时&#xff0c;可以从以下几个方面进行详细阐述…...

【模块化拆解与多视角信息3】教育背景:学历通胀时代的生存法则

教育背景:学历通胀时代的生存法则 写在最前 作为一个中古程序猿,我有很多自己想做的事情,比如埋头苦干手搓一个低代码数据库设计平台(目前只针对写java的朋友),比如很喜欢帮身边的朋友看看简历,讲讲面试技巧,毕竟工作这么多年,也做到过高管,有很多面人经历,意见还算…...

无人机3S与4S电池技术对比!

一、基础参数对比 1. 电芯与电压 3S电池&#xff1a;由3节锂电芯串联组成&#xff0c;标称电压为11.1V&#xff08;单节3.7V3&#xff09;&#xff0c;满电电压约12.6V。 4S电池&#xff1a;由4节电芯串联&#xff0c;标称电压14.8V&#xff08;3.7V4&#xff09;&#…...

linux电源管理(二),内核的CPUFreq(DVFS)和ARM的SCPI

更多linux系统电源管理相关的内容请看&#xff1a;https://blog.csdn.net/u010936265/article/details/146436725?spm1011.2415.3001.5331 1 简介 CPUFreq子系统位于drivers/cpufreq目录下&#xff0c;负责进行运行过程中CPU频率和电压的动态调整&#xff0c;即DVFS (Dynami…...

短波红外高光谱相机:高光谱成像在塑料分选中的应用

随着塑料工业的迅猛发展&#xff0c;塑料包装制品需求量增长迅速&#xff0c;消耗量不断上升&#xff0c;废塑料产生量也急剧增加。由于塑料化学结构稳定&#xff0c;难以自然降解&#xff0c;不当使用和处置及累积会造成严重的环境污染和资源浪费。因此&#xff0c;快速、精准…...

通过OBD部署OceanBase社区版集群v4.3.5

以下内容结合OceanBase官方文档进行安装部署测试 官方文档地址&#xff1a;https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000002016072 一.环境准备 准备三台虚拟机&#xff0c;配置信息如下 192.168.232.8 centos7.9 4c16g 硬盘100g 192.168.232.9 …...

【Java学习笔记】注释

注释 为什么要写注释&#xff1f; 养成良好的编程习惯&#xff0c;方便后续阅读和查看&#xff0c;理顺思路&#xff0c;增加可读性 对自己的代码负责&#xff0c;对别人负责 说明 1. 被注释的文字&#xff0c;不会被 JVM&#xff08;虚拟机&#xff09;解释执行 2. 多行注…...

Python 调用 YOLO ONNX

Python 调用 YOLO ONNX 1 下载ONNX文件2 Python代码 1 下载ONNX文件 ONNX下载地址 2 Python代码 import cv2 from ultralytics import YOLO# 加载 YOLOv11 model YOLO(./yolo11n.pt)# 读取图片 image_path ./11.png img cv2.imread(image_path)# 推理&#xff08;可以传…...

Linux 下 Module 工具的介绍与使用

参考&#xff1a; https://www.fasteda.cn/post/22.html https://modules.readthedocs.io/en/latest/module.html Linux 下 Module 工具的介绍与使用 一、前言 在 Linux 中&#xff0c;当同一款编辑器、运行库、软件存在多个版本且多个版本都需要在不同的场景或人员使用时&a…...

批量归一化(Batch Normalization)原理与PyTorch实现

批量归一化&#xff08;Batch Normalization&#xff09;是加速深度神经网络训练的常用技术。本文通过Fashion-MNIST数据集&#xff0c;演示如何从零实现批量归一化&#xff0c;并对比PyTorch内置API的简洁实现方式。 1. 从零实现批量归一化 1.1 批量归一化函数实现 import t…...

Flutter 文本组件深度剖析:从基础到高级应用

引言 在 Flutter 应用开发中&#xff0c;文本是向用户传达信息的重要媒介。Flutter 提供了丰富且强大的文本组件和相关属性&#xff0c;使开发者能够轻松实现多样化的文本展示效果。无论是简单的静态文本显示&#xff0c;还是复杂的富文本渲染&#xff0c;Flutter 都能满足需求…...

FABC是什么?

在销售和品牌营销领域&#xff0c;FABC 是一种用于构建销售话术和营销信息的框架&#xff0c;其全称为 Features&#xff08;特点&#xff09;、Advantages&#xff08;优势&#xff09;、Benefits&#xff08;利益&#xff09;、Case&#xff08;案例&#xff09;。该模型帮助…...

【MySQL】MVCC工作原理、事务隔离机制、undo log回滚日志、间隙锁

一、什么是MVCC&#xff1f; MVCC&#xff0c;即 Multiversion Concurrency Control&#xff08;多版本并发控制&#xff09;&#xff0c;它是数据库实现并发控制的一种方式。 MVCC 的核心思想是&#xff1a; 为每个事务提供数据的“快照”版本&#xff0c;从而避免加锁&…...

Spring Boot 集成 RocketMQ 全流程指南:从依赖引入到消息收发

前言 在分布式系统中&#xff0c;消息中间件是解耦服务、实现异步通信的核心组件。RocketMQ 作为阿里巴巴开源的高性能分布式消息中间件&#xff0c;凭借其高吞吐、低延迟、高可靠等特性&#xff0c;成为企业级应用的首选。而 Spring Boot 通过其“约定优于配置”的设计理念&a…...

PCL 点云RANSAC提取平面(非内置函数)

文章目录 一、算法实现1.1实现步骤二、实现代码三、实现效果参考资料一、算法实现 1.1实现步骤 1、确定模型。三个点确定一个平面,方程式为 a x + b y + c z + 1 = 0 ax+by+cz+1=0...

中介者模式:理论、实践与 Spring 源码解析

摘要 本论文以中介者模式为核心,系统阐述其设计原理、应用场景及在 Spring 框架中的实现机制。通过机票预订系统、银行交易系统等典型案例,具象化展示模式如何解耦复杂对象交互;结合 Spring 5.3.29 源码,深入剖析事件驱动模型中ApplicationEventPublisher与ApplicationLis…...

2025.04.14【Table】| 生信数据表图技巧

Custom title A set of examples showing how to customize the titles of a table made with GT Custom footer How to customize the footer and the references section of a gt table 文章目录 Custom titleCustom footer 生信数据可视化&#xff1a;Table图表详解1. R语…...

Unified Modeling Language,统一建模语言

UML&#xff08;Unified Modeling Language&#xff0c;统一建模语言&#xff09;是一种标准化的图形化建模语言&#xff0c;用于可视化、规范和文档化软件系统的设计。UML 提供了一套通用的符号和规则&#xff0c;帮助开发者、架构师和团队成员更好地理解和沟通软件系统的结构…...

OCP证书有效期是永久,但需要更新

在数据库管理领域&#xff0c;OCP证书作为Oracle认证体系中的重要组成部分&#xff0c;一直是数据库专业人士追求的目标。许多考证者会有疑惑:OCP证书是永久有效的吗&#xff1f;需要更新吗&#xff1f; Oracle官方明确规定&#xff1a;OCP证书一经获得&#xff0c;终身有效。无…...

服务器本地搭建

socket函数 它用于创建一个新的套接字&#xff08;socket&#xff09;。 函数原型 #include <sys/socket.h> int socket(int domain, int type, int protocol);参数解释 domain&#xff1a;它指定了通信所使用的协议族&#xff0c;常见的取值如下&#xff1a; AF_INET…...

调节磁盘和CPU的矛盾——InnoDB的Buffer Pool

缓存的重要性 无论是用于存储用户数据的索引【聚簇索引、二级索引】还是各种系统数据&#xff0c;都是以页的形式存放在表空间中【对一个/几个实际文件的抽象&#xff0c;存储在磁盘上】如果需要访问某页的数据&#xff0c;就会把完整的页数据加载到内存中【即使只访问页中的一…...

[dp12_回文子串] 最长回文子串 | 分割回文串 IV

目录 1.回文子串 题解 2.最长回文子串 题解 3.分割回文串 IV 题解 dp[i][j] 表示 s 字符串 [i, j] 的子串&#xff0c;是否是回文串( 建始末表&#xff09; 将两个 for 循环的结果&#xff0c;借助二维 dp 来存 1.回文子串 链接&#xff1a;647. 回文子串 给你一个字符…...

分布式应用架构的演变

整体演变过程 第一阶段&#xff1a;单一应用架构 单一应用架构&#xff0c;是把所有服务都放在一个项目中&#xff0c;进行打包部署到服务器上&#xff0c;如果流量特别大的话&#xff0c;就在另外的服务器上部署相同的功能模块用来分摊流量。但是这样的话&#xff0c;一旦有某…...

zephyr RTOS 中 bt_le_adv_start函数的功能应用

目录 概述 1 功能 1.1 功能介绍 1.2 函数原型 2 参数说明 2.1 广播参数&#xff08;bt_le_adv_param&#xff09; 2.2 常用广播选项&#xff08;options&#xff09; 2.3 广播数据&#xff08;bt_data&#xff09; 3 示例代码 3.1 启动可连接广播&#xff08;带设备名…...

双按键控制LED(中断优先级)

1.启动时&#xff0c;两个LED灯熄灭&#xff0c;1秒钟后&#xff08;定时器实现&#xff09;&#xff0c;LED自动点亮&#xff1b; 2.按键1按下后&#xff0c;通过中断int0把两个LED熄灭5s时间&#xff0c;int0优先级设置为最高&#xff08;优先级必须设置&#xff0c;设置后才…...

美团即时零售大动作,将独立的闪购将会改变什么?

4月12日上午&#xff0c;美团核心本地商业CEO王莆中在社交媒体上发文&#xff0c;宣布美团将在下周正式发布即时零售品牌&#xff0c;标志着美团将进一步发展即时零售业务。 首先&#xff0c;从市场格局角度来看&#xff0c;美团将独立的闪购品牌推出&#xff0c;会进一步加剧…...

如何安装git?

以下是 Windows、macOS 和 Linux 系统安装 Git 的详细步骤&#xff1a; 一、Windows 系统安装 Git 下载安装包 访问 Git 官网下载页&#xff0c;点击下载 Windows 版安装程序&#xff08;如 Git-2.45.1-64-bit.exe&#xff09;。 运行安装程序 安装选项&#xff1a; 选择安装路…...

Ubuntu上docker、docker-compose的安装

今天来实践下Ubuntu上面安装docker跟docker-compose&#xff0c;为后面安装dify、fastgpt做准备。 一、安装docker sudo apt-get updatesudo apt-get install docker.io 然后系统输入 docker --version 出现下图即为docker安装成功。 二、安装docker-compose 我先看下系统…...

ubuntu如何设置静态ip

服务器有时是通过dhcp动态获取ip的&#xff0c;有时出于远程登录方便的考虑&#xff0c;会将其设置为静态ip&#xff0c;以下是设置静态ip的方法 在 Ubuntu 中设置静态 IP 的方法取决于你使用的网络管理工具&#xff08;如 netplan、NetworkManager 或 ifconfig&#xff09;。…...

js原型和原型链

js原型&#xff1a; 1、原型诞生的目的是什么呢&#xff1f; js原型的产生是为了解决在js对象实例之间共享属性和方法&#xff0c;并把他们很好聚集在一起&#xff08;原型对象上&#xff09;。每个函数都会创建一个prototype属性&#xff0c;这个属性指向的就是原型对象。 …...

大数据 - 2. Hadoop - HDFS

前言 HDFS&#xff1a;分布式文件系统 为什么海量数据需要分布式存储技术&#xff1f; 文件过大时&#xff0c;单台服务器无法承担&#xff0c;要靠数量来解决。数量的提升带来的是网络传输、磁盘读写、CPU、内存等各方面的提升。 众多的服务器一起工作&#xff0c;如何保证…...

嵌入式硬件常用总线接口知识体系总结和对比

0.前言 在嵌入式工程实现中,多多少少我们都使用过总线,各种各样的总线应用于不同场合,不同场景有不同的优势,但是我们在作为工程师过程中在如何选择项目合适的总线,根据什么来选?需要我们对项目全局和总线特征有所了解,本文目的就是对比多种总线的关键特征 我们在聊到…...

prime 1 靶场笔记(渗透测试)

环境说明&#xff1a; 靶机prime1和kali都使用的是NAT模式&#xff0c;网段在192.168.144.0/24。 Download (Mirror): https://download.vulnhub.com/prime/Prime_Series_Level-1.rar 一.信息收集 1.主机探测&#xff1a; 使用nmap进行全面扫描扫描&#xff0c;找到目标地址及…...

(二十四)安卓开发中的AppCompatActivity详解

在安卓开发中&#xff0c;AppCompatActivity 是一个非常核心的类&#xff0c;它继承自 Activity&#xff0c;并通过 Android Support Library&#xff08;现已迁移至 AndroidX&#xff09;提供了对 ActionBar 和 Material Design 的支持。它的主要作用是帮助开发者在不同版本的…...

AI大模型+全渠道整合:容联七陌智能客服赋能制造业升级

自《中国制造2025》战略提出以来&#xff0c;制造业的智能化发展进入快车道&#xff0c;但行业仍面临劳动力成本上升、供应链不透明、客户需求碎片化等挑战。企业亟需通过技术手段实现降本增效&#xff0c;而智能化客户服务成为关键突破口。 与此同时&#xff0c;客服行业正经历…...