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

详解零拷贝

目录

一、用户态(User Mode)和内核态(Kernel Mode) 

1.1 用户态 (User Mode):

1.2 内核态 (Kernel Mode):

1.3 关键交互:系统调用 (System Call)

二、为什么需要区分用户态和内核态?

三、为什么需要零拷贝?传统 I/O 的瓶颈

3.1 传统方式 (read + write):

3.2 传统方式的代价总结:

四、零拷贝如何解决?核心思想:绕过用户空间

4.1 主要实现技术:

mmap() + write():

sendfile() (Linux 2.1+):

sendfile() with DMA Scatter/Gather (Linux 2.4+):

splice() (Linux 2.6.17+):

4.2 回到零拷贝的例子:

4.3 零拷贝的优势总结:

4.4 应用场景:

4.5 零拷贝在编程语言中的应用示例:

4.6 重要注意事项:

五、总结


一、用户态(User Mode)内核态(Kernel Mode) 

        理解 内核态(Kernel Mode) 和 用户态(User Mode) 是掌握操作系统工作原理(包括零拷贝)的基础。它们本质上是 CPU 运行时的两种不同权限级别,目的是为了保护系统的稳定性和安全性。

可以把它们想象成一个高度戒备的公司:

1.1 用户态 (User Mode):

  • 身份: 普通员工。

  • 权限: 受限!

    • 只能访问自己办公桌(用户空间内存)。

    • 只能使用公司提供的公共文具(有限的 CPU 指令集)。

    • 不能直接操作保险柜(硬件设备,如磁盘、网卡)、不能查看其他员工的机密文件、不能修改公司核心规章制度(操作系统内核代码和数据结构)。

  • 目的: 运行应用程序代码(你写的程序、浏览器、游戏等)。限制权限是为了防止一个程序出错或恶意程序破坏整个系统、窃取数据或干扰其他程序。

  • 稳定性: 如果普通员工(用户态程序)犯了错(比如程序崩溃),通常只会影响它自己(最多影响同部门的程序),不会让整个公司(操作系统)垮掉。操作系统可以终止这个程序。

  • 速度: 执行应用程序自身的代码很快。

1.2 内核态 (Kernel Mode):

  • 身份: 公司最高权限的管理员/保安主管/核心工程师。

  • 权限: 至高无上!

    • 可以访问公司所有区域,包括普通员工的工位(用户空间)和核心机房(内核空间内存)。

    • 可以使用所有工具和设备全部的 CPU 指令集)。

    • 可以直接操作保险柜、金库、门禁系统(所有硬件资源)。

    • 可以修改公司核心运作流程(操作系统内核的代码和关键数据结构)。

  • 目的: 运行操作系统内核的代码。负责管理硬件、内存、进程调度、文件系统、网络通信等最核心、最底层、最敏感的任务。

  • 稳定性: 内核态代码必须极其可靠。如果内核态代码出错(内核崩溃),通常意味着整个公司(操作系统)完蛋了,会导致 “蓝屏死机” 或 “Kernel Panic”

  • 速度: 执行内核代码本身也很快,但进出内核态有开销

1.3 关键交互:系统调用 (System Call)

  • 普通员工(用户态程序)没有权限直接操作硬件或访问核心资源。

  • 当员工需要做一件超出自己权限的事情时(比如申请使用特殊打印机、访问机密文件、发送网络请求),他必须填写申请表(发起系统调用)

  • 这个申请表会被送到管理员(内核)那里审批和处理。

  • 切换过程:

    • 员工(用户态程序)调用一个特殊的函数(如 read()write()open()sendfile()),这就是系统调用

    • CPU 收到一个特殊的中断信号

    • CPU 保存当前员工的工作现场(程序计数器、寄存器状态等)。

    • CPU 切换到管理员模式(内核态),并跳转到内核中处理该系统调用的特定代码。

    • 内核管理员执行请求的操作(如读取磁盘数据、发送网络包)。此时拥有全部权限。

    • 操作完成后,内核将结果(成功/失败/数据)返回

    • CPU 切换回员工模式(用户态)

    • CPU 恢复员工之前的工作现场

    • 用户态程序收到结果,继续执行。

        这个“填申请表-审批-执行-返回结果”的过程,就是一次从用户态到内核态再回到用户态的切换。每次切换都需要保存状态、切换权限、恢复状态,是有一定时间开销的!

特性用户态 (User Mode)内核态 (Kernel Mode)
运行代码应用程序代码操作系统内核代码
权限低 (受限)高 (完全)
访问内存只能访问用户空间可访问整个内存空间 (用户+内核)
访问硬件禁止直接访问允许直接访问
稳定性崩溃只影响自身崩溃导致整个系统崩溃
目的执行应用程序逻辑管理系统资源、硬件、提供核心服务
进入方式程序启动默认状态 / 从内核态返回发生中断/异常 / 执行系统调用
开销运行应用代码快运行内核代码快,但切换进来/出去慢

二、为什么需要区分用户态和内核态?

  • 安全性: 防止恶意或错误的应用程序直接破坏硬件、窃取其他程序的数据、或使整个系统崩溃。

  • 稳定性: 将关键的内核代码与不可靠的应用程序代码隔离。一个应用程序崩溃不会导致操作系统崩溃。

  • 抽象性: 为用户程序提供统一、简单的接口(系统调用)来使用复杂的硬件资源,无需关心底层细节。

  • 资源管理: 内核作为仲裁者,公平、有效地管理CPU、内存、磁盘、网络等资源,防止程序之间互相争抢。

三、为什么需要零拷贝?传统 I/O 的瓶颈

想象一下一个常见的场景:通过网络将服务器磁盘上的一个文件发送给客户端。

3.1 传统方式 (read + write):

步骤 1 (read): 应用程序调用 read() 系统调用,请求从磁盘读取文件数据。

  • 上下文切换 (用户态 -> 内核态): CPU 从用户应用程序切换到内核模式。

  • DMA 拷贝 1 (磁盘 -> 内核缓冲区): 磁盘控制器使用 DMA (Direct Memory Access) 技术,无需 CPU 参与,直接将数据从磁盘读取到内核空间的页缓存 (Page Cache) 中。

  • CPU 拷贝 1 (内核缓冲区 -> 用户缓冲区): CPU 介入,将数据从内核空间的页缓存拷贝到用户空间应用程序指定的缓冲区。

  • 上下文切换 (内核态 -> 用户态): CPU 切换回用户模式,read() 调用返回。

步骤 2 (write): 应用程序处理完数据(可能没有处理),调用 write() 系统调用,请求将用户缓冲区的数据发送到网络套接字。

  • 上下文切换 (用户态 -> 内核态): 再次切换到内核模式。

  • CPU 拷贝 2 (用户缓冲区 -> 内核缓冲区): CPU 再次介入,将数据从用户空间的应用程序缓冲区拷贝到内核空间中与网络套接字关联的缓冲区 (Socket Buffer)。

  • DMA 拷贝 2 (内核缓冲区 -> 网卡): 网卡控制器使用 DMA,无需 CPU 参与,将数据从 Socket Buffer 拷贝到其自身的缓冲区,准备发送。

  • 上下文切换 (内核态 -> 用户态): 切换回用户模式,write() 调用返回。

3.2 传统方式的代价总结:

  • 4 次上下文切换: read() 调用和返回各 1 次,write() 调用和返回各 1 次。上下文切换开销不小。

  • 4 次数据拷贝:

    • 2 次 DMA 拷贝(磁盘->Page Cache, Socket Buffer->网卡):高效,不消耗 CPU。

    • 2 次 CPU 拷贝(Page Cache->用户缓冲区, 用户缓冲区->Socket Buffer):这是主要瓶颈! 消耗宝贵的 CPU 周期和内存带宽,尤其是处理大文件时。数据在用户空间和内核空间来回“旅游”是多余的。

四、零拷贝如何解决?核心思想:绕过用户空间

        零拷贝技术的核心在于避免将数据从内核空间拷贝到用户空间(应用程序缓冲区),让数据在内核空间内部流动,或者直接从内核空间传输到目标设备(如网卡)。

4.1 主要实现技术:

  • mmap() + write()
    • 原理: 使用 mmap() 系统调用将内核空间的页缓存 (Page Cache映射到用户进程的虚拟地址空间。应用程序可以直接通过指针操作这段内存,就像操作自己的缓冲区一样。

    • 传输过程 (简化):

      • 应用程序调用 mmap(),将文件映射到用户虚拟地址空间的一块区域。

      • 磁盘数据通过 DMA 加载到 Page Cache (内核空间)。

      • 应用程序通过映射的指针访问数据(此时发生缺页中断,建立物理映射,但没有数据拷贝到单独的用户缓冲区)。

      • 应用程序调用 write() 发送数据。

      • CPU 将数据从映射区域(本质还是 Page Cache)拷贝到 Socket Buffer (内核空间)。

      • 网卡通过 DMA 将 Socket Buffer 的数据发送出去。

    • 改进:

      • 减少了 1 次 CPU 拷贝:避免了 Page Cache -> 用户缓冲区的拷贝。

      • 仍有 4 次上下文切换和 1 次 CPU 拷贝 (Page Cache -> Socket Buffer)。

      • 内存映射本身有开销(建立/解除映射、管理页表、缺页中断),对小文件可能不划算。

  • sendfile() (Linux 2.1+):
    • 原理: 一个系统调用完成数据从文件描述符(通常是文件)到另一个文件描述符(通常是套接字)的传输,整个过程在内核中完成。

    • 传输过程 (早期版本):

      • 应用程序调用 sendfile(out_fd, in_fd, offset, count)

      • 上下文切换到内核态。

      • DMA 将磁盘数据拷贝到 Page Cache。

      • CPU 将数据从 Page Cache 拷贝到 Socket Buffer。

      • DMA 将数据从 Socket Buffer 拷贝到网卡。

      • 上下文切换回用户态。

    • 改进 (相比 mmap + write):

      • 减少了 1 次系统调用和 2 次上下文切换(只有 sendfile 调用和返回)。

      • 仍有 1 次 CPU 拷贝 (Page Cache -> Socket Buffer)。

  • sendfile() with DMA Scatter/Gather (Linux 2.4+):
    • 原理: 一个系统调用完成数据从文件描述符(通常是文件)到另一个文件描述符(通常是套接字)的传输,整个过程在内核中完成。
    • 传输过程 (早期版本):

      • 应用程序调用 sendfile(out_fd, in_fd, offset, count)

      • 上下文切换到内核态。

      • DMA 将磁盘数据拷贝到 Page Cache。

      • CPU 将数据从 Page Cache 拷贝到 Socket Buffer。

      • DMA 将数据从 Socket Buffer 拷贝到网卡。

      • 上下文切换回用户态。

    • 改进 (相比 mmap + write):

      • 减少了 1 次系统调用和 2 次上下文切换(只有 sendfile 调用和返回)。

      • 仍有 1 次 CPU 拷贝 (Page Cache -> Socket Buffer)。

  • sendfile() with DMA Scatter/Gather (Linux 2.4+):

    • 原理: 这是真正的“零拷贝”优化。利用支持 Scatter/Gather 功能的 DMA 引擎。

    • 传输过程:

      • 应用程序调用 sendfile(out_fd, in_fd, offset, count)

      • 上下文切换到内核态。

      • DMA 将磁盘数据拷贝到 Page Cache。

      • 内核将数据在 Page Cache 中的位置信息(内存地址和偏移量) 描述符填充到 Socket Buffer,不拷贝数据本身

      • DMA 引擎根据 Socket Buffer 中的描述符信息,使用 Scatter/Gather 操作,直接从 Page Cache 的多个位置将数据收集并传输到网卡。

      • 上下文切换回用户态。

    • 关键改进:

      • 完全消除了 CPU 拷贝! 数据在内核空间只有 DMA 操作。

      • 只有 2 次上下文切换(sendfile 调用和返回)。

      • 只有 2 次 DMA 拷贝(磁盘->Page Cache, Page Cache->网卡)。

      • 这是性能最高的零拷贝实现。

  • splice() (Linux 2.6.17+):
    • 原理: 在内核空间的两个文件描述符之间移动数据,不需要数据经过用户空间。它利用了一个管道 (pipe) 作为中间载体,但数据实际上并不需要拷贝到管道缓冲区,而是通过操作内核页表实现数据在内核缓冲区间的高效移动。

    • 特点: 更灵活,可以在任意两个文件描述符间移动数据(如文件到文件、文件到套接字、套接字到套接字)。实现真正的零拷贝也依赖于底层 DMA 和缓冲区管理。

4.2 回到零拷贝的例子:

  • 在传统文件传输 (read + write) 中:

    • 调用 read(): 用户态 -> 内核态 (切换1) -> 内核读数据到页缓存 -> 内核态 -> 用户态 (切换2) -> 数据拷贝到用户缓冲区。

    • 调用 write(): 用户态 -> 内核态 (切换3) -> 数据从用户缓冲区拷贝到Socket缓冲区 -> 内核态 -> 用户态 (切换4)。

    • 共4次上下文切换!

  • 在使用 sendfile() 零拷贝时:

    • 调用 sendfile(): 用户态 -> 内核态 (切换1) -> 内核内部完成所有操作(数据从磁盘->页缓存->(可能拷贝到Socket Buffer)->网卡) -> 内核态 -> 用户态 (切换2)。

    • 只有2次上下文切换!

4.3 零拷贝的优势总结:

  • 大幅减少 CPU 使用率: 消除了昂贵的 CPU 拷贝操作,释放 CPU 资源处理其他任务。

  • 降低内存带宽压力: 减少不必要的数据搬运,节省宝贵的内存带宽。

  • 减少上下文切换次数: 更少的系统调用意味着更少的用户态/内核态切换开销。

  • 显著提升吞吐量: 尤其在大文件传输和高并发网络服务(如静态文件服务器、消息队列、数据库)中效果惊人。

  • 降低延迟: 更少的数据路径步骤通常意味着更低的传输延迟。

4.4 应用场景:

  • 网络文件传输: Web 服务器 (Nginx, Apache) 发送静态文件。

  • 消息中间件: Kafka, RocketMQ 等高性能消息队列的消息持久化和网络传输。

  • 数据库系统: 日志文件 (Write-Ahead Log) 的写入和数据页的加载。

  • 视频/图片服务器: 流媒体传输,大文件下载。

  • 高性能网络编程: 需要极致吞吐量的网络应用。

4.5 零拷贝在编程语言中的应用示例:

  • Java: FileChannel.transferTo() / transferFrom() 方法底层通常使用 sendfile() 或等效机制。

  • Go: io.Copy() 在源是 *os.File 且目标是 net.TCPConn 等情况下,会尝试使用 sendfile()

  • C/C++: 直接调用 sendfile() 系统调用。

4.6 重要注意事项:

  • 并非所有场景都适用: 如果应用程序确实需要处理数据内容(如解密、压缩、修改),数据还是需要拷贝到用户空间,此时零拷贝无法完全避免拷贝。

  • 硬件依赖: 真正的零拷贝 (DMA Scatter/Gather) 需要网卡等硬件支持。

  • 内核版本: 不同内核版本支持的零拷贝特性(如 sendfile 的范围、splice 的可用性)可能不同。

  • 小文件开销: 对于非常小的文件,零拷贝技术(尤其是 mmap)的固定开销(系统调用、内存映射建立)可能抵消其收益,甚至不如传统方式快。需要根据实际情况测试。

五、总结

        零拷贝是一种革命性的 I/O 优化技术,它通过避免数据在内核空间和用户空间之间不必要的来回拷贝,充分利用 DMA 和内核缓冲区管理,显著降低了数据传输过程中的 CPU 开销、内存带宽压力和上下文切换次数。理解 mmapsendfile (特别是带 Scatter/Gather), splice 等系统调用的工作原理,是掌握和应用零拷贝的关键。在高性能网络服务和文件处理领域,零拷贝已成为提升吞吐量和效率不可或缺的手段。

相关文章:

详解零拷贝

目录 一、用户态(User Mode)和内核态(Kernel Mode) 1.1 用户态 (User Mode): 1.2 内核态 (Kernel Mode): 1.3 关键交互:系统调用 (System Call) 二、为什么需要区分用户态和内核态&#x…...

微服务常用的基础知识

1.微服务介绍 1.1 产生背景 随着互联网的发展,网站应用的规模不断扩大,传统单体架构逐渐难以应对大型网站高并发、高扩展性等需求,于是分布式系统架构应运而生。Spring Cloud 就是在这种背景下诞生的,它利用 Spring Boot 的开发便…...

【开源工具】Windows一键配置防火墙阻止策略(禁止应用联网)| 附完整Python源码

🛡️【开源工具】Windows一键配置防火墙阻止策略(禁止应用联网)| 附完整源码 🌈 个人主页:创客白泽 - CSDN博客 🔥 系列专栏:🐍《Python开源项目实战》 💡 热爱不止于代码,热情源自每一个灵感闪现的夜晚。愿以开源之火,点亮前行之路。 🐋 希望大家多多支持,…...

6月份最新代发考试战报:思科华为HCIP HCSE 考试通过

6月份最新代发考试战报:思科华为HCIP HCSE 考试通过 H19-423 HCSA-Presales-IP Network 数通考试通过, H12-725 HCIP-Security安全 考试通过,H13-121 HCIP-Kunpeng Application Developer鲲鹏计算 考试通过,CCNP 350-401考试通过…...

本地部署开源时间跟踪工具 Kimai 并实现外部访问( Windows 版本)

Kimai 是一款开源的时间跟踪工具,它易于使用,并提供了强大的报告功能,在个人和团队记录工作时间、项目时间和活动时间等之后可以帮助用户了解他们是如何花费时间的,从而提高生产力和效率。本文将详细介绍如何在 Windows 系统本地部…...

SpringBoot 中 @Transactional 的使用

SpringBoot 中 Transactional 的使用 一、Transactional 的基本使用二、Transactional 的核心属性三、使用避坑(失效场景)3.1 自调用问题3.2 异常处理不当3.3 类未被 Spring 管理3.4 异步方法内使用失效 四、工作实践4.1 事务提交之后执行一些操作4.2 事…...

Mac电脑安装iTerm2通过rz命令上传文件到远程服务器

背景 闲着没事买了个云服务器玩(京东云轻量云主机),Mac本地搞了个java的jar包,想上传到云服务器,通过scp命令在Mac自带的【终端】上怎么都上传不了,如图。但是通过ssh命令(ssh root主机IP &…...

供应链数据可视化大屏

在全球化与数字化转型的双重浪潮下,供应链管理正面临前所未有的挑战:黑天鹅事件频发、多环节协同效率低下、库存与成本难以平衡……如何让供应链更透明、更敏捷、更具韧性?供应链数据可视化大屏应运而生,成为企业破解管理痛点的关…...

A2O MAY登上央视《中国音乐TOP榜》舞台,展现新歌榜冠军实力

——A2O MAY凭借新歌《BOSS》登上中国QQ音乐新歌榜冠军后,成功出演CCTV音乐节目《中国音乐TOP榜》,以实力赢得瞩目。 由A2O Entertainment(以下简称A2O)推出的全球女团 A2O MAY(成员包括朱晨予CHENYU、李诗洁SHIJIE、…...

关于如何在 Git 中切换到之前创建的分支的方法

文章目录 关于如何在 Git 中切换到之前创建的分支的方法一、确保你在项目目录中二、查看所有分支(可选)三、切换到目标分支四、如果分支仅在远程存在五、验证是否切换成功六、常见问题处理七、总结命令流程 PS:下次进入分支时,只需完成步骤1 …...

vue3+element-plus 组件功能实现 上传功能

一、整体功能概述 这段代码实现了一个基于 Vue 3 和 Element Plus 组件库的文件导入及预览功能模块。主要包含了一个主导入对话框(用于上传文件、展示文件相关信息、进行导入操作等)以及一个用于预览文件内容的预览对话框。支持导入特定格式(…...

多相机人脸扫描设备如何助力高效打造数字教育孪生体?

在教育数字化转型浪潮中,数字孪生体作为现实教育场景的虚拟映射,正成为智慧教育发展的关键技术支点。传统教育模式面临师资资源分布不均、个性化教学难以覆盖、跨时空教学场景受限等痛点,而数字孪生体通过构建高仿真虚拟教育主体(…...

高中成绩可视化平台开发笔记

高中成绩可视化平台(1) 一、项目概述 本系统是一个基于 PyQt5 和 Matplotlib 的高中成绩数据可视化分析平台,旨在帮助教师快速了解学生成绩分布、班级对比、学科表现等关键指标。平台支持文科与理科的数据切换,并提供多个维度的图…...

圆周期性显示和消失——瞬态实现(CAD c#二次开发、插件定制)

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Timers; [assembly: CommandClass(typeof(IfoxDemo.Commands))] namespace IfoxDemo {// 新增的圆形闪烁命令实…...

Spark SQL to_json 函数介绍

目录 前言函数介绍参数说明示例 前言 在Apache Hive中,并没有内置的to_json函数。在Apache Spark SQL中确实有to_json函数,它可以用来将结构化数据(如结构化类型或MAP类型)转换为JSON字符串。这个功能对于需要将表格数据输出为JSON格式的场景…...

5个免费的硬盘分区工具,操作简单功能全

电脑用久了,系统盘空间告急、数据盘混乱无序,很多人想重新分区,却又担心太复杂或怕搞坏硬盘。其实,只要用对工具,分区操作其实一点都不难。更重要的是,有很多免费的分区软件,不仅好用&#xff0…...

uniapp事件onLoad区分大小写

区分大小写。不然会不起作用。onLoad方法中的功能均不会被执行。 除了功能逻辑要检查外。大小写是要认真检查的一部分...

Flutter Riverpod 使用详细解析

📚 Flutter 状态管理系列文章目录 Flutter 状态管理(setState、InheritedWidget、 Provider 、Riverpod、 BLoC / Cubit、 GetX 、MobX 、Redux) setState() 使用详解:原理及注意事项 InheritedWidget 组件使用及原理 Flutter 中 Provider 的使用、注…...

算法打卡 day4

4 . 高精度算法 性质:数组或者容器从低位往高位依次存储大整数,方便进位。 4.1 高精度加法 给定两个正整数(不含前导 0),计算它们的和。 输入格式 共两行,每行包含一个整数。 输出格式 共一行,…...

权威认证!华宇TAS应用中间件荣获CCRC“中间件产品安全认证”

近日,华宇TAS应用中间件顺利通过了中国网络安全审查认证和市场监管大数据中心(CCRC)的信息安全认证,获得了IT产品信息安全认证证书。此次获证,标志着华宇TAS应用中间件在安全性、可靠性及合规性等方面达到行业领先水平,可以为政企…...

【Linux网络编程】多路转接IO(二)epoll

目录 epoll初识 epoll的相关系统调用 epoll的工作原理 epoll的优点 epoll的工作方式 水平触发 Level Triggered 工作模式 边缘触发 Edge Triggered 工作模式 对比LT和ET 理解 ET 模式和非阻塞文件描述符 epoll的惊群问题 基于LT模式的epoll代码样例 epoll初识 按照man…...

flutter的包管理#资源管理#调试Flutter应用#Flutter异常捕获

2.5 包管理 2.5.1 简介 在软件开发中,很多时候有一些公共的库或 SDK 可能会被很多项目用到,因此,将这些代码单独抽到一个独立模块,然后哪个项目需要使用时再直接集成这个模块,便可大大提高开发效率。很多编程语言或开…...

Unity Netcode自定义数据传输——结构体及其序列化

在 Unity Netcode 中,要实现自定义数据的网络传输,确实需要两个关键部分: ✅ 两个必需组件: 数据结构定义 public struct PlayerState : INetworkSerializable {public int id; // 字段1:玩家IDpublic bool …...

Vue 3 高级编程技巧

Vue 3 高级编程技巧 1. 计算属性 (Computed Properties) 含义&#xff1a;计算属性在依赖变化时会自动更新。以下是一个示例&#xff0c;展示当 firstName 或 lastName 变化时&#xff0c;fullName 也会更新。 实例&#xff1a; <script setup> import { ref, comput…...

GraphQL注入 -- GPN CTF 2025 Real Christmas

part 1 服务器会每段时间禁用已注册的账号,此处存在漏洞 def deactivate_user_graphql(email):graphql_endpoint current_app.config["GRAPHQL_ENDPOINT"]query f"""mutation {{deactivateUser (user: {{email: "{email}"}}){{ success…...

python打卡day43

疏锦行 作业&#xff1a; kaggle找到一个图像数据集&#xff0c;用cnn网络进行训练并且用grad-cam做可视化 进阶&#xff1a;并拆分成多个文件 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms# 数据预处理 tra…...

ethers.js express vue2 定时任务每天凌晨2点监听合约地址数据同步到Mysql整理

下面是一个完整的 Ethers.js Express Vue2 MySQL 实现方案&#xff0c;用于&#xff1a; &#x1f4a1;每天凌晨 2 点监听某合约地址的 Transfer 事件&#xff0c;写入 MySQL 数据库&#xff0c;并展示每日 NFT 交易量图表&#xff08;Vue2 ECharts&#xff09; ✅ 后端部分…...

内网穿透和端口映射的区别在哪?局域网提供互联网访问方案对比选择详解

内网穿透和端口映射是两个经常被提及的概念&#xff0c;它们对于实现网络中的内外网通信起着关键作用。内网穿透和端口映射都能够有效地将本地局域网地址提供给互联网上外网访问&#xff0c;但二者之间存在着显著的区别。 内网穿透与端口映射的核心区别在于实现方式和依赖条件…...

机器学习---正则化、过拟合抑制与特征筛选

专栏:机器学习 个人主页:云端筑梦狮 注&#xff1a;上一篇机器学习还差一小节&#xff0c;日后坑必会填上 一.正则化 什么是正则化 / 如何进行正则化 其实机器学习中正则化&#xff08;regularization&#xff09;的外在形式非常简单&#xff0c;就是在模型的损失函数中加…...

优化 ArcPy 脚本性能

合理设置环境变量 优化环境变量配置 ArcPy 提供了许多环境变量&#xff0c;用于控制地理处理工具的行为。合理设置环境变量可以优化脚本的性能。例如&#xff0c;设置“workspace”环境变量可以指定默认的工作空间&#xff0c;避免在脚本中重复指定工作空间路径。 Python 复制…...

Robyn高性能Web框架系列06:使用WebSocket实现产品智能助理

使用WebSocket实现产品智能助理 WebSocket原理与应用场景Robyn的WebSocket基本使用1、创建WebSocket服务2、侦听WebSocket事件3、向客户端发送消息4、向客户端广播消息5、使用查询参数6、主动关闭连接 示例&#xff1a;简易的产品智能助理1、产品数据部分2、产品信息部分3、智能…...

UDP 缓冲区

UDP 有接收缓冲区&#xff0c;没有发送缓冲区 引申问题 1、为什么没有发送缓冲区&#xff1f; 直接引用原文 “因为 UDP 是不可靠的&#xff0c;它不必保存应用进程的数据拷贝&#xff0c;因此无需一个真正的发送缓冲区” 2、没有发送缓冲区的情况下&#xff0c;sendto 的数…...

物联网与低代码:Node-RED如何赋能工业智能化与纵横智控的创新实践

在数字化浪潮席卷全球的今天&#xff0c;物联网&#xff08;IoT&#xff09;已从概念走向现实&#xff0c;成为连接物理世界与数字世界的关键桥梁。它通过将日常物品、工业设备等“物”嵌入传感器、软件及其他技术&#xff0c;使其能够通过网络相互连接并交换数据&#xff0c;从…...

【甲方安全视角】开源的安全悖论

文章目录 安全的充分必要条件&#xff1a;从「符号化信任」到「验证驱动安全」构建与分发的不可信链条迭代与审计的节奏错位代码透明与攻击面的对等暴露对普通用户的建议选择可信项目与品牌始终通过官方渠道获取软件注意权限与环境安全对“签名请求”、“连接钱包”等敏感操作保…...

GEO生成式引擎优化发展迅猛:热点数智化传播是GEO最佳路径

在人工智能技术浪潮的推动下&#xff0c;GEO生成式引擎优化已跃升为行业技术演进与产业发展相融合的核心赛道。通过系统性梳理其发展脉络&#xff0c;我们可清晰勾勒出技术突破与产业变革交织的演进轨迹&#xff0c;其发展进程包含以下重要节点。 2023年4月&#xff0c;GPT-4发…...

【unity游戏开发——网络】计算机网络中的三种数据管理模型(分散式、集中式、分布式)和三大通信模型(C/S、B/S、P2P)

注意&#xff1a;考虑到热更新的内容比较多&#xff0c;我将热更新的内容分开&#xff0c;并全部整合放在【unity游戏开发——网络】专栏里&#xff0c;感兴趣的小伙伴可以前往逐一查看学习。 文章目录 一、数据管理模型1、分散式 (Decentralized - 各管各的)2、集中式 (Centra…...

MR30分布式 IO在物流堆垛机的应用

在现代物流行业蓬勃发展的浪潮中&#xff0c;物流堆垛机作为自动化仓储系统的核心设备&#xff0c;承担着货物的高效存取与搬运任务。它凭借自动化操作、高精度定位等优势&#xff0c;极大地提升了仓储空间利用率和货物周转效率。然而&#xff0c;随着物流行业的高速发展&#…...

香港维尔利健康科技集团推出AI辅助医学影像训练平台,助力医护人才数字化转型

香港维尔利健康科技集团近日正式发布其自主研发的“AI辅助医学影像训练平台&#xff08;V-MedTrain&#xff09;”&#xff0c;这一创新平台的上线&#xff0c;标志着医学影像教育迈入智能化辅助教学新时代。依托人工智能与大数据分析技术&#xff0c;香港维尔利健康科技集团在…...

2025学年湖北省职业院校技能大赛 “信息安全管理与评估”赛项 样题卷(五)

2025学年湖北省职业院校技能大赛 “信息安全管理与评估”赛项 样题卷&#xff08;五&#xff09; 第二部分&#xff1a;网络安全事件响应、数字取证调查、应用程序安全任务书任务 1&#xff1a;应急响应&#xff08;可以培训有答案&#xff09;任务 2&#xff1a;通信数据分析取…...

基于 Python 的批量文件重命名软件设计与实现

在工作过程中,经常有很多文件,想要对文件名进行批量改名,特此写了一个程序,以实现此功能。 一、批量文件重命名软件设计原理 (一)核心原理阐述 批量文件重命名软件的核心原理在于运用操作系统提供的文件管理功能,借助编程手段达成对文件名称的批量修改。在这个软件里,…...

【深度学习新浪潮】什么是上下文工程?

什么是上下文工程? 上下文工程(Context Engineering) 是指通过设计、优化与大语言模型(LLM)交互时的输入内容(即“上下文”),引导模型生成更符合预期、更精准回答的系统性方法。这里的“上下文”通常包括 提示词(Prompt)、示例(Few-Shot Examples)、历史对话记录、…...

逆向入门(8)汇编篇-rol指令的学习

还是那个题&#xff0c;这回又碰到个循环左移&#xff0c;有挺多操作方法之前都没有系统的学&#xff0c;用到的时候再看看感觉还挺好&#xff0c;不耽误事 0x00 基本介绍 ROL(Rotate Left): 循环左移&#xff0c;它有两个操作数&#xff1a; 第一个操作数是目标操作数&#…...

Fisco Bcos学习 - 开发第一个区块链应用

文章目录 一、前言二、业务场景分析&#xff1a;简易资产管理系统三、智能合约设计与实现3.1 存储结构设计3.2 接口设计3.3 完整合约代码 四、合约编译与Java接口生成五、SDK配置与项目搭建5.1 获取Java工程项目5.2 项目目录结构5.3 引入Web3SDK5.4 证书与配置文件 六、业务开发…...

黑马python(十六)

目录&#xff1a; 1.JSON数据格式的转换 2.pyecharts模块简介 3.pyecharts入门使用 4.数据准备 5.生成折线图 1.JSON数据格式的转换 2.pyecharts模块简介 官方网站&#xff1a; 画廊网站:有更多的图标形式 测试是否安装 3.pyecharts入门使用 运行会生成一个html的文件&a…...

完成国产化替代!昆明卷烟厂用时序数据库 TDengine 重塑工业时序数据平台

小T导读&#xff1a;昆明卷烟厂作为红云红河烟草&#xff08;集团&#xff09;有限责任公司的重要组成部分&#xff0c;是集团卷烟生产的核心工厂。早期在建设制造执行系统&#xff08;MES&#xff09;时&#xff0c;其采用了 Wonderware 平台的时序数据存储功能模块&#xff0…...

50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | BackgroundSlider(背景滑块)

&#x1f4c5; 我们继续 50 个小项目挑战&#xff01;—— BackgroundSlider组件 仓库地址&#xff1a;https://github.com/SunACong/50-vue-projects 项目预览地址&#xff1a;https://50-vue-projects.vercel.app/ 使用 Vue 3 的 Composition API 和 <script setup> …...

Wpf的Binding

前言 wpf的Binding就像一个桥梁&#xff0c;它的作用就是连接逻辑层与界面层&#xff0c;既能够把逻辑层的数据搬到界面层展示&#xff0c;又能将界面层的数据更改后传递到逻辑层&#xff0c;Binding的数据来源就是Binding的源&#xff0c;数据展示的地方就是Binding的目标。 …...

Redis—持久化

持久化 在mysql当中&#xff0c;有4个比较关心的特性&#xff0c;分别是原子性、一致性、隔离性和持久性。这里的持久性和持久化是一回事。我们该如何判断是否具有持久性呢&#xff1f;答案就是看重启进程或者主机之后&#xff0c;数据是否存在。当我们把数据存储在硬盘上是就…...

Spring Boot中日志管理与异常处理

以下是Spring Boot中日志管理与异常处理的系统化实践指南&#xff0c;结合最佳实践与核心配置&#xff0c;确保应用健壮性与可维护性。 &#x1f4ca; 一、日志管理核心配置 默认框架与级别控制 Logback 是Spring Boot默认日志框架&#xff0c;通过application.yml快速配置&…...

基于MATLAB的BP神经网络的心电图分类方法应用

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 心电图&#xff08;ECG&#xff09;是临床诊断心血管疾病的重要工具&#xff0c;能够反映心脏电活动的周期性变化。…...