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

Linux内核物理内存组织结构

一、系统调用sys_mmap

        系统调用mmap用来创建内存映射,把创建内存映射主要的工作委托给do_mmap函数,内核源码文件处理:mm/mmap.c

 二、系统调用sys_munmap

1、vma = find_vma (mm, start); // 根据起始地址找到要删除的第一个虚拟内存区域 vma
2、如果只删除虚拟内存区域 vam 的部分,那么分裂虚拟内存区域 vma
3、根据结束地址找到要删除的最后一个虚拟内存区域 vma
4、如果只删除虚拟内存区域 last 的一部分,那么分裂虚拟内存区域 vma
5、针对所有删除目标,若虚拟内存区域被锁定在内存中(不允许换出到交换区),调用函数解除锁定。
6、调用函数,将所有删除目标从进程虚拟内存区域链表和树中删除,单独组成临时链表。
7、调用函数,针对所有删除目标,在进程页表中删除映射,且从处理器页表缓存中删除映射。
8、调用函数执行处理器架构特定处

三、物理内存组织结构

1.体系结构

目前多处理器系统有两种体系结构:
        1)非一致内存访问(Non-Unit Memory Access,NUMA):指内存被划分成多个内存节点的多处理器系统,访问一个内存节点花费的时间取决于处理器和内存节点的距离。
        2)对称多处理器(Symmetric Multi-Processor,SMP):即一致内存访问(Uniform Memory Access,UMA),所有处理器访问内存花费的时间相同。

示例图如下:

2.内存模型

         内存模型是从处理器角度看到的物理内存分布,内核管理不同内存模型的方式存在差异。内存管理子系统支持 3 种内存模型:
        1)平坦内存(Flat Memory)
        2)不连续内存(Discontiguous Memory)
        3)稀疏内存(Space Memory)

平坦内存(Flat Memory)

  • 结构特点:将系统的物理内存视为一个连续的整体,所有内存地址线性排列,不存在内存分段或区间划分。虚拟地址空间和物理地址空间映射直接,就像一条连续的、没有断点的道路 。
  • 管理方式:简单直接,通常使用一个数组(如 struct page mem_map 数组 )来管理所有内存页,通过简单的地址偏移就能找到对应的物理内存页。
  • 优势
    • 简单高效:内存管理实现不复杂,地址转换简单,系统可直接访问内存,减少地址转换开销 。
    • 易于实现:适用于内存较小、硬件资源有限的架构,在早期计算机系统或一些小型嵌入式系统中应用较多。
  • 劣势:如果物理地址空间存在空洞(如某些地址范围不能被使用),会造成内存浪费,因为要为所有地址创建对应的管理结构 。
  • 举例:早期个人计算机内存容量较小且硬件相对简单,内存模型近似平坦内存模型,操作系统可简单地将内存按顺序划分和管理 ;一些简单的嵌入式设备,如简单的单片机系统,也常采用这种内存模型,因为其内存需求单一、硬件资源有限 。

不连续内存模型(Non-contiguous Memory Model)

        不连续内存模型是一种内存管理方式,内存分配的各个区域不要求在物理内存中连续,进程虚拟内存空间可映射到物理内存中分散、不连续的任意位置。
特点

 
  1. 物理内存不连续:内存无需物理连续,操作系统可将进程虚拟内存映射到物理内存的多个不连续区域。
  2. 内存管理灵活:支持更灵活的内存分配,高效使用内存,减少碎片。
  3. 页面管理:常见实现为分页内存管理,虚拟地址空间和物理内存划分为页面与页框,虚拟页通过页表映射到任意物理页。
    例子
 
  • 分页(Paging):内存划分为固定大小页面(如 4KB),虚拟地址与物理地址通过页表映射,虚拟页可映射到任意物理页,虚拟内存与物理内存不连续。

稀疏内存模型(Sparse Memory Model)

        稀疏内存模型指虚拟内存中部分区域不映射物理内存,甚至完全为空,虚拟内存空间非每块都对应物理地址,呈 “稀疏” 状态。
特点

 
  1. 内存区域稀疏:虚拟内存部分区域无实际物理内存映射,部分虚拟地址不对应物理地址。
  2. 懒加载:操作系统按需分配物理内存,如进程访问无对应物理内存的虚拟地址时,触发缺页异常后再分配内存。
  3. 高效内存使用:允许区域不映射物理内存,在大内存系统中减少不必要分配,提升内存使用效率。
    例子
 
  • 稀疏虚拟内存:操作系统不为大虚拟地址空间(如 64 位系统)全部分配物理内存,Linux 中mmapmprotect系统调用可创建无实际物理内存映射的稀疏区域。

3.三级结构

        内存管理子系统使用节点(node)、区域(zone)、页(page)三级结构描述物理内存。
a、内存节点 —— 分为两种情况:
(1)NUMA 体系的内存节点,根据处理器和内存的距离划分;
(2)在具有不连续内存的 NUMA 系统中,表示比区域级别更高的内存区域,根据物理地址是否连续划分,每块物理地址连续的内存是一个内存节点。

1.内存节点使用pglist_data结构体描述物理内存布局:(该结构体对应上图中的node)

         node_mem_map 此成员指向页描述符数组,每个物理页对应一个页描述符。
        Node 是内存管理最顶层的结构,在 NUMA 架构下,CPU 平均划分为多个 Node,每个 Node 有自己的内存控制器及内存插槽。CPU 访问自己 Node 上内存速度快,而访问其他 CPU 所关联 Node 的内存速度慢。UMA 被当做只一个 Node 的 NUMA 系统。

2.内存区域(zone)

结构体关系总结:

  • pglist_data 是管理一个 NUMA 节点的结构体,包含该节点所有的 zone
  • zone 代表内存的一个区域,管理着这个区域的页面和空闲页面的链表。
  • zonelist 是一个 zone 的列表,表示多个内存区域的优先级顺序。
  • zoneref 是对某个 zone 的引用,通常在内存分配上下文中使用。
pglist_data(对应内存节点 node)  |  |——> zone(多个 zone 组成内存节点的内存区域,如 ZONE_DMA、ZONE_NORMAL 等)  |       |  |       |——> page(每个物理页面由 struct page 描述符管理)  |  |——> zonelist(独立于 zone 的数据结构,是多个 zone 组成的链表,定义内存分配时 zone 的优先级查找顺序)  |       |  |       |——> zoneref(作为 zonelist 的元素,指向具体 zone,用于在内存分配流程中引用 zone)  

内存分配的流程:
在内核进行内存分配时,通常按以下流程:

  1. 查找可用的 zone:内核先根据 zonelist 顺序查找可用的 zone
  2. 从 zone 获取页面:在选定的 zone 中查找空闲页面,若无空闲页面,可能触发慢路径(如回收页面)。
  3. 返回页面:找到空闲页面后,内核分配页面。

zone包含的内存类型:        

  1. 普通内存(ZONE_NORMAL)
    定义:普通内存区域是指可以直接被内核和用户程序访问的内存,通常涵盖物理内存地址空间中从低端开始的一段连续区域。
    特点:
    1. 访问速度相对较快,因直接映射到内核的线性地址空间。
    2. 适用于大部分内核数据结构和用户进程的数据存储。
    3. 在 32 位系统中,若未启用高端内存(ZONE_HIGHMEM),ZONE_NORMAL 可能占据大部分物理内存。
  2. DMA 区域(ZONE_DMA)
    定义:为满足设备进行 DMA(直接内存访问)操作而保留的内存区域。
    特点:
    1. 位于物理内存的较低地址部分,因一些老式 DMA 控制器只能访问物理内存的低地址区域(如 ISA 总线下的设备)。
    2. 区域大小通常较小,用于存储需通过 DMA 方式传输的数据(如网络数据包、磁盘数据等)。
    3. 确保设备可不经过 CPU 干预直接访问内存,提高数据传输效率。
  3. 高端内存(ZONE_HIGHMEM)
    定义:在 32 位系统中,因内核线性地址空间限制(通常仅 1GB 或 2GB 留给内核,取决于内核配置),物理内存超出内核线性地址空间能直接映射范围的部分。
    特点:
    1. 高端内存不能被内核直接访问,需通过特殊映射机制(如临时映射)访问。
    2. 在 64 位系统中,因线性地址空间充足,高端内存概念可能不再适用或重要性降低。
    3. 主要用于 32 位系统管理超出内核直接映射范围的物理内存。
  4. 可移动内存(ZONE_MOVABLE)
    定义:特殊内存区域,主要用于存放可移动的内存页。
    特点:
    1. 便于内存碎片整理,通过集中放置可移动内存页,整理时更易移动这些页,腾出连续物理内存空间。        
    2. 通常用于用户空间的匿名内存(如堆和栈),这些内存页必要时可移动到其他物理位置。
    3. 这些不同类型内存区域满足不同硬件和软件需求,确保系统高效、稳定运行。

在 Linux 内核中,通常一个内存节点(NUMA node,对应结构体 pglist_data)中的每个内存区域(zone)只会描述一个特定的内存类型(如 ZONE_NORMALZONE_DMAZONE_HIGHMEM 等)。因此,通常情况下,一个内存节点不会有多个相同类型的内存区域(比如两个 ZONE_NORMAL 或两个 ZONE_DMA 区域)。

为什么一个节点中只有一个 ZONE_NORMAL 或 ZONE_DMA

        在内核的内存管理中,内存区域(zone)用于区分不同类型的内存,这些内存类型的访问方式、大小和用途各不相同。例如:

  • ZONE_NORMAL:普通内存区域,用于应用程序内存分配,内核空间和用户空间均可使用。
  • ZONE_DMA:为 DMA(直接内存访问)设备保留的内存区域,这类设备通常只能访问低于特定物理地址的内存,需单独划分区域。
  • ZONE_HIGHMEM:高端内存区域,指超过内核线性地址空间限制的内存,主要用于 32 位系统。

        这些内存区域依内存物理地址范围、用途及硬件限制划分,每个区域有独立物理地址范围限制,因此一个物理内存节点通常只有一个 ZONE_NORMAL、一个 ZONE_DMA 和一个 ZONE_HIGHMEM 区域。

struct pglist_data 和 struct zone 之间的关系

        在 NUMA 架构中,每个内存节点(struct pglist_data)包含多个内存区域(struct zone)。例如,一个内存节点可能包含以下区域:

  • ZONE_NORMAL(普通内存)
  • ZONE_DMA(DMA 内存)
  • ZONE_HIGHMEM(高端内存)

        在此情况下,每个内存节点有一个 ZONE_NORMAL 区域、一个 ZONE_DMA 区域和一个 ZONE_HIGHMEM 区域,这些 zone 相互独立,分别描述不同内存类型。每个 struct zone 表示特定类型的内存区域,而非整个内存节点。

为什么不会有多个相同类型的 zone

内存区域(zone)基于物理内存特性划分,一个物理内存区域只能属于特定类型。例如:

  • ZONE_NORMAL:包含地址空间内大部分可用内存,是应用程序和内核的主要内存区域。
  • ZONE_DMA:针对 DMA 设备划分,包含低于特定物理地址的内存(如低于 1GB 或 4GB,取决于架构和硬件限制)。
  • ZONE_HIGHMEM:为超出内核虚拟地址空间限制的内存保留,常见于 32 位系统。

可能的例外情况

尽管一般情况下,每个内存节点只含一个特定类型的 zone,但以下情况可能导致变化:

  1. 区域类型调整:特定硬件配置或适配可能允许多个物理内存区域被视为一个逻辑区域,取决于硬件支持和内核实现。
  2. 动态调整:内核在内存分配管理中,可能通过区域划分调整、内存回收等机制动态调整或合并内存区域,但不意味着同一节点会有多个相同类型的 zone
  3. NUMA 节点间重叠:复杂硬件平台上,内存节点的物理地址空间可能重叠,导致节点共享内存区域。此时,内核可能处理区域合并或重映射,但每个节点内仍通常只有一个 ZONE_NORMAL、一个 ZONE_DMA 和一个 ZONE_HIGHMEM

3.物理页

        每个物理页对应一个 page 结构体,称为页描述符,内存节点的 pglist_data 实例的成员 node_mem_map 指向该内存节点包含的所有物理页的页描述符组成的数组。Linux 内核源码分析:include/linux/mm_types.h

        页是内存管理当中的最小单位,页面中的内存其物理地址是连续的,每个物理页由 struct page 描述。为了节省内存,struct page 是个联合体。

        页,又称为页帧,在内核当中,内存管理单元 MMU(负责虚拟地址和物理地址转换的硬件)是把物理页 page 作为内存管理的基本单位。体系结构不同,支持的页大小也相同。

        32 位体系结构支持 4kb 的页
        64 位体系结构支持 8kb 的页
        MIPS64 架构体系支持 16kb 的页。

https://github.com/0voice

相关文章:

Linux内核物理内存组织结构

一、系统调用sys_mmap 系统调用mmap用来创建内存映射,把创建内存映射主要的工作委托给do_mmap函数,内核源码文件处理:mm/mmap.c 二、系统调用sys_munmap 1、vma find_vma (mm, start); // 根据起始地址找到要删除的第一个虚拟内存区域 vma 2…...

Redis高级技能进阶

什么是事务的ACID 事务是由一系列对系统中数据进行访问或更新的操作组成的程序执行逻辑单元。这些操作要么都执行,要么都不执行。 为了保证数据库的一致性,在事务处理之前和之后,都应该遵循某些规则,也就是大家耳熟能详的ACID。 …...

PCB设计基础:面向嵌入式工程师的系统性指南

嵌入式系统的性能、稳定性和可靠性,很大程度上依赖于电路硬件的设计质量。在硬件设计中,PCB(Printed Circuit Board)设计是连接系统功能与实际运行的关键一环。本文将从嵌入式工程师的视角,系统性地介绍PCB设计的关键基…...

aspark 配置2

编写Hadoop集群启停脚本 1.建立新文件,编写脚本程序 在hadoop101中操作,在/root/bin下新建文件:myhadoop,输入如下内容: 2.分发执行权限 保存后退出,然后赋予脚本执行权限 [roothadoop101 ~]$ chmod x /r…...

【统计方法】LASSO筛变量

启 比较原始做LASSO包是library(glmnet) 若目标是纯 LASSO 分析,alpha 必须设为 ​​1 ​​标准化数据​​:LASSO 对特征的尺度敏感,需对数据进行标准化(均值为0,方差为1)。 cv.glmnet​获得的lambda.m…...

拥抱健康生活,书写养生新篇

在快节奏的现代生活中,健康愈发成为人们关注的焦点。践行健康养生,并非是一种选择,而是我们对自己和家人应尽的责任。掌握正确的养生之道,不仅能提升生活品质,更能让生命焕发出新的活力。​ 合理饮食是健康的基石。一…...

Shiro学习(五):Shiro对权限的缓存

一、问题描述 由前边的学习中了解,用户的角色权限一般存储在数据库中,每次进行权限校验时都要从 数据库查询用户的角色权限信息;对数据库来说这样频繁的查询压力太大了,也影响程序的 性能。 Shiro 中执行权限角色校验时&#xff0…...

QGIS实战系列(六):进阶应用篇——Python 脚本自动化与三维可视化

欢迎来到“QGIS实战系列”的第六期!在前几期中,我们从基础操作到插件应用逐步提升了 QGIS 技能。这一篇,我们将迈入进阶领域,探索如何用 Python 脚本实现自动化,以及如何创建三维可视化效果,让你的 GIS 项目更高效、更立体。 第一步:Python 脚本自动化 QGIS 内置了 Py…...

redis-cpp-cpp如何使用lua脚本

1.前言 我今天要在项目中使用lua脚本,结果搞半天都没有弄明白这个函数怎么调用,而且也似乎很少有redis相关的博客介绍,ai也回答的不准确! 2.正文 今天用一个例子演示一下 下面是lua脚本 const std::string LuaScript R"…...

C# Winform 入门(6)之不同类之间的值传递

承接上一个教程,利用委托事件来进行值传递 声明变量 public static double plx, ply,plxx,plyy;声明委托、事件 //声明委托 //事件 public delegate void transferDistance(double dis); public static transferDistance doTransfer; 直接读取form1中的变量 publ…...

PyTorch 深度学习 || 6. Transformer | Ch6.1 注意力机制

...

JWT 秘钥的作用机制

JWT 秘钥的作用并不是给前端使用的,而是用于后端服务器内部的一个重要安全机制。 JWT 秘钥的作用 签名与验证: 秘钥主要用于对 JWT(JSON Web Token)进行签名和验证后端使用这个秘钥对令牌进行签名,确保令牌的完整性…...

sun.misc.BASE64Encoder 和 sun.misc.BASE64Decoder包

1. 在将别人的项目导入eclipse之后,出现了"sun.misc.BASE64Encoder找不到jar"的错误,我解决的办法是:右键项目》属性》Java Build Path》jre System Library 》access rules 》resolution选择accessible,下面填上**点击确定即可&#xff0…...

Java面试黄金宝典34

1. 主键索引底层的实现原理 定义 主键索引是数据库中用于唯一标识表中每一行记录的索引,常见的底层实现是 B 树结构。B 树是一种平衡的多路搜索树,由内部节点和叶子节点组成。内部节点只存储索引键和指向下一层节点的指针,不存储实际数据&am…...

计算机系统---CPU

定义与功能 中央处理器(Central Processing Unit,CPU),是电子计算机的主要设备之一,是计算机的核心部件。CPU是计算机的运算核心和控制核心,负责执行计算机程序中的指令,进行算术运算、逻辑运算…...

AWS云安全基线:构建企业级安全防护体系的完整指南

1. 引言 随着越来越多的企业将其业务和数据迁移到云端,云安全已成为一个不容忽视的关键议题。AWS作为全球领先的云服务提供商,提供了丰富的安全工具和最佳实践。本文将深入探讨如何构建一个全面的AWS云安全基线,以确保您的企业在云环境中的安全性。 2. AWS共享责任模型 在深…...

(三十三)Dart 中使用 Pub 包管理系统与 HTTP 请求教程

Dart 中使用 Pub 包管理系统与 HTTP 请求教程 Pub 包管理系统简介 Pub 是 Dart 和 Flutter 的包管理系统,用于管理项目的依赖。通过 Pub,开发者可以轻松地添加、更新和管理第三方库。 使用 Pub 包管理系统 1. 找到需要的库 访问以下网址&#xff0c…...

如何实现单例模式?

一、模式定义与核心价值 单例模式(Singleton Pattern)是一种创建型设计模式,保证一个类仅有一个实例,并提供全局访问点。其核心价值在于: ​​资源控制​​:避免重复创建消耗性资源(如数据库连…...

【51单片机】2-4【I/O口】震动传感器控制继电器

1.硬件 51最小系统继电器模块震动传感器模块 2.软件 #include "reg52.h"sbit vibrate P3^3;//震动传感器DO接到P3.3口 sbit switcher P1^1;//继电器控制端IN接到P1.1void Delay2000ms() //11.0592MHz {unsigned char i, j, k;// _nop_();i 15;j 2;k 235;do{…...

正点原子 迷你 miniSTM32用ST link烧录后程序不运行(已解决)

情况,在程序和配置都没有问题时检查 烧录使用ST linkv2 烧录后有时程序可行,有时不可行 解决方法 加USB供电配合SW烧录 建议直接用USB转串口烧录 不推荐JLINK供电,也不推荐ST linkv2供电...

如何确保MQ消息队列不丢失:Java实现与流程分析

前言 在分布式系统中,消息队列(Message Queue, MQ)是核心组件之一,用于解耦系统、异步处理和削峰填谷。然而,消息的可靠性传递是使用MQ时需要重点考虑的问题。如果消息在传输过程中丢失,可能会导致数据不一…...

Pascal语言的系统监控

Pascal语言的系统监控 引言 在现代计算机系统中,系统监控是确保计算机平稳运行的重要组成部分。无论是个人计算机还是大型服务器,监控系统的性能、资源使用及状态,都是提高系统效率、及时发现问题的关键。Pascal语言作为一种结构化编程语言…...

6.0 使用Qt+ OpenCV+Python加载图片

本例作为python图像处理的入门课程1,使用Qt+ OpenCV+Python加载图片。 主要有如下几个地方需要注意: 1. OpenCV 默认使用 BGR 格式,而 Qt 使用 RGB。显示前需要转换:cv2.cvtColor(img, cv2.COLOR_BGR2RGB),一般使用某个QLabel控件进行显示。 pic = cv2.cvtColor(pic, cv2.C…...

低成本训练垂直领域文娱大模型的技术路径

标题:低成本训练垂直领域文娱大模型的技术路径 内容:1.摘要 在文娱产业快速发展且对智能化需求日益增长的背景下,为降低垂直领域文娱大模型的训练成本,本研究旨在探索低成本训练的有效技术路径。采用对现有开源模型进行微调、利用轻量化模型架构以及优化…...

音视频入门基础:RTP专题(21)——使用Wireshark分析海康网络摄像机RTSP的RTP流

一、引言 使用vlc等播放器可以播放海康网络摄像机的RTSP流: 网络摄像机的RTSP流中,RTSP主要用于控制媒体流的传输,如播放、暂停、停止等操作。RTSP本身并不用于转送媒体流数据,而是会通过PLAY方法使用RTP来传输实际的音视频数据。…...

【Java网络编程详解】

文章目录 前言一、网络编程基础知识1. 什么是网络编程? 二、Java网络编程核心类三、TCP编程实现1. TCP通信原理2. TCP服务器端示例3. TCP客户端示例 四、UDP编程实现1. UDP通信原理2. UDP服务器端示例3. UDP客户端示例 五、使用HttpURLConnection发送HTTP请求1. GET…...

DuckDB系列教程:如何分析Parquet文件

Parquet 是一种强大的、基于列的存储格式,适用于实现更快捷和更高效的数据分析。您可以使用 DuckDB 这种内存型分析数据库来处理 Parquet 文件并运行查询以对其进行分析。 在这篇文章中,我们将逐步介绍如何使用 DuckDB 对存储在 Parquet 文件中的餐厅订单…...

uniapp的v-for不显示或者swiper-item的不显示

今天开发的时候碰见一个问题&#xff0c;在布局的时候发现v-for遍历的时候不显示内容 H5是正常的 但是在小程序就是不显示 最后排查的原因是同一个组件 swiper-item的 v-for不能用相同的名称 比如 <swiper-item v-for"i in 3" :key"i"><image …...

解决LeetCode“使括号有效的最少添加”问题

目录 问题描述 解题思路 复杂度分析 示例分析 暴力替换“不讲码德” 总结 问题描述 给定一个仅由 ( 和 ) 组成的字符串 s&#xff0c;我们需要通过添加最少数量的括号&#xff08;( 或 )&#xff09;使得字符串有效。有效字符串需满足&#xff1a; 空字符串是有效的。 …...

黑马点评_知识点

将手机验证码保存到HttpSession中进行验证&#xff08;感觉已经过时&#xff09; Controller中的参数有HttpSession&#xff0c;存验证码session.setAttribute(SystemConstants.VERIFY_CODE, code); 其他的都是逻辑代码 Cookie的缺点 什么是Session集群共享问题&#xff1f; …...

2025年渗透测试面试题总结-某腾讯-玄武实验室扩展(题目+回答)

网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 某腾讯-玄武实验室扩展 一、Web安全基础原理与关联漏洞 1.1 CSRF攻击原理深度解析 1.2 反序列化漏洞…...

管理系统 UI 设计:提升企业办公效率的关键

一、管理系统UI设计的基本原则 管理系统UI设计应遵循一系列基本原则&#xff0c;以确保界面友好、操作便捷、信息直观。这些原则包括&#xff1a; 简洁性&#xff1a;界面应去除冗余元素&#xff0c;保持简洁明了&#xff0c;避免用户迷失在复杂界面中。一致性&#xff1a;界…...

Apache Commons Lang3 中的 `isNotEmpty` 与 `isNotBlank`的区别

前言 在 Java 开发中&#xff0c;字符串的空值&#xff08;null&#xff09;、空字符串&#xff08;“”&#xff09;和空白字符串&#xff08;如 " "&#xff09;的判断是高频需求。Apache Commons Lang3 的 StringUtils 类提供了两个核心方法&#xff1a;isNotEmp…...

WPF 登录页面

效果 项目结构 LoginWindow.xaml <Window x:Class"PrismWpfApp.Views.LoginWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"http://schemas.…...

CExercise_05_1函数_2海伦公式求三角形面积

题目&#xff1a; 键盘录入三个边长&#xff08;带小数&#xff09;&#xff0c;然后用海伦公式计算三角形的面积&#xff08;如果它确实是一个三角形的话&#xff09; 海伦公式求三角形面积&#xff1a; 要求基于下列两个函数完成这个编程题&#xff1a; // 判断abc是否可以组…...

Muduo网络库实现 [十五] - HttpContext模块

目录 设计思路 类的设计 解码过程 模块的实现 私有接口 请求函数 解析函数 公有接口 疑惑点 设计思路 记录每一次请求处理的进度&#xff0c;便于下一次处理。 上下文模块是Http协议模块中最重要的一个模块&#xff0c;他需要记录每一次请求处理的进度&#xff0c;需…...

构建自己的私有 Git 服务器:基于 Gitea 的轻量化部署实战指南

对于个人开发者、小型团队乃至企业来说&#xff0c;将项目代码托管在 GitHub、Gitee 等公共平台虽然方便&#xff0c;但也存在一定的隐私与可控性问题。 搭建一套私有 Git 代码仓库系统&#xff0c;可以实现对源码的完全控制&#xff0c;同时不依赖任何第三方平台&#xff0c;…...

【计科】计算机科学与技术,从离散数学到软件工程,从理学/抽象/科学到工学/具体/技术

【计科】计算机科学与技术&#xff0c;从离散数学到软件工程&#xff0c;从理学/抽象/科学到工学/具体/技术 文章目录 1、发展史与桥梁&#xff08;离散数学 -> 算法/数据结构 -> 软件工程&#xff09;2、离散数学&#xff08;数理逻辑-命题/谓词/集合/函数/关系 -> 代…...

架构与大数据-RabbitMQ‌和Kafka的技术实现异同及落地场景上的异同

RabbitMQ‌与Kafka技术实现及场景对比 ‌一、技术实现异同‌ ‌对比维度‌‌RabbitMQ‌‌Kafka‌‌核心协议/模型‌基于 ‌AMQP 协议‌&#xff0c;支持点对点、发布/订阅、Topic Exchange 等多种消息模式&#xff0c;支持灵活的路由规则‌基于 ‌发布-订阅模型‌&#xff0c;…...

工程画图-UML类图 组合和聚合

组合VS聚合 组合&聚合浅层理解 组合似组装&#xff0c;电脑组装&#xff0c;少装一个CPU行不&#xff1f;不行&#xff0c;没CPU哪还是电脑啊。用实心菱形表示。 而聚合似起义&#xff0c;聚是一团火&#xff0c;散是满天星。就像公司和员工&#xff0c;少你一个照常运转…...

Go语言-初学者日记(七):用 Go 写一个 RESTful API 服务!

&#x1f477; 实践是最好的学习方式&#xff01;这一篇我们将用 Go Gin 框架从零开始开发一个用户管理 API 服务。你将学到&#xff1a; 如何初始化项目并引入依赖如何组织目录结构如何用 Gin 实现 RESTful 接口如何通过 curl 测试 API进阶功能拓展建议 &#x1f9f0; 一、项…...

数据结构:手工创建表达式树的方法

1. 表达式树 表达式树&#xff08;Binary Expression Tree&#xff09;是一类特殊的二叉树&#xff0c;用以表示表达式&#xff0c;如图 7.6.1 所示&#xff0c;是一棵表示了 a b * c d * (e f) 的表达式树。 图 7.6.1 表达式树示例 表达式树有如下特点&#xff1a; 操作数…...

自定义类型:联合和枚举

文章目录 前言一、联合体类型的声明1.1 联合体类型的声明1.2 联合体的特点1.3 相同成员的结构体和联合体对比1.4 联合体大小的计算1.5 联合体的一个练习 二、枚举类型的声明2.1 枚举类型的声明2.2 枚举类型的优点2.3 枚举类型的使用1. 用于 switch 语句2. 作为函数参数 总结 前…...

注意力机制

实现了Bahdanau式加法注意力的核心计算逻辑。以下是三个线性层设计的完整技术解析&#xff1a; 一、数学公式推导 注意力分数计算流程&#xff1a; s c o r e ( h d e c , h e n c ) v T ⋅ tanh ⁡ ( W 1 ⋅ h e n c W 2 ⋅ h d e c ) score(h_{dec}, h_{enc}) v^T \cdot …...

OrangePi5Plus开发板不能正确识别USB 3.0 设备 (绿联HUB和Camera)

1、先插好上电&#xff08;可正确识别&#xff09; 2、上电开机后插&#xff0c;报错如下&#xff0c;只能检测到USB2.0--480M&#xff0c;识别不到USB3.0-5Gbps&#xff0c;重新插拔也不行 Apr 4 21:30:00 orangepi5plus kernel: [ 423.575966] usb 5-1: reset high-speed…...

KubeVirt虚拟化管理架构

目录 一. KubeVirt简介 1.1 KubeVirt的价值 1.2 KubeVirt架构 1.3 KubeVirt组件 1.4 KubeVirt流程管理 KubeVirt实战 2.1 Kubevirt安装 2.1.1节点规划 2.1.2 环境准备 2.1.3 安装KubeVirt 2.1.4 安装CDI 2.1.5 安装virtctl命令工具 2.1.6 生成官方虚拟机 2.1.7 进…...

游戏引擎学习第202天

调试器&#xff1a;启用“跳转到定义/声明”功能 开始了一个完整游戏的开发过程&#xff0c;并分享了一些实用技巧。首先&#xff0c;讨论了如何在 Visual Studio 中使用“跳转到定义”和“跳转到声明”功能&#xff0c;但当前的项目并未启用这些功能&#xff0c;因为缺少浏览…...

sqlalchemy查询json

第一种&#xff1a;字段op是json格式&#xff1a; {"uid": "cxb123456789","role": 2,"op_start_time": 1743513707504,"op_end_time": 1743513707504,"op_start_id": "op_001","op_end_id"…...

2024第十五届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组

记录刷题的过程、感悟、题解。 希望能帮到&#xff0c;那些与我一同前行的&#xff0c;来自远方的朋友&#x1f609; 大纲&#xff1a; 1、握手问题-&#xff08;解析&#xff09;-简单组合问题&#xff08;别人叫她 鸽巢定理&#xff09;&#x1f607;&#xff0c;感觉叫高级了…...

Linux系统之wc命令的基本使用

Linux系统之wc命令的基本使用 一、命令简介二、基本语法格式三、核心功能选项四、典型使用案例4.1 创建示例文件4.2 基础统计操作4.3 组合选项使用4.4 管道流处理 五、高级应用技巧4.1 递归统计代码行数4.2 统计CSV文件数据量4.3 监控日志增长速率4.4 字符与字节差异说明 七、命…...