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

Linux虚拟内存详解

引言

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

目录

1. [虚拟内存基础概念](#虚拟内存基础概念)

2. [Linux内存架构](#Linux内存架构)

3. [地址转换机制](#地址转换机制)

4. [分页系统详解](#分页系统详解)

5. [页表管理](#页表管理)

6. [交换空间与页面置换](#交换空间与页面置换)

7. [内存分配与回收](#内存分配与回收)

8. [虚拟内存性能调优](#虚拟内存性能调优)

9. [常见问题分析与解决](#常见问题分析与解决)

10. [总结](#总结与展望)

1.虚拟内存基础概念

什么是虚拟内存

虚拟内存是一种内存管理技术,它为每个进程提供一个假象:每个进程都拥有一个连续的、私有的地址空间,而这个地址空间的大小通常远大于物理内存的实际容量。

在现代Linux系统中,32位架构通常提供4GB(2^32)的虚拟地址空间,而64位架构理论上可提供高达2^64的地址空间(实际实现通常限制在较小范围内,如48位或57位寻址)。

 虚拟内存的目的与优势

1. **克服物理内存限制**:允许运行需要超过实际物理内存的程序

2. **内存保护**:进程之间的地址空间彼此隔离,提高系统安全性

3. **内存映射**:可以将文件映射到内存,简化I/O操作

4. **共享内存**:允许多进程共享物理内存页,减少内存占用

5. **简化程序开发**:开发者无需关心物理内存管理细节

6. **提高内存利用率**:只需将程序活跃部分加载到物理内存中

虚拟内存的基本机制

虚拟内存系统的核心机制包括:

1. **地址转换**:将程序使用的虚拟地址转换为物理内存地址

2. **分页技术**:将内存分割成固定大小的页面(通常为4KB)

3. **缺页处理**:当访问未加载到物理内存的页面时触发缺页中断

4. **页面置换**:当物理内存不足时,选择页面换出到磁盘

2. Linux内存架构

Linux的内存架构设计精巧,兼顾了效率与灵活性。

虚拟地址空间布局

在Linux中,进程的虚拟地址空间通常按照以下方式划分:

1. **用户空间**:

   - 代码段(Text):存放可执行指令

   - 数据段(Data):存放已初始化的全局变量和静态变量

   - BSS段:存放未初始化的全局变量和静态变量

   - 堆(Heap):动态分配的内存,从低地址向高地址增长

   - 内存映射区:用于文件映射和共享库

   - 栈(Stack):局部变量和函数调用信息,从高地址向低地址增长

2. **内核空间**:

   - 内核代码和数据

   - 页表、内核栈

   - 各种内核缓存

   - 设备驱动程序

32位vs 64位架构区别

32位Linux系统通常将4GB虚拟地址空间分为:

- 0-3GB:用户空间(TASK_SIZE)

- 3-4GB:内核空间

64位Linux系统的划分更为复杂且灵活:

- 用户空间可达128TB(47位)

- 内核空间也有更大的寻址能力

 内存区域属性

每个内存区域可以设置不同的权限和属性:

- 读(R):允许读取该区域的内容

- 写(W):允许修改该区域的内容

- 执行(X):允许执行该区域的代码

- 共享(S):该区域可以在进程间共享

- 私有(P):该区域为进程私有

3.地址转换机制

虚拟地址到物理地址的转换

地址转换是虚拟内存系统的核心,在Linux中主要借助硬件的分页机制实现:

1. 程序生成虚拟地址(VA)

2. MMU(内存管理单元)将虚拟地址分解为页号和页内偏移

3. 通过页表查找对应的物理页帧号

4. 将物理页帧号与页内偏移组合,得到物理地址(PA)

5. 访问物理内存的对应位置

 多级页表结构

为了管理大型地址空间,Linux采用多级页表结构:

- **32位系统**:通常使用2级或3级页表

  - 页全局目录(PGD)

  - 页中间目录(PMD)(可选)

  - 页表(PT)

- **64位系统**:通常使用4级或5级页表

  - 页全局目录(PGD)

  - 页上层目录(PUD)

  - 页中间目录(PMD)

  - 页表(PT)

  - p4d级(在新内核中,5级页表)

这种多级结构的主要优势是节省内存,因为不需要为整个地址空间创建完整的页表。

TLB的作用

TLB(Translation Lookaside Buffer)是一个硬件缓存,用于加速虚拟地址到物理地址的转换:

1. 首先检查TLB是否有虚拟地址对应的转换

2. 如果有(TLB命中),直接获取物理地址

3. 如果没有(TLB未命中),通过页表进行转换,并更新TLB

TLB是虚拟内存性能的关键因素,TLB未命中会导致显著的性能下降。

4.分页系统详解

页与页帧

- **页(Page)**:虚拟内存中的固定大小块,通常为4KB

- **页帧(Page Frame)**:物理内存中的固定大小块,与页大小相同

页大小与巨页(Huge Pages)

Linux支持多种页大小:

- 标准页:4KB

- 巨页:2MB, 1GB等

巨页的优势:

1. 减少TLB条目数量,提高TLB命中率

2. 减少页表项,节省内存

3. 适合大内存应用程序,如数据库系统

巨页的配置与使用:

# 查看当前巨页配置cat /proc/meminfo | grep Huge# 设置巨页数量echo 20 > /proc/sys/vm/nr_hugepages# 使用libhugetlbfs在应用程序中使用巨页

页表项(PTE)结构

页表项不仅存储物理页帧号,还包含各种控制位:

- **Present位(P)**:表示页是否在物理内存中

- **Read/Write位(R/W)**:表示页是否可写

- **User/Supervisor位(U/S)**:确定访问权限级别

- **Accessed位(A)**:表示页是否被访问

- **Dirty位(D)**:表示页是否被修改

- **Global位(G)**:表示TLB项在进程切换时是否保留

- **页帧号**:对应的物理页帧位置

5. 页表管理

 页表的创建与维护

Linux内核在以下场景管理页表:

1. **进程创建**:`fork()`时复制父进程的页表

2. **内存分配**:`mmap()`、`brk()`等系统调用导致地址空间变化

3. **缺页处理**:按需创建页表项

4. **进程终止**:释放页表结构

内核页表与用户页表

Linux内核维护两套页表体系:

1. **内核页表**:

   - 内核空间的映射,所有进程共享

   - 持久存在,不随进程切换而改变

   - 通常直接映射(线性映射)物理内存

2. **用户页表**:

   - 每个进程独有

   - 进程切换时切换CR3寄存器(存储页表基地址)

   - 复杂的按需映射

写时复制(Copy-on-Write)

为优化`fork()`操作,Linux采用写时复制技术:

1. `fork()`时,子进程与父进程共享物理页面,页表项设为只读

2. 当任一进程尝试写入共享页面时,触发缺页中断

3. 内核为写入进程创建页面副本

4. 更新页表项指向新页面,并设置为可写

5. 恢复进程执行

这大大提高了`fork()`效率,特别是对`fork()`后立即执行`exec()`的场景(如shell命令执行)。

6. 交换空间与页面置换

交换空间(Swap)

交换空间是磁盘上的一块区域,用于存储不活跃的内存页面:

- 可以是专用交换分区或交换文件

- 扩展了可用内存,允许系统运行更多进程

- 较慢的访问速度(磁盘IO vs 内存访问)

设置与管理交换空间:

# 查看当前交换空间使用情况swapon -s# 创建新的交换文件dd if=/dev/zero of=/swapfile bs=1M count=1024mkswap /swapfileswapon /swapfile# 调整交换空间使用倾向echo 60 > /proc/sys/vm/swappiness

页面置换算法

当物理内存不足时,Linux需要决定哪些页面应该被换出到交换空间。Linux使用的主要页面置换算法:

1. **PFRA(Page Frame Reclaiming Algorithm)**:

   - 基于活跃度的页面置换策略

   - 使用"最近最少使用"(LRU)变种

   - 维护活跃和不活跃页面链表

2. **页面老化(Page Aging)**:

   - 通过定期检查Accessed位实现

   - 将较长时间未访问的页面标记为不活跃

   - 优先换出不活跃页面

3. **swappiness参数**:

   - 控制系统倾向于交换出页面的程度

   - 取值范围0-100,越高越积极交换

   - 默认值通常为60

缺页处理流程

当程序访问不在物理内存中的页面时触发缺页中断:

1. CPU触发缺页异常,跳转到缺页处理程序

2. 检查虚拟地址的有效性

3. 查找页表项状态,确定缺页类型:

   - 页不存在(无效访问)

   - 页在交换空间中(需要换入)

   - 页为零页(需要分配零填充页)

   - 页为文件映射(需要从文件读取)

4. 分配物理页帧

5. 必要时从交换空间或文件加载数据

6. 更新页表项,建立映射

7. 恢复程序执行

7.内存分配与回收

 物理内存分配器

Linux使用伙伴系统(Buddy System)管理物理页帧:

1. **工作原理**:

   - 将物理内存分为2^n页大小的块

   - 尝试分配最合适大小的块

   - 必要时分割大块成小块

   - 相邻的空闲块可以合并为大块

2. **优势**:

   - 快速分配和释放

   - 减少外部碎片

   - 支持大小不同的内存请求

SLAB/SLUB/SLOB分配器

为内核对象提供高效内存管理:

1. **SLAB**:

   - 基于对象缓存

   - 预分配特定类型对象的内存池

   - 避免频繁请求和释放页帧

   - 减少内部碎片

2. **SLUB**:

   - SLAB的改进版

   - 减少元数据开销

   - 更好的可扩展性

3. **SLOB**:

   - 为嵌入式系统优化

   - 内存占用更小

用户空间内存分配

用户程序通过以下方式获取内存:

1. **堆分配**:

   - malloc()/free()

   - 通过brk()/sbrk()系统调用扩展堆

   - glibc维护本地内存池减少系统调用

2. **内存映射**:

   - mmap()/munmap()

   - 适合大块内存分配

   - 支持文件映射和匿名映

3. **栈分配**:

   - 局部变量自动在栈上分配

   - 由编译器管理,无系统调用

内存回收机制

Linux使用多种机制回收内存:

1. **kswapd内核线程**:

   - 后台定期扫描内存使用情况

   - 当可用内存低于阈值时激活

   - 按优先级回收不同类型的页面

2. **直接回收**:

   - 当内存分配失败时直接触发

   - 进程会被阻塞直到回收足够内存

   - 对性能影响较大

3. **回收策略**:

   - 优先回收页缓存和可回收的内核内存

   - 然后是不活跃的匿名页

   - 最后是活跃的匿名页

8. 虚拟内存性能调优

关键性能指标

监控和优化虚拟内存性能的关键指标:

1. **页面调入/调出率**:

   - 过高的页面调入/调出表示内存不足

   - 通过`vmstat`、`sar`等工具监控

2. **内存使用率**:

   - 总体内存使用情况

   - 通过`free`、`top`等命令监控

3. **交换空间使用率**:

   - 大量使用交换空间通常表示问题

   - 通过`swapon -s`、`free`等工具监控

系统参数调优

可以调整的主要内核参数:

1. **vm.swappiness**:

   - 控制系统换出页面的倾向

   - 降低可减少交换活动

2. **vm.min_free_kbytes**:

   - 设置保留的最小空闲内存

   - 防止紧急情况下内存分配失败

3. **vm.vfs_cache_pressure**:

   - 控制回收inode和dentry缓存的倾向

   - 调高可减少文件系统缓存占用

4. **vm.dirty_ratio**和**vm.dirty_background_ratio**:

   - 控制脏页写回的阈值

   - 影响I/O性能和内存使用

应用程序优化

为虚拟内存系统优化应用程序:

1. **内存使用模式**:

   - 尽量保持良好的内存访问局部性

   - 避免随机访问大内存区域

2. **合理分配**:

   - 只分配实际需要的内存

   - 及时释放不再使用的内存

3. **特殊API使用**:

   - mlock():锁定内存页防止被换出

   - posix_memalign():分配对齐内存

   - madvise():提供内存使用提示

4. **巨页使用**:

   - 对大内存应用考虑使用巨页

   - 透明巨页或显式巨页分配

9.常见问题分析与解决

内存泄漏

问题:应用程序分配但未释放内存,导致可用内存逐渐减少

解决方案:

1. 使用valgrind等工具检测内存泄漏

2. 检查代码确保每次分配都有对应的释放

3. 使用智能指针等RAII技术自动管理内存

内存碎片化

问题:长时间运行后,可用内存被分割成小块,难以满足大内存请求

解决方案:

1. 使用内存压缩(memory compaction)

2. 定期重启服务或系统

3. 调整内存分配器参数

4. 使用巨页减少碎片化影响

OOM(Out Of Memory)问题

问题:系统内存耗尽,OOM killer终止进程

解决方案:

1. 增加物理内存或交换空间

2. 调整OOM分数防止重要进程被杀

3. 限制进程内存使用(cgroups)

4. 解决内存泄漏问题

5. 调整内核内存过量使用参数(vm.overcommit_*)

10.总结

 关键概念回顾

虚拟内存是现代操作系统的核心组件,它:

1. 提供了进程独立的地址空间

2. 实现了内存保护和隔离

3. 允许运行超过物理内存大小的程序

4. 优化了物理内存的使用效率

Linux的虚拟内存系统通过分页、多级页表、TLB等机制高效实现了这些功能,同时提供了丰富的工具和接口供管理员和开发者使用。

未来发展趋势

虚拟内存技术的发展方向:

1. 更大的地址空间支持(超过64位)

2. 更高效的内存管理算法

3. 为新型存储技术(如NVRAM)优化

4. 为容器和虚拟化环境优化内存共享

5. 更智能的内存预测和预加载

深入学习资源

要深入学习Linux虚拟内存:

1. 《Understanding the Linux Virtual Memory Manager》by Mel Gorman

2. Linux内核源代码,特别是mm子系统

3. Linux内核文档:https://www.kernel.org/doc/html/latest/

4. LWN.net上的内存管理相关文章

5. 《Linux Kernel Development》by Robert Love



实用命令与工具

- **free**:显示内存使用情况

- **vmstat**:报告虚拟内存统计信息

- **pmap**:显示进程的内存映射

- **top/htop**:实时监控进程和内存状态

- **/proc/meminfo**:详细内存信息

- **slabtop**:显示内核slab缓存信息

- **perf**:性能分析工具

- **valgrind**:内存错误检测工具

- **smem**:详细的内存报告工具

相关文章:

Linux虚拟内存详解

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

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

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

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

参考文章: (1)【自动驾驶】运动规划丨速度规划丨T型/S型速度曲线 (2)一文教你快速搞懂速度曲线规划之S形曲线(超详细图文推导附件代码) 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连接池原理一样这里不多赘述,也是创建多个连接,使用时按顺序取出来。 2.知识补充redisConnect()函数建立与 Redis 服务器的非阻塞网络连接,成功返回 redisContext*(连接上下文指针&…...

Redis之分布式锁

面试切入点 锁的分类 单机版同一个JVM虚拟机内,synchronized或者Lock接口分布式多个不同JVM虚拟机,单机的线程锁不再起作用,资源类在不同的服务器之间共享了 一个靠谱分布式锁需要具备的条件与刚需 独占性: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 为什么小写在文本预处理中至关重要?2.2 区分大小写对 NLP 任务的影响 三、删除标点符号及其对 NLP 任务的影响3.1 什么是标点符号?3.2 为什么在文本预处理中删除标点符号?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 已发布 在下载页面,你会看到一个新的艺术包。你将需要这个艺术包来进行接下来的开发工作。这个艺术包是由一位艺术家精心制作并打包成我们设计的格式,旨在将这些艺术资源直接应用到游戏中。它包含了许多我们会在接下来的直播中使用…...

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

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

openapi + knife4j的使用

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

数据结构*包装类泛型

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

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

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

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

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

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

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

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

今天是周日,我来解读一篇有趣的文章——xDeepFM。这篇文章由 Mao et al. 发表在SIGIR 2019会议。文章提出了一个新的网络模型——压缩交互网络(CIN),用于显式地学习高阶特征交互。通过结合 CIN 和传统的深度神经网络(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;结果变量叫…...

51单片机 光敏电阻5506与ADC0832驱动程序

电路图 5506光敏电阻光强增加电阻值减小 以上电路实测无光时电压1.5v 有光且较亮时电压2.7v。 转换程序和ADC0832程序如下 // ADC0832引脚定义 sbit ADC_CS P1^2; // 片选信号 sbit ADC_CLK P1^0; // 时钟信号 sbit ADC_DIO P1^1; // 数据线// 获取电压值 - 返回c…...

【Linux】进程创建、进程终止、进程等待

Linux 1.进程创建1.fork 函数2.写时拷贝3.为什么要有写时拷贝&#xff1f; 2.进程终止1.进程退出场景2.退出码3.进程常见退出方法1.main函数return2.exit库函数3._exit系统调用 3.进程等待1.概念2.必要性3.方法1.wait2.waitpid3.参数status4.参数option5.非阻塞轮询 1.进程创建…...

ReliefF 的原理

&#x1f31f; ReliefF 是什么&#xff1f; ReliefF 是一种“基于邻居差异”的特征选择方法&#xff0c;用来评估每个特征对分类任务的贡献大小。 它的核心问题是&#xff1a; “我怎么知道某个特征是不是重要&#xff1f;是不是有能力把不同类别的数据区分开&#xff1f;” 而…...

C++ 数据结构之图:从理论到实践

一、图的基本概念 1.1 图的定义与组成 图&#xff08;Graph&#xff09;由顶点&#xff08;Vertex&#xff09;和边&#xff08;Edge&#xff09;组成&#xff0c;形式化定义为&#xff1a; G (V, E) 顶点集合 V&#xff1a;表示实体&#xff08;如城市、用户&#xff09; …...

机器学习(5)——支持向量机

1. 支持向量机&#xff08;SVM&#xff09;是什么&#xff1f; 支持向量机&#xff08;SVM&#xff0c;Support Vector Machine&#xff09;是一种监督学习算法&#xff0c;广泛应用于分类和回归问题&#xff0c;尤其适用于高维数据的分类。其核心思想是寻找最优分类超平面&am…...

C++学习之使用OPENSSL加解密

目录 1.知识点概述 2.哈希的特点和常用哈希算法散列值长度 3.Linux下openss相关的安装问题 4.md5 api 5.其他哈希算法使用 6.sha1测试 7.哈希值的封装 8.非对称加密特点和应用场景 9.生成密钥对-rsa 10.在内存中生成rsa密钥对-代码 11.将密钥对写入磁盘 12.使用bio方…...

markdown导出PDF,PDF生成目录

1、vscode中安装markdown插件&#xff0c;将编辑的文件导出PDF。 2、安装PDF Guru Anki软件 百度网盘&#xff1a;通过网盘分享的文件&#xff1a;PDFGuruAnki 链接: https://pan.baidu.com/s/1nU6avM7NUowhEn1FNZQKkA 提取码: aues PDF中不同的标题需要通过矩形框标注差异&a…...

Node.js中Stream模块详解

Node.js 中 Stream 模块全部 API 详解 一、Stream 基础概念 const { Stream } require(stream);// 1. Stream 类型 // - Readable: 可读流 // - Writable: 可写流 // - Duplex: 双工流 // - Transform: 转换流// 2. Stream 事件 // - data: 数据可读时触发 // - end: 数据读…...

Swift的学习笔记(一)

Swift的学习笔记&#xff08;一&#xff09; 文章目录 Swift的学习笔记&#xff08;一&#xff09;元组基本语法1. **创建元组**2. **访问元组的值**3. **命名的元组**4. **解构元组**5. **忽略某些值** 可选值类型定义 OptionalOptional 的基本使用1. **给 Optional 赋值和取值…...

3.4 函数单调性与曲线的凹凸性

1.函数单调性的定义 1.1.判别法 2.函数凹凸性 2.1 判别法...

随机森林优化 —— 理论、案例与交互式 GUI 实现

目录 随机森林优化 —— 理论、案例与交互式 GUI 实现一、引言二、随机森林基本原理与超参数介绍2.1 随机森林概述2.2 随机森林中的关键超参数 三、随机森林优化的必要性与挑战3.1 优化的重要性3.2 调优方法的挑战 四、常见的随机森林优化策略4.1 网格搜索&#xff08;Grid Sea…...

Pytorch深度学习框架60天进阶学习计划 - 第41天:生成对抗网络进阶(一)

Pytorch深度学习框架60天进阶学习计划 - 第41天&#xff1a;生成对抗网络进阶&#xff08;一&#xff09; 今天我们将深入探讨生成对抗网络(GAN)的进阶内容&#xff0c;特别是Wasserstein GAN&#xff08;WGAN&#xff09;的梯度惩罚机制&#xff0c;以及条件生成与无监督生成…...

62. 不同路径

前言 本篇文章来自leedcode&#xff0c;是博主的学习算法的笔记心得。 如果觉得对你有帮助&#xff0c;可以点点关注&#xff0c;点点赞&#xff0c;谢谢你&#xff01; 题目链接 62. 不同路径 - 力扣&#xff08;LeetCode&#xff09; 题目描述 思路 1.如果m1或者n1就只…...