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

【Linux】五种 IO 模型与非阻塞 IO

🌈 个人主页:Zfox_
🔥 系列专栏:Linux

目录

  • 一:🔥 重新理解 IO
    • 🦋 为什么说网络问题的本质是 I/O 问题?
      • 🎀 从数据流动看网络通信
      • 🎀 网络 I/O 的瓶颈
    • 🦋 如何理解 I/O 的本质?
    • 🦋 什么是高效的 I/O?
      • 🎀 高效 I/O 的目标
      • 🎀 实现高效 I/O 的策略
  • 二:🔥 五种 IO 模型
    • 🦋 生动例子:餐厅点餐
    • 🦋 专业术语介绍
    • 🦋 总结表
  • 三:🔥 思考
    • 🦋 阻塞 vs 非阻塞,非阻塞效率效率一定高吗?
    • 🦋 五种模型中,谁的 I/O 效率最高?
    • 🦋 同步通信 vs 异步通信
  • 四:🔥 非阻塞 IO
    • 🦋 fcntl
    • 🦋 实现函数 SetNonBlock
    • 🦋 非阻塞方式读取标准输入
  • 五:🔥 共勉

一:🔥 重新理解 IO

🦋 为什么说网络问题的本质是 I/O 问题?

🎀 从数据流动看网络通信

  • 网络通信的核心:数据在客户端与服务器之间**双向流动**。
    • 客户端发送请求 → 输出(Write)
    • 服务器接收请求 → 输入(Read)
    • 服务器返回响应 → 输出(Write)
    • 客户端接收响应 → 输入(Read)
  • 每个步骤均涉及 I/O 操作:数据通过网卡、内核缓冲区、用户程序传递,本质是 跨层数据搬运

🎀 网络 I/O 的瓶颈

  • 延迟(Latency):数据从一端到另一端的传输时间(如物理距离、路由跳数)。
  • 带宽(Bandwidth):单位时间内可传输的数据量上限。
  • 并发(Concurrency):同时处理的连接数影响资源分配效率。

总结
网络性能优化的核心是 减少 I/O 等待时间提升 I/O 吞吐量


🦋 如何理解 I/O 的本质?

🔬 IO 就是 input,output,参照物是计算机本身,是计算机系统内部和外部设备进行交互的过程。

IO = 等+拷贝(等是主要矛盾) \colorbox{#FF7F00}{IO = 等+拷贝(等是主要矛盾)} IO = +拷贝(等是主要矛盾)

🐳 等待外部设备就绪,当外部设备准备好了以后,通过 CPU 的针脚发送中断信号告知操作系统。操作系统转入内核态,进行拷贝工作。

  1. 等待(Waiting)等待数据就绪(如网络数据到达内核缓冲区、磁盘数据加载到内存)。
  2. 拷贝(Copying)将数据从内核缓冲区复制到用户空间(或反向)。

高效IO \colorbox{turquoise}{高效IO} 高效IO
上面说的IO=等待+拷贝

在大多数情况下,时间都浪费在等待上面,因为和等待相比,拷贝要花的时间比等待的时间少的多。

  • 高效 IO 的核心减少等待时间的浪费,而非单纯优化拷贝速度。

等待的分类

  • 主动等待:进程阻塞直到数据就绪(如阻塞式 read())。
  • 被动等待:进程通过轮询或事件通知检查状态(如非阻塞 IO + epoll)。

示例

  • 网络请求:客户端等待服务器响应的 RTT(Round-Trip Time)属于被动等待。
  • 数据库查询:从磁盘读取数据时,CPU 因 IO 阻塞而空闲属于主动等待。

🦋 什么是高效的 I/O?

⚡🧙 任何通信场景,IO 通信效率一定是有上限的,毕竟 花盆里长不出参天大树(受硬件限制)

IO效率低 的原因主要有以下几点:

  1. 等待时间:IO操作通常涉及与外部设备的交互,这些设备的速度远低于CPU和内存。例如,硬盘的读写速度比内存慢几个数量级,网络传输的速度也受带宽和延迟的限制。因此,程序在等待IO操作完成时会浪费大量时间。
  2. 上下文切换:在阻塞IO中,操作系统需要将等待IO的进程挂起,并切换到其他进程执行。这种上下文切换会消耗额外的CPU资源,降低整体效率,
  3. 资源竞争:在高并发环境下,多个进程或线程可能同时请求IO操作,导致资源竞争和排队,进一步增加等待时间。

🎀 高效 I/O 的目标

  1. 最大化 CPU 利用率:减少进程因等待 I/O 而阻塞的时间。
  2. 最小化延迟:快速响应每个 I/O 请求。
  3. 最大化吞吐量:单位时间内处理更多 I/O 操作。

🎀 实现高效 I/O 的策略

策略 1:减少阻塞等待

  • 非阻塞 I/O:轮询检查数据是否就绪,避免进程挂起。
    • 代价:频繁轮询可能导致 CPU 空转。
  • 多路复用(如 epoll:单线程监控多个 I/O 事件,仅处理就绪的描述符。
    • 优势:适合高并发网络服务(如 Web 服务器)。

策略 2:批量处理 I/O

  • 缓冲(Buffering):累积多个小数据包后一次性处理,减少系统调用次数。
    • 示例:TCP 协议的 Nagle 算法合并小数据包。

策略 3:异步化与并行化

  • 异步 I/O(如 io_uring:内核全程处理 I/O,完成后通知进程。
  • 多线程/进程:为每个连接分配独立执行单元(但需权衡上下文切换开销)

由于 IO 大部分时间花在了 等待上,因此高效的 IO 本质:单位时间内,等待的比重越低, IO 效率越高 \colorbox{cyan}{由于 IO 大部分时间花在了 等待上,因此高效的 IO 本质:单位时间内,等待的比重越低, IO 效率越高} 由于 IO 大部分时间花在了 等待上,因此高效的 IO 本质:单位时间内,等待的比重越低, IO 效率越高

二:🔥 五种 IO 模型

在了解相关知识之前,我们先来看个例子,方便我们对其的理解

🦋 生动例子:餐厅点餐

角色定义

  • 进程:顾客(发起 I/O 请求的主体)。
  • 文件描述符:订单号(标识一个 I/O 请求)。
  • 数据:顾客点的餐(需要处理的内容)。

1.1 阻塞 I/O

  • 场景
    顾客下单后,一直坐在餐桌前等待,直到服务员端上菜才能做其他事(如玩手机)。
  • 关键点
    • 顾客(进程)在等待期间完全被阻塞。
    • 订单号(文件描述符)对应唯一的请求。

1.2 非阻塞 I/O

  • 场景
    顾客下单后,每隔 5 秒去厨房问一次“我的菜好了吗?”,期间可以喝水、聊天。
  • 关键点
    • 顾客(进程)需要主动轮询状态。
    • 若厨房(内核)回答“没好”,顾客继续做其他事。

1.3 信号驱动 I/O

  • 场景
    顾客下单后,留下手机号给服务员,继续聊天。厨房准备好菜时,服务员打电话通知顾客取餐。
  • 关键点
    • 数据就绪时内核(服务员)通过信号(电话)通知进程(顾客)。
    • 顾客仍需自己从厨房端走菜(同步拷贝数据)。

1.4 多路转接 I/O

  • 场景
    顾客同时点了咖啡和蛋糕,告诉大堂经理“两样都好了叫我”。经理一直监听多个订单,任一就绪时通知顾客。
  • 关键点
    • 一个进程(顾客)通过多路复用接口(经理)监控多个文件描述符(订单)。
    • 仍需顾客自己取餐(同步拷贝数据)。

1.5 异步 I/O

  • 场景
    顾客下单后,继续办公。厨房准备好菜后,服务员直接将菜端到顾客桌上,并说“您的菜齐了”。
  • 关键点
    • 数据准备和端菜(拷贝)全程由内核(服务员)完成。
    • 顾客(进程)无需参与任何等待或操作。

🦋 专业术语介绍

  1. 阻塞 I/O (Blocking I/O)

    • 进程发起 I/O 操作后,立即进入阻塞状态,(在内核将数据准备好之前,系统调用一直等待)直到内核将数据准备好并拷贝到用户空间后,进程才恢复执行。
    • 所有的套接字默认是阻塞方式
    • 同步 I/O:进程全程需要等待数据就绪和拷贝完成。
      在这里插入图片描述
  2. 非阻塞 I/O (Non-blocking I/O)

    • 进程发起 I/O 操作后,内核立即返回一个状态值(未就绪),进程通过轮询(Polling) 反复检查数据是否就绪,期间可以执行其他任务。
    • 如果内核还未将数据准备好, 系统调用仍然会直接返回, 并且返回 EWOULDBLOCK 错误码.
    • 轮询:意指程序员循环的方式反复尝试读写文件描述符。这对 CPU 来说是较大的浪费, 一般只有特定场景下才使用.
    • 同步 I/O:进程需要主动检查数据状态并完成拷贝。
      在这里插入图片描述
  3. 信号驱动 I/O (Signal-driven I/O)

    • 进程发起 I/O 操作后,内核在数据就绪时发送信号(如 SIGIO 通知进程,进程随后执行数据拷贝。
    • 同步 I/O:数据拷贝阶段仍需进程主动完成。
      在这里插入图片描述
  4. 多路转接 I/O (Multiplexing I/O)

    • 进程通过 selectpollepoll 同时监控多个文件描述符,当任一描述符数据就绪时,内核通知进程进行处理。
    • 同步 I/O:数据就绪后仍需进程主动拷贝数据。

在这里插入图片描述

虽然从流程图上看起来和阻塞 IO 类似实际上最核心在于 IO 多路转接 能够同时等待多个文件描述符的就绪状态.

  1. 异步 I/O (Asynchronous I/O)
    • 进程发起 I/O 操作后,内核 全程负责数据准备和拷贝,完成后通过回调(如信号或回调函数)通知进程。
    • 异步 I/O进程无需参与数据准备或拷贝

在这里插入图片描述


🦋 总结表

  • 同步 I/O
    • 阻塞 I/O非阻塞 I/O信号驱动 I/O多路转接 I/O
    • 共同点:数据拷贝阶段需进程主动完成(即使通过信号或轮询触发)。
  • 异步 I/O
    • 数据准备和拷贝全程由内核处理,进程无需参与。
I/O 模型同步/异步例子类比进程角色
阻塞 I/O同步干等上菜全程阻塞
非阻塞 I/O同步轮询询问厨房主动轮询
信号驱动 I/O同步电话通知取餐被动响应信号
多路转接 I/O同步经理监听多个订单批量监听
异步 I/O异步服务员直接端菜到桌完全无需参与

三:🔥 思考

🦋 阻塞 vs 非阻塞,非阻塞效率效率一定高吗?

答案:
不一定,非阻塞 I/O 的效率取决于具体场景。

  • 非阻塞 I/O 的优势
    进程在等待数据就绪期间可以执行其他任务(避免完全阻塞),适合需要同时处理多任务的场景。
    例子:餐厅顾客边等餐边聊天(非阻塞)比干等的顾客(阻塞)更高效。
  • 非阻塞 I/O 的劣势
    如果频繁轮询(如每秒检查 1000 次),会导致 CPU 资源浪费,甚至比阻塞 I/O 效率更低。
    例子:顾客每隔 1 秒就去厨房问一次,导致自己无法专心聊天,服务员也被频繁打扰。

结论

  • 低并发场景:阻塞 I/O 更简单高效(避免轮询开销)。
  • 高并发场景:非阻塞 I/O + 多路复用(如 epoll)效率更高(避免大量线程阻塞)

🦋 五种模型中,谁的 I/O 效率最高?

答案:
异步 I/O(如 Linux 的 io_uring)理论效率最高,但实际中 多路复用 I/O(如 epoll 在同步模型中更常用。

  • 异步 I/O
    • 优势:内核全程处理数据准备和拷贝,进程完全无需等待(服务员直接端菜到桌)。
    • 限制:依赖操作系统和硬件的支持(如 Linux 的异步 I/O 实现复杂)。
  • 多路复用 I/O(epoll
    • 优势:单线程监控大量文件描述符,避免进程/线程频繁切换(大堂经理统一管理订单)。
    • 场景:高并发网络服务器(如 Nginx、Redis)的核心模型。

总结

  • 异步 I/O 理论最优,但实际中多路复用 I/O 因兼容性和成熟度更常用
  • 异步 I/O 的高效主要和其特点无关,还是得依靠程序员自己,而多路复用 I/O 可以用于处理大批网络数据,降低了等的比重

因此总的来说,我们更认为 多路复用的 I/O 效率更高

🦋 同步通信 vs 异步通信

同步 和 异步 关注的是消息通信机制.

  • 所谓同步,就是在发出一个调用时,在没有得到结果之前,该调用就不返回. 但是一旦调用返回,就得到返回值了;
    • 换句话说,就是由调用者主动等待这个调用的结果;
  • 异步则是相反,调用在发出之后,这个调用就直接返回了,所以没有返回结果;
    • 换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果; 而是在调用发出后,被调用者通过状态、通知来通知调用者,或通过回调函数处理这个调用.

另外:之前我们在讲 多进程多线程 的时候,也提到同步和互斥。
注意:这里的同步通信和进程之间的同步是完全不相干的概念.

  • 进程/线程同步 也是进程/线程之间直接的制约关系
  • 是为完成某种任务而建立的两个或多个线程,这个线程需要在某些位置上协调
    他们的工作次序而等待、传递信息所产生的制约关系。尤其是在访问临界资源的时候.

因此以后在看到 “同步” 这个词,一定要先搞清楚大背景是什么。这个同步是同步通信异步通信的同步, 还是同步与互斥的同步

四:🔥 非阻塞 IO

🦋 fcntl

一个文件描述符, 默认都是阻塞 IO.

函数原型如下.

NAMEfcntl - manipulate file descriptorSYNOPSIS#include <unistd.h>#include <fcntl.h>int fcntl(int fd, int cmd, ... /* arg */ );

cmd 是命令,是要操作的类型。主要的操作类型有:

  • 获取,设置文件状态信息:cmd=F_GETFL,F_SETFL。
  • 复制现有的描述符,cmd=F_DUPFD。
  • 获取,设置文件描述符标识, ,cmd=F_GETFD,F_SETFD  \colorbox{pink}{ 获取,设置文件描述符标识, ,cmd=F\_GETFD,F\_SETFD }  获取,设置文件描述符标识cmd=F_GETFDF_SETFD 
  • 获取,设置异步IO所有权,cmd=F_GETOWN,F_SETOWN。
  • 获取、设置记录锁,cmd=F_GETLK,F_SETLK,F_SETLKW。

🧊 我们此处只是用第三种功能, 获取/设置文件状态标记 , 就可以将一个文件描述符设置为非阻塞. 文件状态标志包括 O_APPENDO_NONBLOCK

🦋 实现函数 SetNonBlock

⚙️ 基于 fcntl , 我们实现一个 SetNoBlock 函数, 将文件描述符设置为非阻塞.

#include <unistd.h>
#include <fcntl.h>// 让文件描述符非阻塞
void SetNonBlock(int fd)
{int f1 = fcntl(fd, F_GETFL);if(f1 < 0){perror("fcntl");return ;}fcntl(fd, F_SETFL, f1 | O_NONBLOCK);    //  O_NONBLOCK 让fd 以非阻塞的方式进行工作
}
  • 使用 F_GETFL 将当前的文件描述符的属性取出来 (这是一个位图).
  • 然后再使用 F_SETFL 将文件描述符设置回去. 设置回去的同时, 加上一个 O_NONBLOCK 参数.

🦋 非阻塞方式读取标准输入

#include <iostream>
#include <cstdio>
#include <cerrno>
#include <string>
#include <unistd.h>
#include <fcntl.h>// 让文件描述符非阻塞
void SetNonBlock(int fd)
{int f1 = fcntl(fd, F_GETFL);if(f1 < 0){perror("fcntl");return ;}fcntl(fd, F_SETFL, f1 | O_NONBLOCK);    //  O_NONBLOCK 让fd 以非阻塞的方式进行工作
}int main()
{std::string tips = "Please Enter# ";char buffer[1024];SetNonBlock(0);while(true){write(0, tips.c_str(), tips.size());// 非阻塞,如果我们不做输入,数据不就绪,以出错形式返回!!// read 不是有读取失败(-1)吗?失败vs底层数据没就绪 -> 底层数据没就绪,不算失败// 如果是 -1, 失败vs底层数据没就绪我们后续的做法是不同的!// read -> -1, 失败vs底层数据没就绪 -> 需要区分的必要性的!// errno 表示:更详细的出错原因, 最近一次调用,出错的时候的出错码int n = read(0, buffer, sizeof(buffer));if(n > 0){buffer[n] = 0;std::cout << "echo# " << buffer << std::endl;}else if(n == 0){std::cout << "read file end" << std::endl;break;}else{// EAGAIN		11	/* Try again */// EWOULDBLOCK	EAGAIN	/* Operation would block */if(errno == EAGAIN || errno == EWOULDBLOCK){// 做其他事情呢?std::cout << "底层数据,没有就绪" << std::endl;sleep(1);continue;}else if (errno == EINTR){std::cout << "被中断, 重新来" << std::endl;sleep(1);continue;}else{std::cout << "read error: " << n << ", errno: " << errno << std::endl;}}}return 0;
}

五:🔥 共勉

😋 以上就是我对 【Linux】五种 IO 模型与阻塞 IO 的理解, 觉得这篇博客对你有帮助的,可以点赞收藏关注支持一波~ 😉
在这里插入图片描述

相关文章:

【Linux】五种 IO 模型与非阻塞 IO

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;Linux 目录 一&#xff1a;&#x1f525; 重新理解 IO&#x1f98b; 为什么说网络问题的本质是 I/O 问题&#xff1f;&#x1f380; 从数据流动看网络通信&#x1f380; 网络 I/O 的瓶颈 &#x1f…...

从零开始开发纯血鸿蒙应用之无框截图

从零开始开发纯血鸿蒙应用 〇、前言二、元素定位1、理论依据2、使用指导 三、认识 ComponentSnapshot1、get 方法2、获取 ComponentSnapshot 实例 四、实现组件截图1、掌握图片编码能力2、保存到图库3、实现组件截图 〇、前言 截图&#xff0c;或者说截屏&#xff0c;已经是每…...

【商城实战(36)】UniApp性能飞升秘籍:从渲染到编译的深度优化

【商城实战】专栏重磅来袭&#xff01;这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建&#xff0c;运用 uniapp、Element Plus、SpringBoot 搭建商城框架&#xff0c;到用户、商品、订单等核心模块开发&#xff0c;再到性能优化、安全加固、多端适配&#xf…...

无人自助空间智能管理系统解决方案(深度优化版)

无人自助空间智能管理系统解决方案&#xff08;深度优化版&#xff09; 一、行业痛点与系统价值 传统管理依赖人工&#xff1a; 人工管理模式下&#xff0c;易出现人为失误&#xff0c;如计费错误、资源分配不当等。同时&#xff0c;人工操作效率低下&#xff0c;在高峰时段…...

pycharm配置镜像源【pycharm最新版(23.2.5及以上)方法】

经常遇到pycharm中无法安装或者安装慢的问题&#xff0c;纠结了好久&#xff0c;终于找到这个解决办法了。 为什么要配置镜像源&#xff1a; 因为Python的包管理工具pip一般从PyPI&#xff08;Python Package Index&#xff09;下载安装包&#xff0c;但是PyPI位于国外&#x…...

探索ima.copilot:个人知识库搭建的AI新利器

在信息爆炸的时代&#xff0c;知识的积累与管理成为了个人发展的关键。面对海量的科研文献、工作资料和各类信息&#xff0c;如何高效地构建属于自己的知识体系&#xff0c;是许多人面临的挑战。ima.copilot这款AI工具的出现&#xff0c;为解决这一难题提供了新的思路。它凭借强…...

向量数据库技术系列五-Weaviate介绍

一、前言 Weaviate 是由德国公司 SeMI Technologies 开发的开源向量搜索引擎数据库。它结合了向量搜索和图数据库技术&#xff0c;旨在为 AI 应用提供高效的数据存储和检索能力。具有以下的特点&#xff1a; 高性能向量搜索 Weaviate 支持高效的向量索引和近似最近邻&#x…...

1.Qt SDK 的下载和安装

1Qt 下载官⽹&#xff1a; http://download.qt.io/archive/qt/ 2版本自行选择 3下载对应版本的.exe文件 4下载包下载完成 5双击.exe文件&#xff0c;默认下一步&#xff0c;要注册一个qt的账户 6记住程序安装的位置&#xff0c;后面要配置环境变量 7勾3个&#xff08;组件自行…...

光场中的核心概念:Macro Pixel与SAI的深度解析与实例应用

一、概念详解&#xff1a;从硬件到算法的核心要素 Macro Pixel&#xff08;宏像素&#xff09; Macro Pixel是光场相机的硬件核心单元&#xff0c;由微透镜阵列覆盖的一组传感器子像素构成。每个微透镜对应一个宏像素&#xff0c;其子像素分别记录通过该微透镜不同区域的光线方…...

机器学习(吴恩达)

一, 机器学习 机器学习定义: 计算机能够在没有明确的编程情况下学习 特征: 特征是描述样本的属性或变量&#xff0c;是模型用来学习和预测的基础。如: 房屋面积, 地理位置 标签: 监督学习中需要预测的目标变量&#xff0c;是模型的输出目标。如: 房屋价格 样本: 如: {面积100㎡…...

Ubuntu 20.04 + mysql 8 默认密码问题

问题描述&#xff1a; Ubuntu20.04安装完mysql8之后无法登录&#xff0c;不知道密码 mysql -u root 原因&#xff1a; 系统默认自动配置好了用户和强密码 解决办法&#xff1a; sudo cat /etc/mysql/debian.cnf查看该文件 利用上面的user 和 passwd 即可登录mysql mysql …...

私有云大数据部署:从开发到生产(Docker、K8s、HDFS/Flink on K8s)

1. 引言 在企业级大数据架构中,私有云部署成为了许多企业的首选,尤其是对数据安全性、合规性、资源控制要求较高的场景。相比于公有云,私有云具备更强的灵活性,能够根据业务需求进行定制化优化。本文将探讨如何在私有云环境下构建大数据平台,包括 Docker 容器化、Kuberne…...

使用DeepSeek和墨刀AI,写PRD文档、画原型图的思路、过程及方法

使用DeepSeek和墨刀AI&#xff0c;写PRD文档、画原型图的思路、过程及方法 现在PRD文档要如何写更高效、更清晰、更完整&#xff1f; 还是按以前的思路写PRD&#xff0c;就还是以前的样子。 现在AI这么强大&#xff0c;产品经理如何使用DeepSeek写PRD文档&#xff0c;产品经…...

拥有一台云服务器能做什么呢?

拥有一台云服务器就像拥有了一台24小时在线的远程电脑&#xff0c;你可以通过互联网随时随地管理它。它的用途非常广泛&#xff0c;无论是个人学习、开发测试&#xff0c;还是企业级应用部署&#xff0c;都能发挥重要作用。以下是常见的应用场景&#xff0c;按需求分类整理&…...

4大观点直面呈现|直播回顾-DeepSeek时代的AI算力管理

直播回顾 2025年2月21日晚上9点30分&#xff0c; 我们迎来了新春后的首场人工智能三人行宣讲活动。 这场直播聚焦于Deepseek开源大模型&#xff0c; 探讨了其对AI算力、算法、数据及应用带来的新发展。 本次直播邀请到了上海赞奇的总经理俞阁总和速石科技陈琳涛&#xff0c;…...

DBeaver安装步骤及连接数据库

一、DBeaver安装步骤 1、双击安装文件“dbeaver-ce-21.3.3-x86_64-setup.exe”&#xff0c;进入安装界面 2、点击ok》下一步》我接受&#xff0c;选择下图选项&#xff0c;为此所有用户使用 3、点击下一步&#xff0c;将重新弹出安装开始界面 4、点击ok》下一步》我接受&…...

玩转python:通俗易懂掌握高级数据结构-collections模块之UserDict

引言 UserDict是Python中collections模块提供的一个强大工具&#xff0c;它是dict的封装类&#xff0c;允许用户自定义字典的行为。通过继承UserDict&#xff0c;开发者可以轻松扩展字典的功能&#xff0c;实现自定义的字典逻辑。本文将详细介绍UserDict的关键用法和特性&…...

如何解决ChatGPTplus/pro o1/o3模型无法识别图片或者文件,限制次数?

你是否遇到ChatGPTplus无法识别图片、或者无法识别文件&#xff0c;甚至回答很简短&#xff0c;o1不思考&#xff0c;GPT-4o不能联网、分析图片和处理文件&#xff01;感觉非常敷衍。本文教你如何确定自己的账号是否被降智&#xff1b;教你如何降智的原因&#xff1b;教你解决降…...

96.HarmonyOS NEXT工具类设计模式教程:最佳实践与实现

温馨提示&#xff1a;本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦&#xff01; HarmonyOS NEXT工具类设计模式教程&#xff1a;最佳实践与实现 1. 工具类设计原则 1.1 基本原则 原则说明示例单一职责每个类只负责一个功能Win…...

springboot+vue如何前后端联调,手搓前后端分离项目

我们首先在前端安装axios&#xff0c;这个npm就可以&#xff01;下载完成后。我们用我们之前的页面&#xff0c;然后写一个card&#xff0c;在一个card里面渲染我们的用户数据&#xff0c;我们先写一个查询所有用户信息的一个效果&#xff01; <el-card class"box-card…...

git备份or打补丁

起因 在工作中使用git pull突然发现仓库出现了找不到代码库问题&#xff0c;但是这个时候有个对策又急着需要&#xff0c;于是乎&#xff0c;就需要备份&#xff0c;拷贝给另一个工程师输出。 git 打补丁操作 工程师A生成补丁文件 touch a.txtgit add a.txtgit commit -m &qu…...

游戏成瘾与学习动力激发研究——多巴胺脉冲式释放与奖赏预测误差机制的神经科学解析

多巴胺脉冲式释放与奖赏预测误差机制的神经科学解析 一、核心概念 多巴胺(Dopamine) 一种关键神经递质,主要功能是调节动机、奖赏学习和行为强化。它并非直接产生“快乐感”,而是驱动“寻求奖赏”的行为动机。 脉冲式释放(Phasic Release) 多巴胺神经元以短暂、高频的爆…...

【C/C++】最长回文子串(leetcode T5)

核心考点&#xff1a;回文字符串匹配中心扩展法 题目描述 给你一个字符串 s&#xff0c;找到 s 中最长的 回文 子串。 示例 1&#xff1a; 输入&#xff1a;s "babad" 输出&#xff1a;"bab" 解释&#xff1a;"aba" 同样是符合题意的答案。…...

表的操作以及增删查改

1. 表的操作 1.1 查看所有表 show tables; 1. 2 创建表 CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_namefield datatype [ 约束 ] [comment 注解内容 ][, field datatype [ 约束 ] [comment 注解内容 ]] ...) [engine 存储引擎 ] [character set 字符集 ] [collate …...

【人工智能基础2】Tramsformer架构、自然语言处理基础、计算机视觉总结

文章目录 七、Transformer架构1. 替代LSTM的原因2. Transformer架构&#xff1a;编码器 - 解码器架构3. Transformer架构原理 八、自然语言处理基础1. 语言模型基本概念2. 向量语义3. 预训练语言模型的基本原理与方法4. DeepSeek基本原理 九、计算机视觉 七、Transformer架构 …...

Python游戏开发自学指南:从入门到实践(第四天)

Python不仅适用于数据分析、Web开发和自动化脚本&#xff0c;还可以用于游戏开发&#xff01;虽然Python不是传统意义上的游戏开发语言&#xff0c;但其简洁的语法和丰富的库使其成为初学者学习游戏开发的绝佳选择。本文将为你提供一份全面的Python游戏开发自学指南&#xff0c…...

向量数据库技术系列四-FAISS介绍

一、前言 FAISS&#xff08;Facebook AI Similarity Search&#xff09;是由Facebook AI Research开发的一个开源库&#xff0c;主要用于高效地进行大规模相似性搜索和聚类操作。主要功能如下&#xff1a; 向量索引与搜索&#xff1a;FAISS提供了多种索引和搜索向量的方法&…...

【网络安全 | 漏洞挖掘】价值14981$的Google点击劫持漏洞

未经许可,不得转载。 文章目录 点击劫持前言漏洞1攻击场景漏洞2攻击场景漏洞3攻击场景漏洞4攻击场景漏洞5攻击场景漏洞6攻击场景点击劫持 点击劫持是一种恶意的用户界面攻击技术,也被称为 “UI 覆盖攻击” 或 “透明劫持”。 攻击者通过创建一个看似正常的网页,并在其中嵌…...

CMake 保姆级教程

CMake 是一个跨平台的构建工具&#xff0c;用于生成适合不同平台和编译器的构建系统文件&#xff08;如 Makefile 或 Visual Studio 项目文件&#xff09;。 在 Windows 下使用 CMake 构建项目时&#xff0c;CMake 会根据 CMakeLists.txt 文件生成适合 Windows 的构建系统文件&…...

IntelliJ IDEA 2023.3.1安装指南从下载到配置的完整教程(附资源下载)

安装 IntelliJ IDEA 2023.3.1 非常简单&#xff0c;以下是详细的安装步骤&#xff0c;适用于 Windows、macOS 和 Linux 系统。 1. 下载 IntelliJ IDEA IntelliJ IDEA下载链接&#xff1a;https://pan.quark.cn/s/3ad975664934 选择适合你的操作系统的版本&#xff1a; Ultimat…...

springboot树形结构 支持模糊查询,返回匹配节点和父节点,其他节点不返回

package com.me.meterdemo.ds; import java.util.ArrayList; import java.util.List;public class TreeNode {private Long id;private String name;private Long parentId;private List<TreeNode> children new ArrayList<>();// 构造方法public TreeNode(Long i…...

linux 命令 touch

Linux 的 touch 命令主要用于 创建空文件 或 修改文件的时间戳&#xff08;访问时间、修改时间&#xff09;。以下是其核心用法和实用示例&#xff1a; 基本语法 touch [选项] 文件名... 核心功能 1. 创建空文件 如果文件不存在&#xff0c;则创建空文件&#xff1b;如果存在…...

3.14-1列表

列表 一.列表的介绍和定义 1 .列表 类型: <class list> 2.符号:[] 3.定义列表: 方式1:[] 通过[] 来定义 list[1,2,3,4,6] print(type(list)) #<class list> 方式2: 通过list 转换 str2"12345" print(type(str2)) #<class str> list2lis…...

完整的模型验证套路

模型验证 0. 写在前面 经过之前的代码编写&#xff0c;我们已经建立了一套模型&#xff0c;下面就开始对我们编写的模型进行验证。 代码&#xff1a;代码链接 1. 验证模型 我们首先运行代码&#xff08;epoch 20&#xff09;得到结果如下&#xff1a; Files already down…...

python2和python3的区别

python2和python3的区别 ​核心区别​Python 2 示例​Python 3 示例​通俗解释​专业术语​1. 打印方式print "Hello"print("Hello")Python 3必须加括号&#xff0c;像“按钮操作”&#xff1b;Python 2像“直接喊话”。print从语句变为函数&#xff0c;支…...

【时时三省】(C语言基础)用printf函数输出数据3

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 ( 5 ) e格式符。 用格式声明%e指定以指数形式输出实数。如果不指定输出数据所占的宽度和数字部分的小数位数&#xff0c;许多C编译系统&#xff08;如VisualC&#xff09;会自动给出数字部分…...

【差分约束】 P3275 [SCOI2011] 糖果|省选-

本文涉及知识点 差分约束 P3275 [SCOI2011] 糖果 题目描述 幼儿园里有 N N N 个小朋友&#xff0c; lxhgww \text{lxhgww} lxhgww 老师现在想要给这些小朋友们分配糖果&#xff0c;要求每个小朋友都要分到糖果。但是小朋友们也有嫉妒心&#xff0c;总是会提出一些要求&…...

找第一个只出现一次的字符(信息学奥塞一本通-1130)

【题目描述】 给定一个只包含小写字母的字符串&#xff0c;请你找到第一个仅出现一次的字符。如果没有&#xff0c;输出no。 【输入】 一个字符串&#xff0c;长度小于100000。 【输出】 输出第一个仅出现一次的字符&#xff0c;若没有则输出no。 【输入样例】 abcabd 【输出样…...

【MySQL】多表操作 —— 外键约束

目录 多表关系一对一关系一对多/多对一关系多对多关系 外键约束基本概念一对多/多对一创建外键约束外键约束下的数据操作数据插入数据删除 删除外键约束 多对多创建外键约束外键约束下的数据操作数据插入数据删除 删除外键约束 多表关系 MySQL 多表之间的关系可以概括为&#…...

自己动手打造AI Agent:基于DeepSeek-R1+websearch从零构建自己的Manus深度探索智能体AI-Research

第一章&#xff1a;AI Agent基础与DeepSeek-R1架构解析&#xff08;1/10&#xff09; 1.1 AI Agent技术演进与核心价值 人工智能代理&#xff08;AI Agent&#xff09;经历了从规则驱动到数据驱动的范式转移。早期基于专家系统的符号主义方法&#xff08;如MYCIN医疗诊断系统…...

SpringSecurity配置(校验数据库用户信息)

文末有本篇文章的项目源码文件可供下载学习 通过SpringSecurity快速入门案例我们已经实现了基于内存的校验用户信息,但在实际项目中我们需要校验从数据库中获取的用户信息,这里我们主要是两步操作: 1.需要我们实现UserDetailsService的loadUserByUsername方法,在方法中以前端…...

中考语文的考点及相应的解题技巧

1 考点分布 1.1 作文&#xff08;60 分左右&#xff09; 考点&#xff1a;立意、选材、结构、语言表达等。要求立意深刻、新颖&#xff0c;选材真实、典型&#xff0c;结构清晰、完整&#xff0c;语言流畅、生动。 解题技巧&#xff1a;认真审题&#xff0c;理解题目要求和限…...

PackageManagerService

首语 PackageManagerService(以下简称PMS)是Android最核心的系统服务之一&#xff0c;它是应用程序包管理服务&#xff0c;管理手机上所有的应用程序&#xff0c;包括应用程序的安装、卸载、更新、应用信息的查询、应用程序的禁用和启用等。 职责 在Android系统启动过程中扫…...

基于大模型的智能客服搭建

引言&#xff1a;智能客服的范式转变 在数字经济浪潮中&#xff0c;客户服务正经历从"人力密集型"向"技术驱动型"的深刻转型。据IDC最新报告&#xff0c;全球智能客服市场规模预计将在2028年突破1200亿美元&#xff0c;年复合增长率达28.6%。这种增长背后…...

Vagrant+VMWare 安装Ubuntu24.04

背景介绍 对于众多 Windows 用户来说, 有时候需要用到 Linux 环境做一些开发或者测试. WSL 目前能覆盖到很大一部分使用场景, 但是仍然有一些场景需要用虚拟机才能解决. 开发者的痛点往往是对于虚拟机环境的配置和管理, 因为手动安装需要很长的时间, 并且每次安装完成之后需要…...

数字化转型 - 数据驱动

数字化转型 一、 数据驱动1.1 监控1.2 分析1.3 挖掘1.4 赋能 二、数据驱动案例2.1 能源工业互联网&#xff1a;绿色节能的数字化路径2.2 光伏产业的数字化升级2.3 数据中心的绿色转型2.4云迁移的质效优化2.5 企业数字化运营的实践2.6数字化转型的最佳实践 一、 数据驱动 从数…...

【软考-架构】11.3、设计模式-新

✨资料&文章更新✨ GitHub地址&#xff1a;https://github.com/tyronczt/system_architect 文章目录 项目中的应用设计模式创建型设计模式结构型设计模式行为型设计模式 &#x1f4af;考试真题题外话 项目中的应用 在实际项目中&#xff0c;我应用过多种设计模式来解决不同…...

leetcode0031 下一个排列-medium

1 题目&#xff1a; 下一个排列 官方标定难度&#xff1a;中等 整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。 例如&#xff0c;arr [1,2,3] &#xff0c;以下这些都可以视作 arr 的排列&#xff1a;[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1] 。 整数数组的 下一…...

CmBacktrace的cmb_cfg.h

一&#xff1a;宏定义解析 #ifndef _CMB_CFG_H_ #define _CMB_CFG_H_#ifdef CMB_USER_CFG #include "cmb_user_cfg.h" #else /* print line, must config by user */ #define cmb_println(...) /* e.g., printf(__VA_ARGS__);printf("\r\n"…...

Redis监控:从睁眼瞎到千里眼的进化史

各位在Redis迷雾中摸黑的探险家们&#xff01;今天我们要给Redis装上"天眼系统"——从连自己内存爆了都不知道的睁眼瞎&#xff0c;进化到连每秒哪个键被摸了几次都门儿清的监控狂魔&#xff01;准备好迎接《Redisの楚门世界》了吗&#xff1f;&#x1f441;️ 第一幕…...