自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(34)
  • 收藏
  • 关注

原创 docker机制的理解

Dockerfile 是构建镜像的配方,镜像是只读的静态模板,容器是镜像的运行实例(本质是宿主机上的隔离进程)。多个容器共享只读镜像层,各自拥有独立的可写层,由 Docker 服务端统一管理。

2026-10-21 16:12:07 244

原创 协程的本质:从状态与调度视角的深度剖析

维度Reactor(回调)协程RIP连续性断裂连续RSP管理栈释放,手动管理独立栈,自动管理状态存储堆(手动)栈(自动)“下一步”状态机RIP隐含代码组织按事件按业务协程要解决的不是"CPU在等待I/O时空闲",而是"回调/事件驱动破坏了程序的执行状态"。同步阻塞:状态完整,但CPU等待I/O多线程:状态完整,但资源消耗大Reactor/回调:CPU不空闲、内存消耗小,但状态被破坏了协程:状态完整、CPU不空闲、内存消耗小。

2026-09-03 15:15:29 344

原创 RDMA 技术本质:当网络传输变成了内存访问

像一个"前台代收代发"。寄东西必须先把包裹搬到前台(内核),前台帮你打包、填单子,然后交给快递员(网卡)。收快递时,前台打电话(中断)通知你来取。像一个"拥有你家钥匙的无人搬运机器人"。你告诉机器人(Doorbell):“卧室衣柜里的那包衣服(MR 地址),送到对面老王家的客厅(远端 MR 地址)”。机器人有你家地址的物理地图(MTT),自己开门取货(本地 DMA),用老王给的钥匙开门(R_Key),把东西放进客厅(远端 DMA)。全程不需要老王从沙发上起来(远端 CPU 旁路)。

2026-08-21 09:19:55 225

原创 io_uring 深度解析:数据路径、控制路径与处理逻辑的三重透视

层面是否改变具体变化解决的问题数据路径本质不变数据仍经过内核中转,两次移动无(受限于 OS 安全模型)控制路径全面重构系统调用 → 共享内存队列消除了系统调用开销处理逻辑时序改变串行等待 → 并行流水线实现了数据搬运和处理的并行io_uring 的本质:它是一个控制路径的专业优化器。它没有试图改变数据如何流动(数据路径),也没有改变谁处理数据(处理逻辑),而是专注于如何更高效地"指使"内核干活,以及如何更快地"知道"内核干完了。它解决的问题。

2026-08-20 14:16:43 190

原创 AF_XDP 深度解析:从数据流动与控制看本质

AF_XDP 的本质,从数据流动的角度看,是将 DMA 的目标从内核态内存替换为用户态内存,将数据的物理移动次数从两次减少为一次。从控制流动的角度看,是用描述符在共享内存环形缓冲区中的流转,替代系统调用和中断,作为数据到达和发送完成的通知机制。它解决的核心问题是:传统网络栈中,数据必须经过内核缓冲区中转,导致 CPU 拷贝、上下文切换和协议栈处理成为高性能场景的瓶颈。AF_XDP 通过内存所有权的重新分配——让用户态拥有 DMA 内存的控制权——从根本上消灭了这些瓶颈。

2026-08-19 10:05:51 154

原创 RDMA技术深度剖析:本质、数据流动与核心价值

RDMA的本质是:将网络数据传输从"CPU主导的软件流水线"转变为"硬件主导的内存直达通道"。在传统网络中,CPU是数据传输的"总指挥"——它负责协议解析、数据拷贝、路由决策等所有环节。让网卡硬件直接读写用户态应用程序的内存,完全绕过操作系统内核。RDMA技术的本质是将数据路径上的"CPU软件接力"替换为"硬件直达专线"。内存注册:让网卡直接持有用户态内存的物理地址,使数据无需经过内核中转内核旁路:通过用户态驱动和MMIO映射,让应用程序直接与网卡硬件通信。

2026-08-16 17:13:05 510

原创 网络数据从网卡到用户态:一场基于内存所有权转移的接力赛

理解网络数据流,关键不在于记住"先干什么再干什么",而在于理解内存所有权的转移路径数据在物理内存页中永恒不变。控制权通过RX Ring 描述符→ sk_buff指针→Socket 链表指针逐级转移。最终通过一次系统调用拷贝,从内核空间"复制"到用户空间,完成所有权从内核到进程的移交。

2026-08-16 16:17:14 253

原创 DMA技术详解:解放CPU的数据搬运工

在理解mmap的"零拷贝"原理时,我们反复提到了DMA(Direct Memory Access,直接内存访问)。DMA是计算机系统中一项至关重要的技术,它让数据在内存和设备之间直接传输,而无需CPU的持续介入。本文将深入剖析DMA的本质、工作原理,以及它如何与mmap配合实现高性能数据通路。:一种硬件机制,允许外设直接读写系统内存,无需CPU介入。核心思想CPU发号施令(指挥) → DMA控制器执行(搬运)而不是 CPU既指挥又搬运DMA = 让硬件直接搬运数据,CPU只做指挥。

2026-08-16 15:29:31 236

原创 mmap技术详解:从原理到实践

在操作系统和系统编程领域,mmap是一个既基础又强大的系统调用。它看似简单——只是建立虚拟内存到物理内存的映射,但正是这个"简单"的能力,催生了共享内存IPC、零拷贝文件IO、内存数据库等众多高性能技术。本文将从mmap的本质出发,深入剖析其工作原理,并通过多个实际场景展示mmap的强大能力。mmap = 建立虚拟地址到物理地址的映射关系多个进程共享同一物理内存(IPC)用户态程序直接访问页缓存(文件IO)用户态程序直接操作设备内存(设备驱动)

2026-08-16 10:43:28 338

原创 共享内存:进程间通信的性能王者

在软件开发中,进程间通信(IPC)是一个永恒的话题。从简单的管道到复杂的消息队列,从本机通信到网络Socket,开发者面临着多种选择。而在所有IPC方式中,共享内存凭借其极致的性能,始终占据着不可替代的地位。本文将深入剖析共享内存的本质,解释它为什么快,适合什么场景,以及如何使用。共享内存 = 多个进程的虚拟地址映射到同一块物理内存数据在物理内存中只有一份进程通过不同的虚拟地址访问同一块物理页没有数据拷贝,没有系统调用,没有上下文切换。

2026-08-16 09:41:10 213

原创 深入浅出 Linux 网络核心:sk_buff 的内存与指针流转

sk_buff 是 Linux 内核极简高效设计的典范,它将复杂的网络协议栈封装、解封装逻辑,简化为指针的加减法运算,彻底规避了频繁内存拷贝的性能损耗。

2026-07-17 10:22:09 389

原创 源码解读:一文搞懂高性能协议解析中的 SIMD 并行加速(附 RESP 源码逐行分析)

前面两篇我们讲解了CPU 三级缓存优化CPU 分支预测优化,分别解决了内存访问延迟、指令流水线冲刷两大性能痛点。大批量重复字节扫描。RESP 协议依靠\r\n作为分隔符,无论是命令头、长度字段还是批量流水线请求,都需要反复查找该换行符。如果使用传统逐字节串行遍历,即便缓存命中率拉满、分支预测零失败,串行执行的效率上限依旧很低。本文作为系列第三篇,结合项目中AVX2 / SSE2 双指令集适配的 SIMD 源码。

2026-06-13 10:40:33 381

原创 从 Redis 风格源码吃透 CPU 分支预测:6 大实战优化,彻底消灭分支预测失败损耗

上一篇我们完整拆解了CPU 三级缓存架构、硬件数据搬运、软硬预取原理,搞懂了如何让业务热数据常驻 L1/L2 缓存,解决缓存未命中带来的内存访问延迟。但在高性能网络协议解析、Redis 类 KV 存储引擎中,缓存只是一半性能瓶颈。分支预测失败。哪怕缓存命中率做到 100%,糟糕的if/else分支逻辑,依旧会造成10%~20% 的稳定性能回撤。

2026-06-10 16:06:13 243

原创 一文吃透CPU三级缓存:L1/L2/L3架构、数据流转、硬件工作全流程(附高性能代码实战)

结构:L1/L2每核私有,L3全核共享,三块独立硬件缓存,并非同一块内存拆分;数据:Intel包含型缓存天然冗余副本,下级缓存完整包含上级缓存数据;寻址:指令自带地址+硬件自动预取+软件手动预取,三重方式获取访问地址;搬运:所有缓存数据迁移纯硬件自动完成,上层代码无感知;优化核心:高性能代码本质就是贴合CPU缓存层级,让热数据尽可能留在L1,减少访问内存次数。

2026-06-10 15:33:10 717

原创 深入解析 Proactor 网络引擎:io_uring 与异步 I/O 的艺术

如果说Reactor 引擎的核心是"等待事件就绪,然后自己做 I/O",那么 Proactor 引擎的核心就是**“预先声明意图,内核做完后通知你结果”。两者的根本差异不在于 API 不同,而在于控制流的反转**——谁来决定什么时候读、什么时候写。本文深入分析本项目中基于 Linux io_uring 的 Proactor 网络引擎实现,逐段拆解其设计思路、异步状态机模型,以及与 Reactor 的核心差异。优化点技术收益CQE 批量收割peek_batch_cqe(128),共享内存读取。

2026-05-13 16:42:36 307

原创 Linux io_uring 深度解析:从原理到实践

两个环,一张单:SQ 环提交任务,CQ 环返回结果。所有 I/O 操作共用同一个 SQE 结构,只是往上面填不同字段。共享内存是核心:提交和收割大部分时候不经过系统调用,这是性能优势的根源。一统异步江湖:文件、socket、定时器——用同一套 API 处理所有 I/O 类型。没有 AIO 的限制,没有 epoll 的同步读写开销。对于网络服务开发者,io_uring 是最接近"完美异步 I/O"的 Linux 接口。但它不是银弹——学习曲线、调试复杂性、内核版本要求都是真实成本。

2026-05-12 16:54:03 685

原创 深入解析 Reactor 网络引擎:从 epoll 到极致性能

优化点技术收益惰性 epoll_ctl缓存 cur_events,变时才 MOD消除 95%+ 的 epoll_ctl 调用紧循环 recv/sendfor(;😉 排空内核缓冲区减少 epoll_wait 唤醒次数偏移量追踪r_off + w_off 替代 memmoveO(1) 而非 O(n) 的缓冲区管理惰性压缩r_off > cap/2 时才 memmove大幅减少内存搬移频率动态超时无阻塞时永久睡眠(零 CPU),有阻塞时精确唤醒fd 索引连接池。

2026-05-12 13:14:41 532

原创 Ubuntu 通用版 从零配置 Soft-RoCE(RDMA over Ethernet)环境

如果你正在做高性能网络开发(数据库主从同步、分布式存储、云计算、高频数据传输等场景),想使用 RDMA 技术实现低延迟、零拷贝的数据传输,却没有专用的 InfiniBand 硬件网卡,那Soft-RoCE就是最优解决方案。它是一种基于标准以太网的 RDMA 软件实现,无需额外采购硬件,直接将你现有的普通以太网网卡模拟为 RDMA 设备,完美兼容 RDMA 原生 API。无论是改造 Redis 主从同步传输层,还是开发其他高性能 C 语言项目,都能无缝适配。本文适配。

2026-04-24 13:19:11 812

原创 从零实现一个高性能分布式 KV 存储:多引擎 + 三网络模型 + 主从同步

做这个项目的过程,其实就是把零散的知识点串联起来的过程 —— 从一开始只会写简单的哈希表,到后来实现三种网络模型、主从复制,我对数据结构、计算机网络、操作系统、分布式的理解,都深刻了很多。最开心的不是实现了多少功能,而是解决问题的过程:比如一开始遇到半包粘包问题,卡了好几天,后来用动态缓冲区 + 偏移指针解决;比如主从同步的时候,断线重连总是数据不一致,后来吃透了 Redis 的 PSYNC 逻辑,才终于搞定。

2026-04-08 14:07:29 552

原创 kv存储项目架构设计与实现方案

kv存储项目是一个类似于Redis的key-value的键值对存储数据库,自研kv存储旨在实现一个更加匹配自己业务的数据库,业务逻辑更加简单,性能也能得到更好的优化。kv存储项目主要分为六个部分,分别为引擎层,接口层,适配层,核心层,协议层,网络层。为什么会采取这样的多重分层结构?主要由于在kv存储项目的迭代过程中,不同的平台所适配的网络协议不同,不同的数据量对应的最优存储结构不同,比如在数据量少时采取数组存储会比红黑树好,就实现了把每一部分组件像是一个插件一样,即插即用,更换方便,当处于这一部分的代码出错

2026-03-22 17:13:48 763

原创 协程设计原理

4.调度器根据每个任务的状态来进行调整,例如任务有ready,wait,sleep三种状态,调度器将不同的三种状态分别进行不同的管理,可以采用不同的管理方式,ready有队列,wait,sleep用红黑树,主要由于需要查找等待时间已经过了的任务,进行执行。首先,初始化协程池后,调度器会循环检测任务队列中是否有任务,如果有任务,就会把任务分配给协程,然后恢复resume,协程执行完毕后,协程就会让出yield,调度器继续进行。协程是用户态的,轻量级的函数执行单元,由代码自身主动决定暂停和恢复,不受线程调度。

2026-03-21 13:14:00 389

原创 Linux 下基于 mysql.h 的 MySQL C API 实战指南

的模板 SQL,再通过参数绑定填充动态值,最后执行。是处理「动态参数」「二进制数据(BLOB/TEXT)」的标准方式,也是防 SQL 注入的最佳实践。MySQL 数据类型可分为「普通类型(文本 / 数值)」和「二进制大对象(BLOB)」两大类,读写逻辑的核心差异在于「数据存储形式」和「内存处理方式」。MySQL C API 提供两种核心 SQL 执行方式,分别适配「静态固定 SQL」和「动态参数 / 二进制数据」场景,以下是详细对比与用法。执行,无需参数绑定,适合无动态参数的固定逻辑场景。

2026-03-16 11:12:45 553

原创 手撕线程池——彻底搞懂线程池的核心逻辑吃透线程池:从核心定义到底层原理,一篇讲透并发利器

线程池(Thread Pool)是一种基于池化思想设计的多线程管理机制,它会预先创建一定数量的休眠工作线程,统一管理线程的创建、销毁、调度与复用;当任务到来时,直接分配给空闲线程执行,任务执行完毕后线程回归线程池等待新任务,避免线程的频繁创建与销毁,最终实现高效的并发任务处理。

2026-03-15 14:04:52 907

原创 互斥锁、自旋锁、原子操作技术详解

原子操作是指硬件(CPU)指令级实现的、不可被中断、不可被分割的最小执行单元。整个操作过程从启动到结束,不会被任何其他执行流打断,不存在中间状态,要么完全执行成功,要么完全不执行,具备天然的原子性。原子操作是最轻量的并发同步手段,无需操作系统介入,仅依赖CPU原生指令实现,常见于简单的数值运算、状态标记等场景,典型代表有CPU的原子加减、CAS(Compare And Swap,比较并交换)、Fetch-And-Add等指令。互斥锁(互斥量)是操作系统内核态实现的独占式同步锁,核心规则为。

2026-03-15 12:40:11 567

原创 POSIX Socket API 底层实现原理

建立连接socket()分配 FD/TCB →bind()赋值地址 →listen()初始化队列 / 切换状态 →accept()取出全连接(新 FD 绑定 TCB);核心是「内核管理连接队列,三次握手自动完成」。传输数据send()recv()仅做「用户态↔内核态」数据拷贝,内核协议栈负责实际网络收发;内核缓冲区是解耦用户态与网络 IO 的核心。断开连接close()回收 FD + 触发 TCP 四次挥手;recv()返回 0 是内核检测到客户端 FIN 包的「EOF 标记」导致。核心原则。

2026-03-13 19:00:24 586

原创 事件驱动Reactor模型实现网络服务器高并发的原理与应用

Reactor 模型的本质:事件驱动的 IO 多路复用,核心是 “被动等待事件通知 + 回调处理”,将 CPU 资源聚焦在实际事件处理上;epoll 解决了 select/poll “轮询所有 fd” 的核心痛点,实现了 O(1) 时间复杂度;无 fd 数量限制、支持边沿触发、低内存拷贝开销,是高并发的核心保障;高并发场景(如百万连接):必选 Reactor(epoll);小型 / 跨平台场景:可选 select/poll(优先 poll,无 fd 数量限制)。执行流程核心。

2026-03-11 16:32:04 880

原创 多线程编程入门指南

一、多线程基础1>多线程的引入:也是为了实现多任务并发执行的问题的,2>多线程(LWP轻量版进程)3>进程是资源分配的基本单位,而线程是任务器进行任务调度的最小单位4>一个进程可以拥有多个线程,同一个进程中的多个线程共享进程的资源5>由于线程是共用进程的资源,所以对于线程的切换而言,开销较小6>由于多个线程使用的是同一个进程的资源,那么,就会导致每个进程使用资源时,产生资源抢占问题,没有多进程安全7>每个进程至少有一个线程:主线程8>

2026-03-11 10:17:25 496

原创 Select、Poll、Epoll详解:核心区别与实战用法

摘要 本文深入解析Linux下三种IO多路复用技术Select、Poll和Epoll的核心区别与实战用法。Select通过位图管理文件描述符,但存在1024并发上限和性能瓶颈;Poll改用链表结构突破限制,但仍有遍历开销;Epoll采用事件驱动机制,实现O(1)复杂度,支持百万级并发。文章详细对比了三者的API使用、性能差异和适用场景,并提供了完整的Select实战代码示例,包括服务器初始化、客户端连接处理和数据读写等核心流程。通过性能测试数据证明Epoll在高并发场景下的显著优势,为开发者选择合适的多路复

2026-03-10 18:59:22 640

原创 Linux中如何使用动态库和静态库

中,如果项目结束后,到了交付阶段,由于主程序的生成需要其他程序联合编译,那么就要将源程序打包一起发给老板,这样该程序的开发者自身的价值就不大了,该项目的知识产权就很容易被窃取。为了保护我们的知识产权,我们引入了库的概念。函数)编译而来,其他程序如果想要使用该源文件中的函数时,只需在编译生成可执行程序时,链接上该源文件生成的库文件即可。方法2:将自己的动态库放入到系统的库函数目录中 (/lib64 /usr/lib64)5、动态库和静态库编译生成可执行程序的大小比较、系统中分为两类,分别是静态库和动态库。

2026-03-09 10:00:24 279

原创 IO操作(外部文件操作)

一、标准IO与文件IO的区别1.1 IO概念1> IO:顾名思义就是输入输出,程序与外部设备进行信息交换的过程称为IO操作2>最先接触的IO标准的输入输出头文件1.2 IO的分类1>标准IO:使用系统提供的库函数实现2>文件IO:基于系统调用完成,每进行一次系统调用,进程会从用户空间向内核空间进行一次切换,当用户空间与内核空间进行切换时,进程就会进入一次挂起状态,从而导致进程执行效率低3>文件IO与标准IO的区别:标准IO相比于文件IO。

2026-03-09 10:00:12 547

原创 多进程编程

1> 对于内核提供的三种通信方式,对于管道而言,只能实现单向的数据通信,对于信号通信而言,只 能完成多进程之间消息的通知,不能起到数据传输的效果。为了解决上述问题,引入的系统 V进程间通 信2> system V提供的进程间通信方式分别是:消息队列、共享内存、信号量(信号灯集)3> 有关system V进程间通信对象相关的指令ipcs可以查看所有的信息(消息队列、共享内存、信号量)ipcs -q:可以查看消息队列的信息ipcs -m:可以查看共享内存的信息ipcs -s:可以查看信号量的信息。

2026-03-08 09:30:58 677

原创 Linux中网络编程的使用

3> 由于不同主机之间存储方式不同,可能会出现,小端存储的主机中的多字节整数,在网络传输 过程中,明明没有出现任何问题,但是,由于大小端存储问题,导致,多字节整数传输出现错误。基于此,我们引入的网络字节序的概念,规定网络字节序都是大端存储的。2> 为什么不使用进程号标识,而使用端口号 答:因为进程号是进程的唯一标识,当同一个应用程序,关闭再打开后,并不是同一个进程号 了,但是是同一个应用程序 所以,端口号标识的是我们的应用程序,当一个应用程序关闭再打开后,端口号不变。

2026-03-08 09:30:11 796

原创 sys库的使用以及如何使用gdb调试

系统提供的有关函数或指令介绍的相关帮助手册,可以在该手册也中查看函数、指令的功能,说白了就是相关操作的使用说明书,一共有七章内容,主要使用前三章,第一章是。run (r):表示执行可执行程序,如果没有设置断点,则将整个程序从头到尾执行一遍。指令相关说明,第二章是系统调用函数相关说明(重点),第三章是库函数(重要)警告可以被忽略,继续产生可执行程序,但是错误必须更改后才能产生可执行程序。:观察点,如果设置的观察点的值发生改变,则会将该值的旧值和新值全部展示出来。可以调试指定的当前程序,向程序中传递参数。

2026-03-07 15:45:27 387

原创 vim编辑器快速上手

obsidian。

2026-03-07 14:40:48 734

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除