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

Linux内存管理架构(2)

4.虚拟地址空间布局

4.1虚拟地址空间划分

      对于64位处理器,目前不支持完全的64位虚拟地址

1.ARM64内核/用户虚拟地址划分

1. 虚拟地址的最大宽度

  • 最大宽度:虚拟地址的最大宽度是48位。

内核虚拟地址:

  • 在64位地址空间的顶部。
  • 高16位全是1。
  • 范围是 [0xFFFF FFFF FFFF FFFF, 0xFFFF FFFF FFFF FFFF]。

用户虚拟地址:

  • 在64位地址空间的底部。
  • 高16位全是0。
  • 范围是 [0x0000 0000 0000 0000, 0x0000 FFFF FFFF FFFF]。

不规范地址空间:

  • 高16位全是1或者全是0的地址称为规范的地址。
  • 两者之间是不规范的地址,不允许使用。

2. 编译ARM64架构的Linux内核时的选择

页长度选择:

  • 如果选择页长度为4KB,默认的虚拟地址宽度是39位。
  • 如果选择页长度为16KB,默认的虚拟地址宽度是47位。
  • 如果选择页长度为64KB,默认的虚拟地址宽度是42位。
  • 可以选择48位虚拟地址。

3. 内核和用户虚拟地址空间

内核虚拟地址:

  • 所有进程共享内核虚拟地址空间。

用户虚拟地址:

  • 每个进程有独立的用户虚拟地址空间。
  • 同一个线程组的用户线程共享用户虚拟地址空间。
  • 内核线程没有用户虚拟地址空间。 

4.2 用户虚拟地址空间布局 

1.进程的用户虚拟地址空间

起始地址: 0
长度: TASK_SIZE
定义: TASK_SIZE 是由每种处理器架构定义的宏。


#define VA_BITS (CONFIG_ARM64_VA_BITS)
#define VA_START ((UL(0xffffffffffffff) << VA_BITS)
#define PAGE_OFFSET ((UL(0xffffffffffffff) << (VA_BITS - 1))
#define KIMAGE_VADDR (MODULES_END)
#define MODULES_END (MODULES_VADDR + MODULES_VSIZE)
#define MODULES_VADDR (VA_START + KASAN_SHADOW_SIZE)
#define MODULES_VSIZE (SZ_128M)
#define VMEMMAP_START (PAGE_OFFSET - VMEMMAP_SIZE)
#define PCI_IO_END (VMEMMAP_START - SZ_2M)
#define PCI_IO_START (PCI_IO_END - PCI_IO_SIZE)
#define FIXADDR_TOP (PCI_IO_START - SZ_2M)
#define TASK_SIZE_64 ((UL(1) << VA_BITS)#ifdef CONFIG_COMPAT
#define TASK_SIZE_32 UL(0x100000000)
#define TASK_SIZE (test_thread_flag(TIF_32BIT) ? \
TASK_SIZE_32 : TASK_SIZE_64)
#define TASK_SIZE_OF(tsk) (test_tsk_thread_flag(tsk, TIF_32BIT) ? \
TASK_SIZE_32 : TASK_SIZE_64)
#else
#define TASK_SIZE TASK_SIZE_64
#endif /* CONFIG_COMPAT */

不同架构下的 TASK_SIZE 定义如下:

32位用户空间程序:

  • TASK_SIZE 的值: TASK_SIZE_32
  • 具体值: 0x100000000
  • 等价于: 4GB

64位用户空间程序:

  • TASK_SIZE 的值: TASK_SIZE_64
  • 具体值: 2^VA_BITS 次方字节
  • VA_BITS: 编译内核时选择的虚拟地址位数
  • 如果 VA_BITS 为 48,则 TASK_SIZE_64 为 2^{48}字节,即 256TB

2.进程的用户虚拟地址空间包含如下区域:

代码段、数据段和未初始化数据段:

  • 代码段:存放程序的执行代码,通常是只读的。
  • 数据段:存放已初始化的全局变量和静态变量。
  • 未初始化数据段:存放未初始化的全局变量和静态变量。

动态库的代码段、数据段和未初始化数据段:

  • 代码段:存放动态链接库中的执行代码。
  • 数据段:存放动态链接库中已初始化的全局变量和静态变量。
  • 未初始化数据段:存放动态链接库中未初始化的全局变量和静态变量。

存放动态生成的数据的堆:

  • 堆用于动态内存分配,例如通过 malloc 或 new 操作符分配的内存位于此区域。堆从低地址向高地址增长。

存放局部变量和实现函数调用的栈:

  • 栈用于存储函数的局部变量和控制信息(如函数调用的返回地址)。栈从高地址向低地址增长。

存放在栈底部的环境变量和参数字符串:

  • 环境变量和参数字符串通常在进程启动时被加载到栈底部,用于传递命令行参数和其他环境信息。

把文件区间映射到虚拟地址空间的内存映射区域:

  • 内存映射区域允许文件或设备直接映射到进程的地址空间,从而可以直接像访问内存一样访问文件内容。这通常用于高效地处理大文件或共享内存。 

3.内核用户态内存结构补充:

任务空间管理-用户态内存结构-CSDN博客

4.进程描述符(task_struct)中的内存相关成员:

struct task_struct {struct mm_struct *mm;       // 指向进程的 mm_structstruct mm_struct *active_mm;// 指向当前活跃的 mm_struct...
};

内核线程的特殊情况

内核线程:

  • 内核线程是内核的一部分,主要用于执行内核内部的任务,如定时器处理、中断处理等。
  • 它们不需要自己的用户虚拟地址空间,因此 mm 通常是空指针。
  • 当内核线程需要访问用户空间数据时,它会借用其他进程的 mm_struct,此时 active_mm 指向被借用的 mm_struct。 

1. struct mm_struct *mm

  • 类型: struct mm_struct *
  • 用途: 指向一个 mm_struct 结构体,该结构体描述了进程的虚拟地址空间。

说明:

  • 对于用户进程,mm 指向当前进程的 mm_struct,包含了所有与虚拟地址空间相关的信息,如页表、内存区域等。
  • 对于内核线程(例如调度器线程),由于它们没有自己的用户虚拟地址空间,因此 mm 是空指针。

2. struct mm_struct *active_mm

  • 类型: struct mm_struct *
  • 用途: 指向当前进程正在使用的 mm_struct。

说明:

  • 对于用户进程,active_mm 总是指向同一个 mm_struct,即进程的虚拟地址空间描述符。
  • 对于内核线程,在没有运行时,active_mm 是空指针。
  • 当内核线程运行时,active_mm 指向从上一个进程借用的 mm_struct。这意味着内核线程可以暂时使用其他进程的虚拟地址空间来执行某些操作

       在 Linux 内核中,mm_users 和 mm_count 是与进程的内存描述符 (mm_struct) 相关的两个重要引用计数字段。它们的作用是跟踪和管理 mm_struct 的生命周期,以确保内存资源的正确分配和释放。

      当两个进程属于同一个线程组时,或者当进程不属于线程组时,这两个计数的关系会有所不同

(1)进程不属于线程组的情况

如果进程不属于线程组,则每个进程都有自己独立的 mm_struct,并且 mm_users 和 mm_count 的关系如下:

mm_users:

  • 对于单个进程,mm_users 的值通常为 1,因为只有一个进程在使用这个 mm_struct。

mm_count:

  • mm_count 至少等于 mm_users。
  • 如果有其他内核组件(如内核线程)临时借用该 mm_struct,则 mm_count 会大于 mm_users。

(2) 两个进程属于同一个线程组的情况

在 Linux 中,线程组是指一组共享相同虚拟地址空间的线程。这些线程由一个主线程创建,并且它们共享同一个 mm_struct。在这种情况下,mm_users 和 mm_count 的关系如下:

mm_users:

  • 每当一个新的线程加入线程组时,mm_users 会增加。
  • 例如,如果线程组中有 3 个线程,则 mm_users 的值为 3。

mm_count:

  • mm_count 至少等于 mm_users。
  • 如果有内核线程或其他组件临时借用该 mm_struct,则 mm_count 会大于 mm_users。

(3) 示例场景分析 

场景 1: 单个进程
假设有一个独立的用户进程 A。

  • mm_users: 1(只有进程 A 使用自己的 mm_struct)。
  • mm_count: 1(没有其他组件借用 mm_struct)。

场景 2: 线程组中的多个线程
假设有一个线程组,包含 3 个线程(T1、T2、T3),它们共享同一个 mm_struct。

  • mm_users: 3(每个线程都使用该 mm_struct)。
  • mm_count: 3(如果没有其他组件借用 mm_struct)。

场景 3: 内核线程借用 mm_struct
假设有一个内核线程 K,它临时借用了一个用户进程的 mm_struct。

  • mm_users: 1(只有用户进程使用该 mm_struct)。
  • mm_count: 2(内核线程 K 借用了该 mm_struct,导致引用计数增加)。

传统布局与新布局的比较

传统布局:

  • 内存映射区域自底向上增长。
  • 堆的最大长度受到限制,尤其是在32位系统中影响较大。
  • 优点:简单直观。
  • 缺点:在32位系统中,堆的最大长度受限。

新布局:

  • 内存映射区域自顶向下增长。
  • 堆的最大长度不受限制。
  • 优点:在64位系统中,可以充分利用大内存空间。
  • 缺点:实现复杂度较高。

各种处理器自定义的函数 :void arch_pick_mmap_layout(struct mm_struct *mm)负责选择内存区域布局。

/** This function, called very early during the creation of a new process VM* image, sets up which VM layout function to use:*/
void arch_pick_mmap_layout(struct mm_struct *mm)
{unsigned long random_factor = 0UL;if (current->flags & PF_RANDOMIZE)random_factor = arch_mmap_rnd();/** 如果给进程描述符的成员personality设置标志位ADDR_COMPAT_LAYOUT表示使用传统的* 虚拟地址空间布局,或者用户栈可以无限增长,或者通过文件/proc/sys/vm/legacy_va_layout指定*/if (mmap_is_legacy()) {mm->mmap_base = TASK_UNMAPPED_BASE + random_factor;mm->get_unmapped_area = arch_get_unmapped_area;} else {mm->mmap_base = mmap_base(random_factor);mm->get_unmapped_area = arch_get_unmapped_area_topdown;}
}

 4.3 内核地址空间布局 

      ARM64 架构的内核地址空间布局

补充:任务空间管理 - 内核态结构-CSDN博客 

相关文章:

Linux内存管理架构(2)

4.虚拟地址空间布局 4.1虚拟地址空间划分 对于64位处理器&#xff0c;目前不支持完全的64位虚拟地址 1.ARM64内核/用户虚拟地址划分 1. 虚拟地址的最大宽度 最大宽度&#xff1a;虚拟地址的最大宽度是48位。 内核虚拟地址&#xff1a; 在64位地址空间的顶部。高16位全是1。范围…...

图论基础理论

在我看来&#xff0c;想要掌握图的基础应用&#xff0c;仅需要三步走。 什么是图&#xff08;基本概念&#xff09;、图的构造&#xff08;打地基&#xff09;、图的遍历方式&#xff08;应用的基础&#xff09; 只要能OK的掌握这三步、就算图论入门了&#xff01;&#xff0…...

最大子序和问题——动态规划/贪心算法解决

目录 一&#xff1a;问题描述 二&#xff1a;解决思路1——动态规划思想 三&#xff1a;C 语言代码实现 四&#xff1a;复杂度分析 五&#xff1a;解决思路2——贪心算法思想 六&#xff1a;具体步骤 七: C语言代码实现 八&#xff1a;复杂度分析 一&#xff1a;问题描述 …...

车载以太网-SOMEIP

文章目录 基本概念SOME/IP的起源与核心定位核心定位设计目标协议栈架构与OSI模型映射报文结构与数据序列化SOME/IP的核心通信机制通信模式分类服务发现协议(SOME/IP-SD)服务发现流程服务质量(QoS)管理SOME/IP在智能汽车中的典型应用SOME/IP测试与验证体系SOME/IP测试环境构…...

DrissionPage详细教程

1. 基本概述 DrissionPage 是一个基于 python 的网页自动化工具。它既能控制浏览器&#xff0c;也能像requests一样收发数据包&#xff0c;更重要的是还能把两者合二为一。因此&#xff0c;简单来说DrissionPage可兼顾浏览器自动化的便利性和 requests 的高效率。 DrissionPa…...

6.1 GitHub亿级数据采集实战:双通道架构+三级容灾设计,破解API限制与反爬难题

GitHub 项目数据获取功能设计与实现 关键词:GitHub API 集成、网页爬虫开发、数据存储设计、定时任务调度、异常处理机制 1. 数据获取架构设计 采用双通道数据采集策略,同时使用 GitHub 官方 API 和网页爬虫技术确保数据完整性: #mermaid-svg-XUg7xhHrzFAozG4J {font-fami…...

LabVIEW 控制电机需注意的关键问题

在自动化控制系统中&#xff0c;LabVIEW 作为图形化编程平台&#xff0c;因其高度可视化、易于集成硬件等优势&#xff0c;被广泛应用于电机控制场景。然而&#xff0c;要实现稳定、精确、高效的电机控制&#xff0c;仅有软件并不足够&#xff0c;还需结合硬件选型、控制逻辑设…...

Linux系统远程操作和程序编译

目录 一、Linux远程终端登录、图形桌面访问、 X图形窗口访问和FTP文件传输操作 1.1 桥接模式 1.2 putty远程登录Ubuntu 1.3 win10远程登录并上传下载文件 1.4 X server仿真软件安装 1.5 树莓派在putty上的远程登录 1.6 使用ftp远程登录并实现文件上传下载 1.7 Linux下的…...

Mac配置开发环境

博主是一名Python后端开发&#xff0c;有时候环境太多 需要配置太多&#xff0c;故做此文章 环境Macbook &#xff0c;请注意自己的是ARM 还是x86 结构 Vscode/Cursor配置Python debug 配置Debug launch.json {"version": "0.2.0","configuratio…...

LabVIEW配电器自动测试系统

随着航天技术的迅猛发展&#xff0c;航天器供配电系统的结构越来越复杂&#xff0c;对配电器的功能完整性、稳定性和可靠性提出了更高要求。传统人工测试方式难以满足高效率、高精度、可重复的测试需求。本项目开发了一套基于LabVIEW平台的宇航配电器自动测试系统&#xff0c;融…...

生成与强化学习:赋予VLA系统物理行动能力

引言&#xff1a;从“理解世界”到“改变世界” 当机器能够“看懂”图像、“听懂”指令时&#xff0c;一个更根本的挑战浮现&#xff1a;如何让它们像人类一样&#xff0c;将认知转化为精准的物理动作&#xff1f;无论是机械臂抓取杯子&#xff0c;还是自动驾驶汽车紧急避障&a…...

基于Springboot+Mysql的闲一品(含LW+PPT+源码+系统演示视频+安装说明)

系统功能 管理员功能&#xff1a;首页、个人中心、用户管理、零食分类管理、零食信息管理、订单评价管理、系统管理、订单管理。用户功能&#xff1a;首页、个人中心、订单评价管理、我的收藏管理、订单管理。前台首页功能&#xff1a;首页、零食信息、零食资讯、个人中心、后…...

jupyter4.4安装使用

一、chrome谷歌浏览器 1. 安装 1.1 下载地址&#xff1a; 下载地址&#xff1a; https://www.google.cn/intl/zh-CN_ALL/chrome/fallback/ 2 插件markdown-viewer 2.1 下载地址&#xff1a; 下载地址&#xff1a;https://github.com/simov/markdown-viewer/releases 2.2…...

Linux虚拟内存详解

引言 虚拟内存是现代操作系统中的核心概念之一&#xff0c;它为进程提供了一个连续的、独立的地址空间&#xff0c;有效解决了物理内存限制问题&#xff0c;并大大简化了程序开发和执行。本文将深入探讨Linux系统中虚拟内存的工作原理、实现机制以及相关的内存管理技术&#x…...

数据库安装(基于Linux下centos7)(保姆级教程)

前言:笔者有段时间没写博客了&#xff0c;今天笔者要分享新的知识了&#xff0c;那就是数据库&#xff0c;笔者会通过博客系统的且通俗易懂的分享数据库知识&#xff0c;对于想要学习数据库和学习过数据库的老铁复习都是非常有用的&#xff0c;绝对干货满满&#xff0c;那么今天…...

【自动驾驶 机器人】速度规划 |梯形/S型速度曲线

参考文章&#xff1a; &#xff08;1&#xff09;【自动驾驶】运动规划丨速度规划丨T型/S型速度曲线 &#xff08;2&#xff09;一文教你快速搞懂速度曲线规划之S形曲线&#xff08;超详细图文推导附件代码&#xff09; 1 梯形速度曲线 如下图所示梯形速度/加速度/加加速度曲…...

Qt C++内存泄漏排查方法

在Qt C++中排查内存泄漏可以按照以下步骤进行,结合工具使用和代码审查: 1. 使用内存检测工具 Valgrind (Linux/macOS) 安装Valgrind:sudo apt-get install valgrind运行程序并检测内存泄漏:valgrind --leak-check=full ./your_qt_app分析输出结果,定位未释放的内存块。Dr…...

[redis进阶一]redis的持久化(2)AOF篇章

目录 一 为什么有了RDB持久化机制还要有AOF呢 板书介绍具体原因: ​编辑二 详细讲解AOF机制 (1)AOF的基本使用 1)板书如下 2)开启AOF机制: 3) AOF工作流程 (2)AOF是否会影响到redis性能 ​编辑 (3)AOF缓冲区刷新策略 (4)AOF的重写机制 板书如下: 为什么要有这个重写机…...

聊天室项目day4(redis实现验证码期限,实现redis连接池)

1.redis连接池操作和之前所学过的io_context连接池原理一样这里不多赘述&#xff0c;也是创建多个连接&#xff0c;使用时按顺序取出来。 2.知识补充redisConnect()函数建立与 Redis 服务器的非阻塞网络连接&#xff0c;成功返回 redisContext*&#xff08;连接上下文指针&…...

Redis之分布式锁

面试切入点 锁的分类 单机版同一个JVM虚拟机内&#xff0c;synchronized或者Lock接口分布式多个不同JVM虚拟机&#xff0c;单机的线程锁不再起作用&#xff0c;资源类在不同的服务器之间共享了 一个靠谱分布式锁需要具备的条件与刚需 独占性&#xff1a;onlyOne&#xff…...

AF3 ProteinDataset类的__getitem__方法解读

AlphaFold3 protein_dataset 模块 ProteinDataset 类 __getitem__ 方法用于从数据集中获取一个条目,并根据配置对数据进行处理。 源代码: def __getitem__(self, idx):"""Return an entry from the dataset.If a clusters file is provided, then the idx i…...

NLP 梳理02 — 标点符号和大小写

文章目录 一、说明二、为什么文本预处理中需要小写2.1 为什么小写在文本预处理中至关重要&#xff1f;2.2 区分大小写对 NLP 任务的影响 三、删除标点符号及其对 NLP 任务的影响3.1 什么是标点符号&#xff1f;3.2 为什么在文本预处理中删除标点符号&#xff1f;3.3 删除标点符…...

HarmonyOS中的多线程并发机制

目录 多线程并发1. 多线程并发概述2 多线程并发模型3 TaskPool简介4 Worker简介4.1 Woker注意事项4.2 Woker基本用法示例 5. TaskPool和Worker的对比5.1 实现特点对比5.2 适用场景对比 多线程并发 1. 多线程并发概述 并发模型是用来实现不同应用场景中并发任务的编程模型&…...

游戏引擎学习第221天:(实现多层次过场动画)

资产: intro_art.hha 已发布 在下载页面&#xff0c;你会看到一个新的艺术包。你将需要这个艺术包来进行接下来的开发工作。这个艺术包是由一位艺术家精心制作并打包成我们设计的格式&#xff0c;旨在将这些艺术资源直接应用到游戏中。它包含了许多我们会在接下来的直播中使用…...

Python | 在Pandas中按照中值对箱形图排序

箱形图是可视化数据分布的强大工具&#xff0c;因为它们提供了对数据集内的散布、四分位数和离群值的洞察。然而&#xff0c;当处理多个组或类别时&#xff0c;通过特定的测量&#xff08;如中位数&#xff09;对箱形图进行排序可以提高清晰度并有助于揭示模式。在本文中&#…...

openapi + knife4j的使用

一、依赖作用与关系 1. springdoc-openapi-starter-webmvc-api • 核心功能&#xff1a; 基于 OpenAPI 3 规范&#xff0c;自动生成 API 文档元数据&#xff08;JSON 格式&#xff09;&#xff0c;并集成 Spring MVC。 提供Tag Operation、Schema 等注解&#xff0c;支持通过…...

数据结构*包装类泛型

包装类 什么是包装类 在讲基本数据类型的时候&#xff0c;有提到过包装类。 基本数据类型包装类byteByteshortShortintIntegerlongLongfloatFloatdoubleDoublecharCharacterbooleanBoolean 我们知道&#xff1a;基本数据类型并不是对象&#xff0c;没有对象所具有的方法和属…...

Azure Synapse Dedicated SQL pool里大型表对大型表分批合并数据的策略

Azure Synapse Dedicated SQL pool中大型表的数据通过MERGE INTO语句合并到另一张大型表的时间很长&#xff0c;容易造成运行超时&#xff0c;而有的时候超时的时间是管理设置&#xff0c;由客户控制&#xff0c;无法修改。这种时候为了确保操作可以运行成功&#xff0c;需要将…...

Day81 | 灵神 | 快慢指针 链表的中间结点 环形链表

Day81 | 灵神 | 快慢指针 链表的中间结点 环形链表 876.链表的中间结点 876. 链表的中间结点 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 设置两个指针&#xff0c;一个快指针r一个慢指针l 初始都是头结点 我们要求的是中间节点 所以快指针走两步&#x…...

【DDR 内存学习专栏 1.2 -- DDR Channel 介绍】

文章目录 1. DDR中的通道&#xff08;Channel&#xff09;概念1.1 DDR Channel 与 DDRC1.2 DIMM 内存插槽1.3 物理通道的定义1.3.1 多通道的作用 1.4 通道的硬件实现1.5 多核系统的DDR通道分配策略 1. DDR中的通道&#xff08;Channel&#xff09;概念 关于 DDR 通道&#xff…...

深入解析xDeepFM:结合压缩交互网络与深度神经网络的推荐系统新突破

今天是周日&#xff0c;我来解读一篇有趣的文章——xDeepFM。这篇文章由 Mao et al. 发表在SIGIR 2019会议。文章提出了一个新的网络模型——压缩交互网络&#xff08;CIN&#xff09;&#xff0c;用于显式地学习高阶特征交互。通过结合 CIN 和传统的深度神经网络&#xff08;D…...

Mybatis 中 <mappers> 标签四种配置方式

在MyBatis中,我们可以通过四种不同的方式来配置Mappers标签 : 1. 使用 <package name=""> 批量扫描包 这种方式通过指定一个包名,MyBatis 会自动扫描该包下的所有接口并注册为映射器。 <mappers><package name="com.example.mapper"/&…...

科技赋能记忆共生-郑州

故事背景 故事发生在中国河南郑州的现代城市环境中&#xff0c;这里描绘了人与科技的交融与共生。多样的场景展示了人与自然、历史与未来的互动&#xff0c;通过各种科技手段与古老文化相结合&#xff0c;展现出未来城市的独特魅力。 故事内容 在中国河南郑州&#xff0c;一座科…...

根据开始日期和结束日志统计共有多少天和每天的营业额

controller 重点&#xff1a;根据时间格式接受时间类型参数 DateTimeFormat(pattern "yyyy-MM-dd") LocalDateTime begin, DateTimeFormat(pattern "yyyy-MM-dd") LocalDateTime end) RestController RequestMapping("/admin/report") Slf4…...

LLMs之Agent之A2A:A2A的简介、安装和使用方法、案例应用之详细攻略

LLMs之Agent之A2A&#xff1a;A2A的简介、安装和使用方法、案例应用之详细攻略 目录 相关文章 LLMs之Agent之A2A&#xff1a;《Announcing the Agent2Agent Protocol (A2A)》翻译与解读 LLMs之Agent之A2A&#xff1a;A2A的简介、安装和使用方法、案例应用之详细攻略 A2A协议…...

深入学习OpenCV:第一章简介

本专栏为零基础开发者打造&#xff0c;聚焦OpenCV在Python中的高效应用&#xff0c;用100%代码实践带你玩转图像处理&#xff01; 从 环境配置到实战项目&#xff0c;内容涵盖&#xff1a; 1️⃣ 基础篇&#xff1a;图像读写、阈值处理、色彩空间转换 2️⃣ 进阶篇&#xff…...

汉诺塔问题——用贪心算法解决

目录 一&#xff1a;起源 二&#xff1a;问题描述 三&#xff1a;规律 三&#xff1a;解决方案 递归算法 四&#xff1a;代码实现 复杂度分析 一&#xff1a;起源 汉诺塔&#xff08;Tower of Hanoi&#xff09;问题起源于一个印度的古老传说。在世界中心贝拿勒斯&#…...

【双指针】专题:LeetCode 283题解——移动零

移动零 一、题目链接二、题目三、题目解析四、算法原理两个指针的作用以及三个区间总结 五、与快速排序的联系六、编写代码七、时间复杂度、空间复杂度 一、题目链接 移动零 二、题目 三、题目解析 “保持非零元素的相对顺序”&#xff0c;比如&#xff0c;示例1中非零元素1…...

2025-4-12-C++ 学习 XOR 三元组 异或 急转弯问题

C的学习必须更加精进一些&#xff0c;对于好多的函数和库的了解必须深入一些。 文章目录 3513. 不同 XOR 三元组的数目 I题解代码 3514. 不同 XOR 三元组的数目 II题解代码 晚上&#xff0c;10点半&#xff0c;参加了LC的竞赛&#xff0c;ok了一道&#xff0c;哈哈~   第二道…...

[MySQL] 索引

索引 1.为什么有索引&#xff1f;2.MySQL的存储&#xff08;MySQL与磁盘交互的基本单位&#xff09;3.小总结4.索引的进一步理解4.1测试案例4.2 理解单个page4.3 理解多个page页目录单页情况多页情况 4.4 B树 VS B树4.5 聚簇索引 VS 非聚簇索引1.非聚簇索引2.聚簇索引 5.索引操…...

软考高级--案例分析

架构风格 重点 交互方式数据结构控制结构扩展方法 分类 管道-过滤器风格 数据流 数据仓储风格 星型结构以数据为中心&#xff0c;其他构件围绕数据进行交互 企业服务总线esb 定义 以一个服务总线充当中间件的角色&#xff0c;把各方服务对接起来&#xff0c;所有服务…...

Go - 内存逃逸

概念 每个函数都有自己的内存区域来存放自己的局部变量、返回地址等&#xff0c;这个内存区域在栈中进行分配。当函数结束时&#xff0c;这段内存区域会进行释放。 但有些变量&#xff0c;我们想在函数结束后仍然使用它&#xff0c;那么就要把这个变量在堆上分配&#xff0c;这…...

【数字电路】第四章 组合逻辑电路

一、组合逻辑电路的概述 1.逻辑电路的分类 2.逻辑功能的描述 二、组合逻辑电路的分析方法 根据输出可以粗略判断输入的数值的大小。 三、组合逻辑电路的基本设计方法 1.进行逻辑抽象 2.写出逻辑函数式 3.逻辑函数的化简或变换 4.画出逻辑电路图 5.设计验证与工艺设计 转换为…...

提权实战!

就是提升权限&#xff0c;当我们拿到一个shell权限较低&#xff0c;当满足MySQL提权的要求时&#xff0c;就可以进行这个提权。 MySQL数据库提权&#xff08;Privilege Escalation&#xff09;是指攻击者通过技术手段&#xff0c;从低权限的数据库用户提升到更高权限&#xff…...

单双线程的理解 和 lua基础语法

1.什么是单进程 &#xff0c;什么是多进程 当一个程序开始运行时&#xff0c;它就是一个进程&#xff0c;进程包括运行中的程序和程序所使用到的内存和系统资源。而一个进程又是由单个或多个线程所组成的。 1.1 像apache nginx 这类 服务器中间件就是多进程的软件 &#xff0…...

深度学习(对抗)

数据预处理&#xff1a;像素标记与归一化 在 GAN 里&#xff0c;图像的确会被分解成一个个像素点来处理。在你的代码里&#xff0c;transform transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,))]) 这部分对图像进行了预处理&#xff1a; tra…...

【NLP】 18. Tokenlisation 分词 BPE, WordPiece, Unigram/SentencePiece

1. 翻译系统性能评价方法 在机器翻译系统性能评估中&#xff0c;通常既有人工评价也有自动评价方法&#xff1a; 1.1 人工评价 人工评价主要关注以下几点&#xff1a; 流利度&#xff08;Fluency&#xff09;&#xff1a; 判断翻译结果是否符合目标语言的语法和习惯。充分性…...

详解MYSQL表空间

目录 表空间文件 表空间文件结构 行格式 Compact 行格式 变长字段列表 NULL值列表 记录头信息 列数据 溢出页 数据页 当我们使用MYSQL存储数据时&#xff0c;数据是如何被组织起来的&#xff1f;索引又是如何组织的&#xff1f;在本文我们将会解答这些问题。 表空间文…...

lwip移植基于freertos(w5500以太网芯片)

目录 一、背景二、lwip移植基于w5500&#xff08;MACPHY&#xff0c;数据链路层和物理层&#xff09;1.移植需要的相关文件2、协议栈层级调用3、w5500关键初始化说明 三、附录 一、背景 1.OSI七层模型 图片来自网络 lwip协议栈工作在应用层、传输层、网络层&#xff1b; 网卡…...

【TI MSPM0】IQMath库学习

一、与DSP库的区别 二、IQMath库详解 RTS是靠纯软件实现的&#xff0c;而MathACL是靠硬件加速&#xff0c;速度更快 三、工程详解 1.导入工程 2.样例详解 使用一系列的运算来展示IQMath库&#xff0c;使用的是MathACL实现版本的IQMath库 编译加载运行&#xff0c;结果变量叫…...