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

【Linux笔记】——Linux线程理解与分页存储的奥秘

🔥个人主页🔥:孤寂大仙V
🌈收录专栏🌈:Linux
🌹往期回顾🌹:【Linux笔记】——进程信号的捕捉——从中断聊聊OS是怎么“活起来”的
🔖流水不争,争的是滔滔不息


  • 一、线程的概念
    • 初步理解
    • 线程简介
  • 二、分页式存储管理
    • 4KB页框
    • 页表
    • 页目录结构
    • 虚拟地址到物理地址的转化
  • 三、线程的优缺点

一、线程的概念

初步理解

在这里插入图片描述
之前学过进程,进程=内核数据结构+代码和数据,线程是进程内部的一个执行分流。进程承担分配系统资源的基本实体,线程是CPU调度的基本单位。这里的概念都是比较官方的。
Linux的线程可以采用进程来模拟,进程访问的大部分资源都是通过地址空间来访问的,将资源分配给不同的task_struct,不就是用进程模拟出了线程吗,(对资源的划分本质就是对地址空间虚拟地址范围的划分,虚拟地址就是资源的代表)。
Linux的线程就是轻量级进程,或者说是轻量级模拟实现的。一个进程的PCB(进程控制块)下有多个线程的TCB(线程控制块),这些就指向了进程地址空间的特定的区域,执行特定的任务。

Linux 线程是通过“共享地址空间的轻量级进程”模拟实现的,资源由进程统一管理,调度由 task_struct 决定。

线程简介

在Linux中,线程是一种比进程更轻量级的执行单元,线程共享同一个进程的地址空间、全局变量、文件描述符等资源,到那每个线程有自己独立的寄存器上下文、栈、线程局部存储(TLS)。
从内核角度看,Linux没有特意区分进程和线程,线程本质就是一个“特殊的进程”。Linux用task_struct这个数据结构来表示“任务”,无论是线程还是进程都是task。
进程是资源的集合,进程是调度的最小单位。

Linux下的线程通常通过clone()系统调用创建(pthread底层也是clone),区分在于参数指定了资源共享的范围。这也是为什么Linux下线程其实是共享部分资源的轻量进程。

Linux线程,本质上是资源共享更紧密的进程,调度上被看作独立任务,资源管理上依赖所属进程。


简化理解
线程就是"轻量级进程",是跑在进程资源上的“执行流”。一个进程可以有多个线程,这线程共享同一个进程的地址空间(代码、数据、堆、文件描述符),但是各自有独立的栈、寄存器上下文、线程局部存储。

进程是“资源大本营”负责存放代码、数据、打开的文件、堆内存。
线程是"干活的工人"负责具体跑代码的那条“执行流”。线程是进程的执行流
多个线程一起“逛”同一个进程的大本营,各忙各的,但是用的是同一批资源。

线程是跑在进程资源上的执行单元,本质是更轻巧的进程。


那么这个大的进程还干活吗,还是大的进程创建好,只负责资源划分了,活都让线程干了???

所谓的大进程,其实最初就是主线程,它既是‘资源归属的壳’,也是第一个干活的线程。后面创建的新线程大家一起干活,但本质上干活的永远是线程。

二、分页式存储管理

4KB页框

文件在磁盘存储的时候,以4kb为单位进行储存无论是属性还是内容。
不管是磁盘还是内存都是以4kb划分的,在物理内存中4kb大小的内存块叫做页框或者页帧,按照一个页框4kb那么4gb的空间就有1048576个页框,操作系统对这些页框管理起来要先描述在组织。
内核用 struct page 结构表示系统中的每个物理页,出于节省内存的考虑, struct page 中使用了大量的联合体union。

/* include/linux/mm_types.h */
struct page {/* 原子标志,有些情况下会异步更新 */unsigned long flags;union {struct {/* 换出页列表,例如由zone->lru_lock保护的active_list */struct list_head lru;/* 如果最低为为0,则指向inode address_space,或为NULL* 如果页映射为匿名内存,最低为置位* 而且该指针指向anon_vma对象*/struct address_space *mapping;/* 在映射内的偏移量 */pgoff_t index;/** 由映射私有,不透明数据* 如果设置了PagePrivate,通常用于buffer_heads* 如果设置了PageSwapCache,则用于swp_entry_t* 如果设置了PG_buddy,则用于表示伙伴系统中的阶*/unsigned long private;};struct { /* slab, slob and slub */union {struct list_head slab_list; /* uses lru */struct { /* Partial pages */struct page *next;
#ifdef CONFIG_64BITint pages;      /* Nr of pages left */int pobjects;   /* Approximate count */
#elseshort int pages;short int pobjects;
#endif};};struct kmem_cache *slab_cache; /* not slob *//* Double-word boundary */void *freelist; /* first free object */union {void *s_mem;    /* slab: first object */unsigned long counters; /* SLUB */struct { /* SLUB */unsigned inuse : 16;    /* 用于SLUB分配器:对象的数目 */unsigned objects : 15;unsigned frozen : 1;};};};};union {/* 内存管理子系统中映射的页表项计数,用于表示页是否已经映射,还用于限制逆向映射搜索 */atomic_t _mapcount;unsigned int page_type;unsigned int active;  /* SLAB */int units;            /* SLOB */};#if defined(WANT_PAGE_VIRTUAL)/* 内核虚拟地址(如果没有映射则为NULL,即高端内存) */void *virtual;#endif /* WANT_PAGE_VIRTUAL */
};

要注意的是 struct page 与物理页相关,而并非与虚拟页相关。而系统中的每个物理页都要分配一个这样的结构体,让我们来算算对所有这些页都这么做,到底要消耗掉多少内存。
算 struct page 占40个字节的内存吧,假定系统的物理页为 4KB 大小,系统有 4GB 物理内存。那么系统中共有页面 1048576 个(1兆个),所以描述这么多页面的page结构体消耗的内存只不过40MB ,相对系统 4GB 内存而言,仅是很小的一部分罢了。因此,要管理系统中这么多物理页面,这个代价并不算太大。要知道的是,页的大小对于内存利用和系统开销来说非常重要,页太大,页必然会剩余较大不能利用的空间(页内碎片)。页太小,虽然可以减小页内碎片的大小,但是页太多,会使得页表太长而占用内存,同时系统频繁地进行页转化,加重系统开销。因此,页的大小应该适中,通常为 512B -8KB ,windows系统的页框大小为4KB。

这个页的下标被struct page_mem存储,转化为了对数组下标的操作,每个页都会有下标,那么每个页的起始地址肯定就可以知道了。所以就要这个偏移量从哪得来呢?

页表

物理页地址也是页框的地址
把这个单⼀页表拆分成 1024 个体积更小的映射表。如下图所示。这样⼀来,1024(每个表中的表项个数) * 1024(表的个数),仍然可以覆盖 4GB 的物理内存空间。 这里的每⼀个表,就是真正的页表,所以⼀共有 1024 个页表。⼀个页表自身占用 4KB ,那么1024 个页表⼀共就占用了 4MB 的物理内存空间,和之前没差别啊?
从总数上看是这样,但是⼀个应用程序是不可能完全使用全部的 4GB 空间的,也许只要几十个页表就可以了。例如:⼀个用户程序的代码段、数据段、栈段,⼀共就需要 10 MB 的空间,那么使用 3 个页表就足够了
在这里插入图片描述

页目录结构

前面每个页框都被一个也表中的表项指向了,那么1024个页表也需要被管理起来,页目录是管理页表的表形成二级目录。
在这里插入图片描述
页目录的物理地址被CR3寄存器指向,CR3寄存器保存了当前正在执行任务的页目录地址。操作系统在加载用户程序的时候不仅要为程序内容分配物理内存,还需要为用来保存程序的页目录和页表分配物理内存。

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

二级页表的地址转化

在这里插入图片描述
如图虚拟地址的前10位查页目录表,找到对应的页表地址。中间10位查页表,找到对应的页框的地址。最后12位页框内部的偏移量。这时就拿到了页内偏移量,就能找到对应的物理内存的地址了(页框地址+页内偏移量)

页目录的索引:前10位查页目录表,找到对应的页表地址。
页表的索引:中间10位查页表,找到对应的页框的地址.
页内偏移:最后12位,页框内部偏移量。

第一阶段:根据CR3寄存器查找到页目录的地址,然后通过页目录索引(下级页表的地址),查到页表的地址。
第二阶段:根据页表的地址+页表的索引,查找到页框的物理地址。
第三阶段:页框的物理地址+(页内偏移)最后12位,反问要找的物理内存。

MMU(内存管理单元) 就是这套虚拟地址 → 物理地址映射的**“自动执行者”**。一旦分页开启(CR0.PG = 1),后续这些页表查找、地址换算的“繁琐活”全都扔给 MMU 了,CPU 自己都不操心。

CPU:哥只管指令和虚拟地址,物理内存你 MMU 自己看着办!

MMU里面有TLB(快表),缓存最近用过的虚拟地址到物理页的映射。如果没有TLB重复查页表会慢,有了TLB命中一次在查表查到重复的时候就瞬间映射了。TLB没有命中才需要MMU去走查表流程。
在这里插入图片描述

前面提到过CR3寄存器,这个就是告诉MMU这个进程的页目录表在哪里,进程切换的时候操作系统会更新CR3寄存器,MMU就会去新的页目录去映射虚拟地址了。


申请内存的时候要先查找数组就是上面所说的那个存储页框下标的数组,找到没有被使用过的页框,然后走上面虚拟地址到物理地址的一套流程,找到物理内存的地址。

写时拷贝、缺页中断、内存申请等等,背后都可能要有重新建立新的页表和建议映射关系的操作。顺带提一嘴,这个写时拷贝,申请物理内存的时候是拷贝一块页框。

上面的一张页目录+n张页表构成了映射体系,虚拟地址是索引,物理地址页框是目标。

对线程的深刻一点的认识**有了分页储存的知识,线程进行资源划分,本质是划分地址空间,获得一定范围的合法的虚拟地址,本质上是在划分页表。**线程的资源共享,本质是对地址空间的共享,是对页表条目的共享。

三、线程的优缺点

  1. 资源共享,通信高效
    同一进程的线程共享:代码段、数据段、堆、打开的文件描述符等资源。
    线程之间的数据交换不需要复杂的进程间通信(IPC),直接读写共享数据即可,天然高效。
    📝对比一下:
    进程通信靠管道、消息队列、共享内存,麻烦又有性能损耗;
    线程通信,指针一传,内存一读写,简单粗暴,快得离谱。

  2. 创建销毁开销小
    线程的创建、销毁、切换所需的时间、内存都比进程小得多。
    因为线程本质上是“共用进程资源的小分身”,系统不用像创建进程那样“从头来过”。
    📝 举个例子:
    nginx、MySQL、高性能服务器动不动上千上万的并发连接,要是每个都用进程,那光是切换调度就能把 CPU 熬死。

  3. 并发编程的利器
    多线程可以充分利用多核 CPU 的计算能力,把任务分解后并行处理,大幅提升程序吞吐量。
    尤其是 I/O 密集型、计算密集型场景,多线程是提升性能的标配。

  4. 更细粒度的控制
    用线程可以灵活地拆分任务,比如前端渲染、后端计算、网络通信各跑各的线程,让程序逻辑更清晰。还能配合线程池、异步模型,打造高性能、高并发的架构。“线程 = 共享资源下的高效并发武器”,相比动不动就“各自为政”的进程,线程的优雅在于:共用、快速、并行、灵活。


线程的缺点:甜蜜背后也有苦果

  1. 共享带来的“安全隐患”
    线程虽然共享资源,但**“你也动、我也改”**,就容易出事。
    数据竞争、死锁、脏数据、野指针……这些多线程的噩梦都来自于共享带来的同步问题。

📝 举个栗子:
两个线程都在更新一个全局变量,如果没有加锁,那谁先谁后完全看心情,结果就是——诡异的bug,必现!

  1. 同步机制带来的性能消耗
    为了解决线程安全问题,只能用锁、信号量、原子操作这些“同步大法”。
    然而同步本身就意味着等待、阻塞、上下文切换,过多的锁竞争反而会拖慢性能。
    📝 面试高频问:
    “为什么锁要小而精(细粒度锁)?因为大锁一加,线程都排队了,没法并发了。”

  2. 调试、排错极其困难
    单线程的 bug 一般都是顺序可复现的,多线程的 bug 属于“玄学”级别:
    时序依赖、偶现性、复现难度极高。
    多线程代码一旦出错,经常是“开发怀疑人生,运维夜不成寐”。

  3. 线程数量不是想开多少就开多少
    线程虽然轻量,但不是无限轻。
    每个线程都有自己的栈(通常是几百KB~1MB),开太多线程会导致内存耗尽,反而拖垮系统。
    📝 这就是为什么需要“线程池”,防止野蛮生长。

  4. 线程调度依然有开销
    虽比进程轻,但线程的上下文切换、调度竞争仍然消耗 CPU。在高并发下,不合理的线程数会导致线程风暴,反而让系统性能雪崩。

“线程带来高效,也埋下隐患。想用好多线程,得有同步的智慧、调度的节制、代码的洁癖。”

相关文章:

【Linux笔记】——Linux线程理解与分页存储的奥秘

🔥个人主页🔥:孤寂大仙V 🌈收录专栏🌈:Linux 🌹往期回顾🌹:【Linux笔记】——进程信号的捕捉——从中断聊聊OS是怎么“活起来”的 🔖流水不争,争的…...

ACM算法

在ACM模式下使用JavaScript/TypeScript获取输入值 在ACM编程竞赛或在线判题系统(如LeetCode、牛客网等)中,JavaScript/TypeScript需要特定的方式来获取输入值。以下是几种常见的获取输入的方法: 1. 使用Node.js的readline模块 这是最常见的处理ACM模式…...

家用或办公 Windows 电脑玩人工智能开源项目配备核显的必要性(含 NPU 及显卡类型补充)

一、GPU 与显卡的概念澄清 首先需要明确一个容易误解的概念:GPU 不等同于显卡。 显卡和GPU是两个不同的概念。 【概念区分】 在讨论图形计算领域时,需首先澄清一个常见误区:GPU(图形处理单元)与显卡(视…...

FastByteArrayOutputStream和ByteArrayInputStream有什么区别

FastByteArrayOutputStream 和 ByteArrayInputStream 是两种完全不同的 Java I/O 类,它们的主要区别体现在 设计目的 和 使用场景 上。以下是详细对比: 1. 核心区别总结 特性FastByteArrayOutputStream (Spring框架)ByteArrayInputStream (JDK原生)所属…...

远程连接电脑的方法?异地远程桌面连接和三方软件实现

远程连接电脑,是指通过网络技术,在一台设备上操控另一台设备的电脑桌面,实现跨地域的操作和管理。在日常工作、技术支持、远程办公等场景中,远程连接电脑都发挥着重要作用。实现远程连接电脑主要有系统自带工具和第三方软件两种方…...

编程题 03-树2 List Leaves【PAT】

文章目录 题目输入格式输出格式输入样例输出样例 题解解题思路完整代码 编程练习题目集目录 题目 Given a tree, you are supposed to list all the leaves in the order of top down, and left to right. 输入格式 Each input file contains one test case. For each case, …...

数据预处理之数据平滑处理详解

信号数据收到噪声干扰,影响检测的准确性。数据平滑处理的关键步骤,旨在降低噪声同时保留信号特征。 1.1 移动平均(Moving Average) 原理:通过计算窗口内数据的平均值来平滑噪声,适用于快速去除高频噪声。…...

deepseek梳理java高级开发工程师算法面试题

Java高级工程师算法面试题与答案 一、数据结构与算法基础 1. 红黑树与AVL树比较 题目:详细说明红黑树和AVL树的区别及各自的适用场景,并用Java实现红黑树的插入操作。 答案: 区别对比: ┌─────────────────…...

【SSL证书系列】SSL证书工作原理解读

SSL(Secure Sockets Layer)及其继任者TLS(Transport Layer Security)是用于保护网络通信安全的加密协议。SSL证书是实现HTTPS协议的核心,其工作原理涉及加密技术、身份验证和信任机制。以下是其工作原理的详细分步解析…...

模板源码建站、定制建站和SaaS 建站有什么区别?企业建站应该怎么选?

最近遇到不少客户问,为什么现在做一个网站为什么从几百到几万的都有呀?市面上五花八门有模板源码建站、SaaS建站和定制建站我该怎么选?有什么区别?今天小编就跟大家一起来唠一唠,接下来我们就一起来看看吧!…...

OpenCV进阶操作:人脸检测、微笑检测

文章目录 前言一、OpenCV如何实现人脸检测1、haar特征2、级联分类器3、级联分类器的使用 二、人脸检测、微笑检测 案例实现1、预处理2、加载分类器3、标注人脸4、运行结果:4、微笑检测 总结 前言 要实现人脸识别首先要判断当前图像中是否出现了人脸,这就…...

论文查询的ai工具 —— SCAICH

(1)SCAICH的项目背景 SCAICH是由Scihub Web3 Community孵化的技术产品。SCAICH是一个非盈利性的平台,模式上采用免费邀请码模式,采用捐赠和广告维持成本。产品将会面向世界上所有国家的学者。 (2)SCAICH产品…...

Python+大模型 day01

Python基础 计算机系统组成 基础语法 如:student_num 4.标识符要做到见名知意,增强代码的可读性 关键字 系统或者Python定义的,有特殊功能的字符组合 在学习过程中,文件名没有遵循标识符命名规则,是为了按序号编写文件方便查找复习 但是,在开发中,所有的Python文件名称必须…...

elasticsearch硬件与资源配置优化

以下是Elasticsearch硬件与资源配置优化的综合方案,结合最新实践与核心优化逻辑: 一、硬件选型优化 ‌存储设备‌ 优先选用SSD作为存储介质,其随机读取性能比机械硬盘高5-10倍,尤其适合文档检索类高并发场景。单节点存储控制在2TB以内,避免超过5TB导致查询性能下降和系统…...

C++ 在 Windows 的开发经验与解决方案

一、开发环境搭建 在 Windows 上进行 C 开发,主流的集成开发环境(IDE)有 Visual Studio 和 CLion。Visual Studio 是微软官方推出的强大开发工具,对 Windows 平台有着原生的支持,集成了编译器、调试器、代码编辑器等一…...

1669上什么课

1.题目描述 暑假来了,晶晶报了四门课来充实自己的暑假生活;周一上游泳,周三上编程,周五上阅读,周六上数学;其余时间没课。请从键盘读入今天是星期几,输出晶晶今天应该上什么课。 请注意&#…...

通过MCP让LLM调用系统接口

场景 MCP的出现大大丰富了LLM的功能,对于存量系统,我们希望能让模型调用已有的接口,以最小的成本让AI能够获取系统内部数据。因此我们开发了一个名为http-api-call的MCP Server,来支持模型到内部API的调用 实现方案 使用用标准…...

Java NIO 深度解析:突破传统IO的性能瓶颈

一、Java NIO 核心价值与演进历程 1.1 传统IO的局限性 Java传统的BIO(Blocking I/O)模型在应对高并发场景时存在显著缺陷: 线程资源浪费:每个连接需要独立线程处理上下文切换开销:线程数增加导致CPU调度成本指数级增长吞吐量瓶颈:受限于线程池大小和操作系统限制响应延…...

AI-02a5a5.神经网络-与学习相关的技巧-权重初始值

权重的初始值 在神经网络的学习中,权重的初始值特别重要。实际上,设定什么样的权重初始值,经常关系到神经网络的学习能否成功。 不要将权重初始值设为 0 权值衰减(weight decay):抑制过拟合、提高泛化能…...

sqlalchemy库详细使用

SQLAlchemy 是 Python 中最强大、最受欢迎的 ORM(对象关系映射)库,它允许你使用 Python 对象来操作数据库,而不需要直接编写 SQL 语句。同时,它也提供了对底层 SQL 的完全控制能力,适用于从简单脚本到大型企…...

最短路和拓扑排序知识点

1、在一个有权无向图中,如果顶点b到顶点a的最短路径长度是10,顶点c与顶点b之间存在一条长度为3的边。(c与a的最短路径长度不超过13;c与a的最短路径不小于7) 2、我们用一个有向图来表示航空公司所有航班的航线。最适合…...

【Alist+RaiDrive挂载网盘到本地磁盘】

1.安装准备 安装RaiDrive RaiDrive - 像 USB 驱动器一样安装云存储 安装alist 安装方式请查看官网: AList文档 2.启动Alist(docker) docker官网 Install | Docker EngineDocker Desktop | Docker Docs 运行容器 docker run -d --restartalways -v /home/alist:/opt/alist/…...

达梦数据库 【-6111: 字符串转换出错】问题处理

达梦数据库 【-6111: 字符串转换出错】问题处理 问题背景问题分析问题总结 问题背景 今天在更新数据库某一个值属性的时候,执行更新语句报错提示 -6111: 字符串转换出错,但是自己检查了sql语句,只是一个简单的sql,并没有需要字符…...

Java的多线程笔记

创建一个线程的方法有多种,比如可以继承Thread类或者实现Runnable接口,结论是实现Runnable接口比前者更加优越。 二者代码对比 Java 不支持多继承,如果你继承了 Thread 类,就不能再继承其他类,实现 Runnable 接口后&am…...

学习51单片机01(安装开发环境)

新学期新相貌.......哈哈哈,我终于把贪吃蛇结束了,现在我们来学stc51单片机! 要求:c语言的程度至少要到函数,指针尽量!如果c语言不好的,可以回去看看我的c语言笔记。 1.开发环境的安装&#x…...

互联网协议的多路复用、Linux系统的I/O模式

目录 1. 互联网协议栈-多路复用 1.1. 应用层的多路复用 2.2. 传输层的多路复用 3.3. 网络层的多路复用 2. Linux系统的I/O模式 2.1. I/O 2.2. Socket 2.3. 从网卡到操作系统 2.4. Socket 编程模型 2.5. I/O多路复用 2.6. 阻塞/非阻塞、同步/异步 2.7. Question 1. …...

vue中,created和mounted两个钩子之间调用时差值受什么影响

在 Vue 中,created 和 mounted 是两个生命周期钩子,它们之间的调用时差主要受以下几个因素影响: 🟢 1. 模板复杂度与渲染耗时(最主要因素) mounted 的触发时间是在组件的 DOM 被挂载之后(也就是…...

软件设计师考试《综合知识》计算机编码考点分析——会更新软设所有知识点的考情分析,求个三连

2019-2023年真题深度解析与备考策略 分值占比分析 75分中编码相关分值分布与核心考点 年份编码相关题量分值占总分比例核心考点20232题2分2.67%补码表示范围、IEEE 754偏移量20223题3分4.00%原码/反码比较、浮点数规格化20211题1分1.33%补码表示-1的能力20202题2分2.67%移码…...

剖析提示词工程中的递归提示

递归提示:解码AI交互的本质,构建复杂推理链 递归提示的核心思想,正如示例所示,是将一个复杂任务分解为一系列更小、更易于管理、逻辑上前后关联的子任务。每个子任务由一个独立的提示来驱动,而前一个提示的输出(经过必要的解析和转换)则成为下一个提示的关键输入。这种…...

【SSL证书系列】https双向认证中客户端认证的原理

HTTPS双向认证(也称为双向SSL/TLS认证)是一种增强安全性的机制,其中客户端和服务器都需要验证彼此的数字证书,以确保双方身份的真实性。以下是其核心原理和步骤的详细解析: 一、双向认证的核心目标 双向身份验证&#…...

map格式可以接收返回 fastjson2格式的数据 而不需要显示的转换

Fastjson2 JSONObject 与 Map 的关系 Fastjson2 的 JSONObject 类定义如下&#xff1a; public class JSONObject extends JSON implements Map<String, Object>, Cloneable {// 实现了 Map 接口的所有方法&#xff08;put、get、keySet 等&#xff09; }解释&#xff…...

NHANES稀有指标推荐:PWI

文章题目&#xff1a;Association between plain water intake and the risk of osteoporosis among middle-aged and elderly people in the United States: a cross-sectional study DOI&#xff1a;10.3389/fnut.2025.1527771 中文标题&#xff1a;美国中老年人白开水摄入与…...

CN 第二章 应用层-单选题

非并行TCP连接 HTTP非持续连接 假定在同一Web服务器上的某HTML文件引用了3个非常小的对象&#xff08;例如图片&#xff09;。忽略传输时延&#xff0c;往返时延为RTT&#xff0c;不考虑连接释放时间&#xff0c;采用非并行TCP连接的HTTP非持续连接方式将该页面完整接收下来需…...

游戏引擎学习第279天:将实体存储移入世界区块

黑板讲解&#xff1a;为什么使用SOA&#xff08;结构体数组&#xff09;而不是AOS&#xff08;数组结构体&#xff09;来构建实体系统 我们在构建游戏实体系统时&#xff0c;探讨了使用结构体数组&#xff08;SOA, Struct of Arrays&#xff09;而不是结构体组成的数组&#x…...

zabbix7.2最新版本 nginx自定义监控(三) 设置触发器

安装zabbix-get服务 在zabbix-server端口安装zabbix-get服务 [rootlocalhost ~]# dnf install -y zabbix-get Last metadata expiration check: 1:55:49 ago on Wed 14 May 2025 09:24:49 AM CST. Dependencies resolved. Package Architectur…...

解密企业级大模型智能体Agentic AI 关键技术:MCP、A2A、Reasoning LLMs- OpenAI AGI 五阶段

解密企业级大模型智能体Agentic AI 关键技术:MCP、A2A、Reasoning LLMs- OpenAI AGI 五阶段 然后第三个阶段就是agent,注意这里面的agent和我们说应用程序开发的这个agent是一个不同的概念。AI just can take actions autonomously自动的去执行一些动作。但大家像今天我们看到…...

Flink实时统计任务CPU异常排查与解决方案

一、核心原因分析 ‌资源配置不合理‌ ‌CPU核数与并行度不匹配‌:TaskManager的taskmanager.numberOfTaskSlots设置过高,导致单个节点负载过载(如32核节点设置2个slot被多个任务占用,总需求超过物理CPU核数)。‌内存与CPU分配不均‌:内存不足引发频繁GC,间接导致CPU利…...

Vue3指令(二)--v-text、v-html数据渲染,计算属性

目录 &#xff08;一&#xff09;数据渲染 1.插值表达式渲染数据 1.1实战案例 1.1.1代码&#xff1a; 1.1.2实现截图&#xff1a; 2.使用v-text和v-html来渲染数据 2.1实战案例&#xff1a; 2.1.1代码&#xff1a; 2.1.2实现截图&#xff1a; &#xff08;二&#xff…...

【深入Spring系列】源码级深入剖析SpringBoot如何实现自动装载

1. SpringBoot自动装载 Spring Boot 实现“自动装载”&#xff08;Auto Configuration&#xff09;是其最核心、最强大的功能之一&#xff0c;使得开发者可以快速搭建项目而无需进行复杂的 XML 配置。这一机制的底层实现主要依赖于 Spring Framework 的条件注解机制 和 Spring…...

【AI News | 20250514】每日AI进展

AI Repos 1、ocr-workbench OCR Workbench 是一款使用 AI&#xff08;Gemini 或 Tesseract&#xff09;进行文档光学字符识别&#xff08;OCR&#xff09;并生成 Markdown 或 HTML 转录的开源 Web 应用。它专为处理需要大量编辑的 OCR 文本而设计&#xff0c;特别是老旧文档。…...

嵌入式设计模式基础--C语言的继承封装与多态

继承&#xff0c;封装和多态是OOP的三大核心特性&#xff0c;它们共同构了面向对象的基础.但嵌入式开发中大量的使用到的却是C语言这种面向过程的语言&#xff0c;那么我们就需要了解如何在C中使用设计模式的思想做功能开发。要了解设计模式&#xff0c;我们就需要先搞清楚 继承…...

【python爬虫】python+selenium实现Google Play Store应用信息爬虫+apk下载

实验要求&#xff1a;利用pythonselenium实现Google Play Store应用信息爬虫apk下载。 其中&#xff1a; 1、热门应用列表包含200个app&#xff0c;需要点击右侧按钮滑动产生下一页数据&#xff0c;所以需要Selenium来控制页面操作。 2、每个应用的爬虫信息包括&#xff1a;ap…...

RPC协议及库介绍

一.RPC介绍 RPC(Remote Procedure Call)&#xff0c;远程过程调用协议&#xff0c;客户端在不知道调用细节的情况下&#xff0c;调用存在于远程计算机上的某个对象&#xff0c;就像调用本地应用程序中的对象一样&#xff0c;即允许像调用本地服务一样调用远程服务。 RPC框架的…...

【教程】Docker更换存储位置

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 目录 背景说明 更换教程 1. 停止 Docker 服务 2. 创建新的存储目录 3. 编辑 Docker 配置文件 4. 迁移已有数据到新位置 5. 启动 Docker 服务 6…...

vue3实现JSON格式化和JSONPath提取功能

功能简介 1、JSON数据的格式化 2、通过JSONPath语法对格式化后的数据匹配提取 基础环境参考 vue3flasksqlite前后端项目实战 包安装 npm install jsonpath src/views/JsonFormat.vue <template><div class"json-formatter-container"><el-card cla…...

【springcloud学习(dalston.sr1)】服务消费者通过restTemplate来访问服务提供者(含源代码)(五)

该系列项目整体介绍及源代码请参照前面写的一篇文章​​​​​​【springcloud学习(dalston.sr1)】项目整体介绍&#xff08;含源代码&#xff09;&#xff08;一&#xff09; 一般情况下&#xff0c;我们远程调用服务&#xff0c;可以用restTemplate来进行http请求的访问。接…...

在 Angular 中, `if...else if...else`

在 Angular 中&#xff0c;模板语法本身并不直接支持 if...else if...else 这样的多条件分支结构。不过&#xff0c;你可以通过使用 *ngIf 指令结合其else模板功能来实现类似的效果。下面是如何模拟if...else if...else逻辑的方法&#xff1a; 示例&#xff1a;实现if...else …...

深入掌握 Python 切片操作:解锁数据处理的高效密码

在 Python 的编程宇宙中&#xff0c;每一个开发者都在不断探索各种强大且实用的工具&#xff0c;以提升代码的效率与灵活性。其中&#xff0c;切片操作作为 Python 数据处理领域的核心技能之一&#xff0c;就像是一把精巧的瑞士军刀&#xff0c;无论是处理文本信息、分析数据列…...

基于 Kubernetes 部署容器平台kubesphere

一 前言&#xff1a; k8s 大家都已经非常熟悉了&#xff0c;网上流传着非常多的搭建部署文档&#xff0c;有kubeadmin的有二进制的&#xff0c;还有基于第三方的部署工具的&#xff0c;反正是各种部署方法都有&#xff0c;k8s部署技术热门可见一斑。但是不管哪种部署都需要了解…...

lua 作为嵌入式设备的配置语言

从lua的脚本中获取数据 lua中栈的索引 3 | -1 2 | -2 1 | -3 可以在lua的解释器中加入自己自定的一些功能,其实没啥必要,就是为了可以练习下lua...