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

RT_Thread——内存管理

文章目录

  • 一、为什么要自己实现内存管理
  • 二、RT-Thread 的内存管理方法
    • 2.1 小内存管理算法
    • 2.2 slab 管理算法
    • 2.3 memheap 管理算法
  • 三、Heap 相关的函数
    • 3.1 rt_system_heap_init
    • 3.2 rt_malloc/rt_realloc/rt_calloc
    • 2.3 rt_free
    • 2.4 rt_malloc_sethook/rt_free_sethook

一、为什么要自己实现内存管理

后续的章节涉及这些内核对象:thread(线程)、messagequeue(消息队列)、semaphore(信号量)和rt_event(事件集)等。

为了让RT-Thread 更容易使用,这些内核对象一般都是动态分配:用到时分配,不使用时释放

使用内存的动态管理功能,简化了程序设计:不再需要小心翼翼地提前规划各类对象,简化API 函数的涉及,甚至可以减少内存的使用。

内存的动态管理是 C 程序的知识范畴,并不属于 RT-Thread 的知识范畴,但是它跟 RT-Thread 关系是如此紧密,所以我们先了解它。

在C语言的库函数中,有mallc、free等函数,但是在RT-Thread 中,它们不适用:

  • 不适合用在资源紧缺的嵌入式系统中
  • 这些函数的实现过于复杂、占据的代码空间太大
  • 并非线程安全的(thread-safe)
  • 运行有不确定性:每次调用这些函数时花费的时间可能都不相同
  • 内存碎片化
  • 使用不同的编译器时,需要进行复杂的配置
  • 有时候难以调试

注意:我们经常"堆栈"混合着说,其实它们不是同一个东西:

  • 堆,heap,就是一块空闲的内存,需要提供管理函数
    • malloc:从堆里划出一块空间给程序使用
    • free:用完后,再把它标记为"空闲"的,可以再次使用
  • 栈,stack,函数调用时局部变量保存在栈中当前程序的环境也是保存在栈中
    • 可以从堆中分配一块空间用作栈

在这里插入图片描述

二、RT-Thread 的内存管理方法

RT-Thread 中内存管理的接口函数为:rt_malloc 、rt_free,对应于 C 库的 malloc、free。

RT-Thread 为了满足不同的需求,提供三种内存栈管理方法,三种方法都使用一样的函数进行操作。

在系统运行时只能选择其中一种方法,甚至可以不使用内存堆管理机制也可以:代码里不调用rt_malloc 函数

在这里插入图片描述

通常在 Keill 工程目录,可以找到 rtconfig.h,可以在里面配置这些宏之一,选择某个文件:

  • RT_USING_SMALL_MEM:默认使用的是小内存管理算法(SMALL_MEM)
  • RT_USING_SLAB:slab 管理方法
  • RT_USING_MEMHEAP:memheap 管理方法
/* Memory Management */ 
##define RT_USING_HEAP            /* 使用堆 */ 
##define RT_USING_SMALL_MEM       /* 使用哪种堆管理方法 */ 
##define RT_USING_MEMPOOL         /* 使用内存池: 从堆里分配内存后进行二次管理 */ 

2.1 小内存管理算法

小内存管理算法是最简单的内存分配算法,需要内存就分割一块:

  • 初始时,内存是一块大内存,需要分配内存时,从这块大内存分割一块内存
  • 每块内存,都包含一个管理用的数据头,里面有指向下一个内存块的指针,通过链表的形式串起来
  • 数据头包含四个成员:magic(一个固定值,作为标志指示内存块是否被非法改写)、used(指示内存是否分配使用)、next(指向下一个块内存)、prev(指向上一块内存)

使用小内存管理算法时,内存分配过程如下图所示:

在这里插入图片描述

  • 假设已经使用这个方法管理了内存,当前时刻空闲链表指针 lfree 指向大小为32字节的内存块
  • 当用户需要分配一个64字节的内存块时,lfree指向的内存块只有32字节不能满足要求,内存管理器会继续寻找下一内存块
  • 下一内存块只有60字节,而且已经分配了,因此继续寻找下一内存块
  • 下一内存块有128 字节,且没有使用过,满足需求,但这块内存比较大,分配器会将剩下的内存块,继续放在链表中
  • 这里内存块原来为128字节,使用64字节,另外数据头占据12字节,就只剩下52字节

内存释放过程如下:

  • 释放时,分配器查看前后相邻的内存块是否空闲,如果空闲则合并为一块大内存

2.2 slab 管理算法

小内存管理算法需要频繁的分配、释放内存,可能会影响系统效率。

当系统内存比较大,我们可以提前分配好若干大小的内存块,直接供给线程使用,可以一定程度的提高效率,但会浪费一些内存。

slab 管理方法的核心在于有多个链表,每个链表中存放相同大小的内存块:

  • 每个 zone_array 数据项就是一个链表,里面存放有多个 zone,zone 里有多个固定大小的小内存块
    • zone_array[0]里存放这些 zone,它们被分为小内存块,这些小内存块大小都是8字节
    • zone_array[1]里存放这些 zone,它们被分为小内存块,这些小内存块大小都是16字节
    • zone_array[71]里存放这些 zone,它们被分为小内存块,这些小内存块大小都是16K字节

在这里插入图片描述

下面以情景分析的方法演示slab管理方法,假设想分配32字节的空间:

  1. 初始状态:zone_array[3]为空
    在这里插入图片描述
  2. 调用rt_malloc(32),发现zone_array[3]为空,于是向页分配器申请一大块内存,这被称为zone
    在这里插入图片描述
  3. 从这个zone中,分配得到一个小内存块,它被称为chunk:下图中32字节的小内存被称为chunk
    在这里插入图片描述
  4. zone_array[3]指向 zone,并且 rt_malloc(32)返回这个 chunk
  5. 再次调用rt_malloc(32),发现zone_array[3]非空,于是从这个 zone 中继续分配 32 字节的chunk:
    在这里插入图片描述
    下面再次以情景分析的方法演示slab 管理方法,假设释放上面分配得到的2 个chunk:

(1) 这两个chunk 会被放入zone的z_freechunk 链表:
在这里插入图片描述
(2) 这时这个zone 就全部是空闲状态,如果zone_array[3]还有其他zone 可用于分配内存,那么这个全部空闲的zone就会从zone_array[3]中移除,放入zone_free 链表

2.3 memheap 管理算法

在嵌入式系统中,除了芯片内部的内存,可能还会外扩内存。

memheap 管理算法就是针对这种情况,可以将多个地址不连续的内存堆,组成一个大的内存堆

RT-Thread 通过 memheap_item 链表,将多个内存堆进行连接。

当分配内存时,会先尝试从默认的内存堆分配内存,当分配失败时,再去 memheap_item 链表一次尝试其它内存堆

对于用于的应用程序而言,不用关心内部实现,就当作在一个内存堆上操作。

在这里插入图片描述

这三种算法,可以比作吃西瓜:

  • 对于小内存管理算法:一个西瓜,自己要吃多少,就去切多少
  • 对于slab 管理算法:一个西瓜,已经切好了若干大小,自己要吃多少,就去拿对应大小的
  • 对于memheap管理算法:两个西瓜,第一个吃完了,就去吃第二个

三、Heap 相关的函数

3.1 rt_system_heap_init

函数原型:

void rt_system_heap_init(void* begin_addr, void* end_addr);

作用:如果要使用内存堆,必须调用该函数进行初始化堆,参数为堆的开始地址和结束地址

该函数通常在 board.cdrv_common.c 等类似的系统初始化里

3.2 rt_malloc/rt_realloc/rt_calloc

函数原型:

void *rt_malloc(rt_size_t nbytes); 
void *rt_realloc(void *rmem, rt_size_t newsize); 
void *rt_calloc(rt_size_t count, rt_size_t size); 

作用:

  • rt_malloc:从内存堆中找到 nbytes 大小的内存,返回内存块地址
  • rt_realloc:将已分配的内存 rmem 重新分配为 newsize 大小。若大小增加,原来的内存块数据不变;若缩小,后面的数据将被截断
  • rt_calloc:从内存堆中分配 count 个,大小为 size 的内存块,返回首个内存块的地址

2.3 rt_free

函数原型:

void rt_free (void *ptr); 

作用:申请的内存使用完后,必须调用该函数进行释放,否则会造成内存泄漏

2.4 rt_malloc_sethook/rt_free_sethook

函数原型:

void rt_malloc_sethook(void (*hook)(void *ptr, rt_size_t size)); 
void rt_free_sethook(void (*hook)(void *ptr)); 

作用:

  • rt_malloc_sethook:内存分配完成后,将回调本函数,用户可以自己设置钩子函数的内容
  • rt_free_sethook:内存释放完成前,将回调本函数,用户可以自己设置钩子函数的内容

相关文章:

RT_Thread——内存管理

文章目录 一、为什么要自己实现内存管理二、RT-Thread 的内存管理方法2.1 小内存管理算法2.2 slab 管理算法2.3 memheap 管理算法 三、Heap 相关的函数3.1 rt_system_heap_init3.2 rt_malloc/rt_realloc/rt_calloc2.3 rt_free2.4 rt_malloc_sethook/rt_free_sethook 一、为什么…...

Temporary failure in name resolution

这个错误 ping: baidu.com: Temporary failure in name resolution 通常表示 DNS 解析的问题,也就是说你的系统无法通过域名服务器解析 baidu.com 的 IP 地址。 解决方案: 检查 DNS 配置( 有效 ): 确保系统的 DNS 配置是正确的。你可以检查 …...

【动手学深度学习】1.4~1.8 深度学习的发展及其特征

目录 1.4. 起源1.5. 深度学习的发展1.6. 深度学习的成功案例1.7. 特点1.8. 小结 1.4. 起源 深度学习的起源可追溯至多个领域的长期发展: 统计学基础:早期统计学方法(如伯努利分布、高斯分布、最小均方算法)和估计思想&#xff08…...

深度学习之序列建模的核心技术:LSTM架构深度解析与优化策略

LSTM深度解析 一、引言 在深度学习领域,循环神经网络(RNN)在处理序列数据方面具有独特的优势,例如语音识别、自然语言处理等任务。然而,传统的 RNN 在处理长序列数据时面临着严重的梯度消失问题,这使得网…...

Gartner研究报告《Generative AI 赋能Digital Commerce的三种路径》学习心得

一、研究背景 随着生成式 AI(GenAI)技术的迅速发展,其在数字商务领域的应用受到了广泛关注。这篇研究报告深入探讨了 GenAI 在数字商务中的角色以及它如何与现有的数字商务技术相结合来发挥优势,为应用领导者提供了关于如何利用 GenAI 优化技术投资策略的见解。 二、GenA…...

解锁 YOLOv8 新潜能:EfficientViT 主干网络的优化实践与实验数据解读

文章目录 一、YOLO 系列主干网络的发展历程二、EfficientViT:YOLOv8 主干网络的新宠(一)EfficientViT 的核心优势(二)EfficientViT 在 YOLOv8 中的集成与实现 三、实验对比:EfficientViT vs. MobileNet 系列…...

【前端基础】12、CSS的overflow(visible、hidden、scroll、auto)【注:只有最基础的说明。】

一、overflow的作用 用于控制内容溢出时的行为。 二、overflow的使用 visible:超出的部分正常显示(默认设定) hidden:超出的部分隐藏显示(直接裁剪掉) scroll:超出的部分滚动显示 滚动条…...

创建一个element plus项目

当然可以&#xff01;下面是一个 Vue 3 Element Plus 的最简单完整示例&#xff0c;它包括&#xff1a; 使用 <el-button> 按钮组件点击按钮后用 ElMessage 弹出提示 ✅ 1. 安装并初始化项目&#xff08;如果还没创建项目&#xff09; 你可以用官方推荐的方式快速创建…...

openCV1.1 Mat对象

imread(“D:\souse\duoxile.jpg”, IMREAD_COLOR); 功能: 从指定路径读取图像文件并解码为OpenCV的Mat对象 第一个参数: 文件路径 类型: const string&描述: 要读取的图像文件的绝对或相对路径示例: “D:\souse\duoxile.jpg” 或 “./images/test.png”第二个参数: 读取模…...

C++:array容器

array容器是序列容器&#xff0c;它的特点是&#xff1a;静态&#xff0c;固定数目。可以看作更安全的数组。 它还有一些成员函数&#xff0c;如begin&#xff08;&#xff09;&#xff1a;返回指向容器中第一个元素的随机访问迭代器。 #include<iostream>//数组容器 #…...

26、AI 预测性维护 (燃气轮机轴承) - /安全与维护组件/ai-predictive-maintenance-turbine

76个工业组件库示例汇总 AI 预测性维护模拟组件 (燃气轮机轴承) 概述 这是一个交互式的 Web 组件,旨在模拟基于 AI 的预测性维护 (Predictive Maintenance, PdM) 概念,应用于工业燃气轮机的关键部件(例如轴承)。它通过模拟传感器数据、动态预测剩余使用寿命 (RUL),并根…...

特种兵参会

出发&#xff08;5.15&#xff09; 有了去年去5月去深圳参加OpenTenBase工委会成立的经验&#xff0c;今年这个时候去广州就一定要在下午16点前起飞。恰好到了候机口有蔚来的牛屋&#xff0c;进去躺了一会。飞机顺利到达广州。晚上小聚 总监约了祁总&#xff0c;我们相识多年&…...

手搓四人麻将程序

一、麻将牌的表示 在麻将游戏中&#xff0c;总共有一百四十四张牌&#xff0c;这些牌被分为多个类别&#xff0c;每个类别又包含了不同的牌型。具体来说&#xff0c;麻将牌主要包括序数牌、字牌和花牌三大类。序数牌中&#xff0c;包含有万子、条子和筒子&#xff0c;每种花色…...

一命通关单调栈

前言 我们只是卑微的后端开发。按理说&#xff0c;我们是不需要学这些比较进阶的算法的&#xff0c;可是&#xff0c;这个世界就是不讲道理。最开始&#xff0c;想法是给leetcode中等题全通关&#xff0c;我又不打ACM我去天天钻研hard干嘛&#xff0c;于是碰见单调栈树状数组的…...

NV009NV010美光闪存颗粒NV011NV012

NV009NV010美光闪存颗粒NV011NV012 美光NV009-NV012闪存颗粒技术解析与行业应用全景 一、核心技术架构与制程突破 美光NV009至NV012系列闪存颗粒基于第九代3D TLC架构&#xff0c;通过垂直堆叠技术突破传统2D平面存储的物理限制。该架构将存储单元分层排列&#xff0c;如同将…...

线程、线程池、异步

目录 什么是线程 什么是线程池 什么是异步 异步与线程关系 JS中的异步 什么是线程 线程 Thread 是计算机执行的最小单位&#xff0c;是 进程 内的一个实体&#xff0c;可以被操作系统独立调用和执行 线程可以理解为进程内的“程序执行流”&#xff0c;一个进程可以包含多…...

docker面试题(4)

Docker与Vagrant有何不同 两者的定位完全不同 Vagrant类似于Boot2Docker&#xff08;一款运行Docker的最小内核&#xff09;&#xff0c;是一套虚拟机的管理环境&#xff0c;Vagrant可 以在多种系统上和虚拟机软件中运行&#xff0c;可以在Windows、Mac等非Linux平台上为Docker…...

双检锁(Double-Checked Locking)单例模式

在项目中使用双检锁&#xff08;Double-Checked Locking&#xff09;单例模式来管理 JSON 格式化处理对象&#xff08;如 ObjectMapper 在 Jackson 库中&#xff0c;或 JsonParser 在 Gson 库中&#xff09;是一种常见的做法。这种模式确保了对象只被创建一次&#xff0c;同时在…...

建立java项目

java端: 在idea里面新建一个java,maven项目(springboot): 注意:JDK与java都得是一样的 添加基本的依赖项: 也可以在pom.xml中点击这个,从而跳转到添加依赖 建立三层架构: 在相应的java类中添加代码: <1.UserController package com.example.demo.controller;import com…...

Go语言内存共享与扩容机制 -《Go语言实战指南》

切片作为 Go 中的高频数据结构&#xff0c;其内存共享机制和自动扩容策略直接影响程序性能与行为&#xff0c;深入理解这两者&#xff0c;是高效使用切片的关键。 一、切片的内存结构回顾 切片是对底层数组的一个抽象&#xff0c;其本质是一个结构体&#xff1a; type slice …...

如果教材这样讲--单片机IO口Additional Functions和 Alternate Functions的区别

不管是硬件工程师还是嵌入式软件工程师&#xff0c;都应该能够熟练的看懂数据手册&#xff0c;尤其是英文。在设计单片机外围电路时&#xff0c;工程师需要了解单片机的GPIO口的各项功能来满足自己的设计需求&#xff0c;单片机小白们在查看单片机数据手册时&#xff0c;看到Ad…...

《Effective Java(第三版)》笔记

思维导图 1-4章 5-8章 9-12 章 资料 源码&#xff1a;https://github.com/jbloch/effective-java-3e-source-code...

实践大模型提示工程(Prompt Engineering)

任务目标 本文将结合实战营中的具体案例&#xff0c;分享在提示词设计、模型调用及复杂任务拆解中的实践心得&#xff0c;希望能为读者打开一扇通往 AI 开发实战的窗口。 书生浦语官方链接 实践一——写一段话介绍书生浦语实战营 在提示工程中&#xff0c;第一点给出清晰的…...

东莞一锂离子电池公司IPO终止,客户与供应商重叠,社保缴纳情况引疑

作者&#xff1a;小熊 来源&#xff1a;IPO魔女 5月17日&#xff0c;深交所发布公告称&#xff0c;东莞市朗泰通科技股份有限公司&#xff08;简称朗泰通科技&#xff09;已主动撤回其IPO申请。该公司本次IPO原拟募集资金7.0208亿元&#xff0c;保荐机构为国金证券股份有限公…...

互联网大厂Java求职面试:Spring Cloud微服务架构与AI集成挑战

互联网大厂Java求职面试&#xff1a;Spring Cloud微服务架构与AI集成挑战 引言 在当前快速发展的互联网行业中&#xff0c;Java开发者在面对复杂的分布式系统设计时&#xff0c;需要掌握从微服务架构到AI模型集成的多种技能。本文通过一场模拟面试&#xff0c;深入探讨了基于…...

解决C#泛型类参数无法带参数实例化的问题

概要 本文提供了一个基于C#表达式目录树的方法来解决泛型参数不能调用带参数的构造方法来实例化的问题。 C#泛型的限制 我们看如下的代码&#xff0c;User类需要一个泛型类&#xff0c;泛型类是要以CreditCard为基类。 class User<T> where T :CreditCard, new() {pr…...

微型化GNSS射频前端芯片AT2659S:L1频段多系统支持,SOT23-6封装

AT2659S是一款采用SiGe技术的低噪声放大器&#xff08;LNA&#xff09;&#xff0c;相比传统CMOS工艺&#xff0c;它在功耗和噪声性能上进行了显著优化。该芯片支持L1频段的多模卫星导航系统&#xff0c;包括北斗二代、GPS、伽利略和Glonass&#xff0c;适用于高灵敏度的GNSS接…...

【图像大模型】深度解析RIFE: 基于中间流估计的实时视频插帧算法

基于深度学习的视频插帧算法RIFE技术解析与实战指南 一、项目背景与技术原理1.1 视频插帧技术概述1.2 RIFE核心创新1.3 算法原理详解1.3.1 网络架构1.3.2 损失函数设计1.3.3 时间自适应训练 二、项目部署与执行指南2.1 环境配置2.2 模型推理2.2.1 快速测试2.2.2 视频处理 2.3 模…...

Docker安装Fluentd采集中间件

Fluentd 简介 &#xff1a;Fluentd 是一个高性能、可扩展的数据收集与聚合工具&#xff0c;能够统一数据收集和消费&#xff0c;实现各种数据源到各种数据接收器的高效传输&#xff0c;广泛应用于日志收集等领域。 功能特点 &#xff1a; 统一日志收集 &#xff1a;支持从各种…...

【攻防实战】MacOS系统上线Cobalt Strike

如果巅峰留不住&#xff0c;那就重走来时路 前言 目前在一些攻防项目中遇到的互联网大厂&#xff0c;很多员工使用的都是MacOS主机。研究过程中发现网上这方面分享比较少&#xff0c;这里记录分享一下。 插件安装 配置cna基础文件&#xff0c;注意路径名不能包含中文或特殊…...

基于Resnet-34的树叶分类(李沐深度学习基础竞赛)

目录 一&#xff0c;数据集介绍 1.1 数据集下载 1.2 数据集介绍 二&#xff0c;Resnet-34介绍 三&#xff0c;模型训练 四&#xff0c;模型预测 五&#xff0c;测试结果 5.1 测试集结果 5.2 预测结果 5.3 总结 一&#xff0c;数据集介绍 1.1 数据集下载 本数据集下载…...

PCB设计实践(二十三)什么是阻抗匹配,需要做啥

PCB设计中的阻抗匹配是高速数字电路、射频通信、信号完整性等领域的核心技术&#xff0c;其重要性贯穿从基础理论到复杂系统设计的全流程。本文将从工程实践角度深入探讨阻抗匹配的本质原理、应用场景、设计方法、常见误区及解决方案&#xff0c;全面解析这一影响现代电子设备性…...

网络世界的“变色龙“:动态IP如何重构你的数据旅程?

在深秋的下午调试代码时&#xff0c;我偶然发现服务器日志中出现异常登录记录——IP地址显示为某个境外数据中心。更有趣的是&#xff0c;当我切换到公司VPN后&#xff0c;这个"可疑IP"竟自动消失在了防火墙监控列表中。这个瞬间让我意识到&#xff1a;现代网络架构中…...

Chrome浏览器捕获hover元素样式

–前言– 某些元素&#xff0c;只有hover上去才会看到触发效果&#xff0c;但是鼠标移开就找不到element元素&#xff0c;导致无法调试样式。下属两种方案可参考&#xff1a; 文章目录 一、方式1&#xff1a;通过class伪类触发二、方式2&#xff1a;通过断点调试2.1控制台切换到…...

嵌入式自学第二十五天(5.21)

&#xff08;1&#xff09;二进制文件读写操作&#xff1a; 例&#xff1a; #include<stdio.h> int main() { FILE *fp fopen("a.out","r"); FILE *fp1 fopen("app","w"); if(NULL fp || NULL fp1) { …...

golang库源码学习——Pond,小而精的工作池库

pond 是一个轻量级的 Goroutine 池库&#xff0c;用于高效管理并发任务。它提供了灵活的配置选项和多种策略&#xff0c;适合处理高并发场景。 GitHub - alitto/pond at v1 一、特点&#xff1a; 1.轻量级 pond 的代码库非常精简&#xff0c;它的V1版本仅有四个业务文件&#…...

Microbiome医口经典思路:退烧药物代谢过程如何进行多组学分析?

乙酰氨基酚&#xff08;APAP&#xff09;&#xff0c;俗称扑热息痛&#xff0c;是应用最广泛的镇痛和解热药物之一。以往的研究主要集中在分离APAP降解菌株&#xff0c;了解其降解代谢途径。但微生物群与对乙酰氨基酚之间的相互作用、对乙酰氨基酚降解基因的分布特征以及对乙酰…...

微信小程序AI大模型流式输出实践与总结

背景 让Cursor生成小程序中大模型调用内容回复的流式输出时一直有问题&#xff0c;参考整理此文章。 参考原文&#xff1a;https://blog.csdn.net/weixin_47684422/article/details/145859543 一、什么是流式传输&#xff1f; 流式传输&#xff08;Streaming&#xff09;指的…...

操作系统理解(xv6)

xv6操作系统项目复习笔记 宗旨&#xff1a;只记大框架&#xff0c;不记细节&#xff0c;没有那么多的时间 一、xv6的页表是如何搭建的&#xff1f; xv6这个项目中&#xff0c;虚拟地址用了39位&#xff08;27位12位&#xff08;物理内存page偏移地址&#xff09;&#xff09…...

2024CCPC辽宁省赛 个人补题 ABCEGJL

Dashboard - 2024 CCPC Liaoning Provincial Contest - Codeforces 过题难度 B A J C L E G 铜奖 4 953 银奖 6 991 金奖 8 1664 B&#xff1a; 模拟题 // Code Start Here string s;cin >> s;reverse(all(s));cout << s << endl;A&#xff1a;很…...

Sentinel原理与SpringBoot整合实战

前言 随着微服务架构的广泛应用&#xff0c;服务和服务之间的稳定性变得越来越重要。在高并发场景下&#xff0c;如何保障服务的稳定性和可用性成为了一个关键问题。阿里巴巴开源的Sentinel作为一个面向分布式服务架构的流量控制组件&#xff0c;提供了从流量控制、熔断降级、…...

Python 训练营打卡 Day 31

文件的规范拆分和写法 把一个文件&#xff0c;拆分成多个具有着独立功能的文件&#xff0c;然后通过import的方式&#xff0c;来调用这些文件。这样具有几个好处&#xff1a; 可以让项目文件变得更加规范和清晰可以让项目文件更加容易维护&#xff0c;修改某一个功能的时候&a…...

vue+srpingboot实现多文件导出

项目场景&#xff1a; vuesrpingboot实现多文件导出 解决方案&#xff1a; 直接上干货 <el-button type"warning" icon"el-icon-download" size"mini" class"no-margin" click"exportSelectedFiles" :disabled"se…...

学习 Pinia 状态管理【Plan - May - Week 2】

一、定义 Store Store 由 defineStore() 定义&#xff0c;它的第一个参数要求独一无二的id import { defineStore } from piniaexport const useAlertsStore defineStore(alert, {// 配置 })最好使用以 use 开头且以 Store 结尾 (比如 useUserStore&#xff0c;useCartStore&a…...

linux中cpu内存浮动占用,C++文件占用cpu内存、定时任务不运行报错(root) PAM ERROR (Permission denied)

文章目录 说明部署文件准备脚本准备部署g++和编译脚本使用说明和测试脚本批量部署脚本说明执行测试定时任务不运行报错(root) PAM ERROR (Permission denied)报错说明处理方案说明 我前面已经弄了几个版本的cpu和内存占用脚本了,但因为都是固定值,所以现在重新弄个用C++编写的…...

数据湖和数据仓库的区别

在当今数据驱动的时代&#xff0c;企业需要处理和存储海量数据。数据湖与数据仓库作为两种主要的数据存储解决方案&#xff0c;各自有其独特的优势与适用场景。本文将客观详细地介绍数据湖与数据仓库的基本概念、核心区别、应用场景以及未来发展趋势&#xff0c;帮助读者更好地…...

OceanBase 开发者大会,拥抱 Data*AI 战略,构建 AI 数据底座

5 月 17 号以“当 SQL 遇见 AI”为主题的 OceanBase 开发者大会在广州举行&#xff0c;因为行程的原因未能现场参会&#xff0c;仍然通过视频直播观看了全部的演讲。总体来说&#xff0c;这届大会既有对未来数据库演进方向的展望&#xff0c;也有 OceanBase 新产品的发布&#…...

鸿蒙HarmonyOS最新的组件间通信的装饰器与状态组件详解

本文系统梳理了鸿蒙&#xff08;HarmonyOS&#xff09;ArkUI中组件间通信相关的装饰器及状态组件的使用方法&#xff0c;重点介绍V2新特性&#xff0c;适合开发者查阅与实践。 概述 鸿蒙系统&#xff08;HarmonyOS&#xff09;ArkUI提供了丰富的装饰器和状态组件&#xff0c;用…...

OneDrive登录,账号跳转问题

你的OneDrive登录无需密码且自动跳转到其他账号&#xff0c;可能是由于浏览器或系统缓存了登录信息&#xff0c;或存在多个账号的关联。以下是分步解决方案&#xff1a; 方案三对我有效。 强制手动输入密码 访问登录页面时&#xff1a; 在浏览器中打开 OneDrive网页版。 点击…...

9-码蹄集600题基础python篇

题目如上图所示。 这一题&#xff0c;没什么难度。 代码如下&#xff1a; def main():#code here# x,amap(int,input("").split(" "))# sum((1/2)*(a*x(ax)/(4*a)))# print(f"{sum:.2f}")x,amap(int,input().split())print(f"{((1/2)*(a*…...