- 博客(81)
- 问答 (1)
- 收藏
- 关注
原创 【Qt/C++】Qt/C++ 中 :: 和 . 到底有什么区别?
在 Qt/C++ 开发中,:: 和 . 虽然都用于访问成员,但前者表示通过类名访问,后者表示通过对象调用,理解它们的区别是读懂和编写代码的基础。
2026-04-17 14:57:24
62
原创 【Qt】Qt 新建类时 Base class 怎么选?一篇文章帮你理清 QObject、QWidget、QMainWindow 等区别
在 Qt 项目开发中,选择基类的关键不在于哪个“更高级”,而在于先判断这个类是负责界面显示还是负责业务逻辑,从而在 QObject、QWidget、QMainWindow 等基类之间做出合适选择。
2026-04-16 14:47:53
340
原创 【kv存储】基于 C 的 KV 存储项目:主从单向同步是怎么实现的
本文结合项目代码,介绍了 KV 存储系统中主从单向同步的实现思路,重点说明了从库发起 SYNC、主库全量快照同步、后续增量命令广播以及双虚拟机测试验证的完整流程。
2026-04-14 15:30:19
371
原创 【网络编程】一文看懂内存池:它到底是什么,为什么很多项目都要用它?
本文用通俗方式讲清楚了内存池的基本概念、核心作用以及典型实现思路,帮助初学者理解为什么高频小对象分配场景下常常需要用内存池来提升内存管理效率。
2026-04-06 15:30:24
385
原创 【kv存储】为什么在kv存储项目中需要自定义 kvs_malloc 而非系统 malloc
本文结合轻量级 KV数据库开发实践,通过极简代码演示自定义kvs_malloc内存分配器的封装与实现,深度解析其相比系统malloc在性能、内存碎片、利用率及并发场景下的核心优势,阐明存储项目定制化内存管理的必要性与落地思路。
2026-04-05 15:47:07
431
原创 【网络编程】关于 KV 数据库项目搭建的一些思考:从网络层到存储层该怎么想
本文围绕一个入门型 KV 数据库项目的搭建思路,通俗梳理网络层、协议层和存储层各自需要解决的问题,并分析在实际实现中还应进一步考虑的关键细节。
2026-04-04 15:55:57
739
原创 【网络编程】在 KV 存储服务中引入红黑树:从协议解析到增删改查实现
文本命令怎么拆命令怎么分发红黑树怎么保存键值对查找、修改、删除怎么映射到网络响应所以这件事的重点不是“实现了一棵树”,而是实现了一个能接收网络请求、并用红黑树完成增删改查的小型 KV 服务。命令枚举、协议拆分、红黑树节点定义、RSET/RGET/RDEL/RMOD/REXIST 分发、测试验证,这些部分在工程里已经形成了一条清晰流程。
2026-04-03 10:19:25
379
原创 【网络编程】KV 存储中的 Hash 是怎么用起来的?从哈希桶到 HSET/HGET 的实现思路
本文结合 KV 存储项目中的哈希表实现,通俗讲解 Hash 在键值存储中的作用、底层组织方式以及 HSET、HGET、HDEL 等操作是如何一步步实现并接入协议层的。
2026-04-03 10:18:05
382
原创 【网络编程】第一次做 KV 存储项目时遇到 Makefile,到底该怎么理解?
本文结合 KV 存储项目中的实际开发场景,通俗解释 Makefile 的作用与意义,帮助初学者理解为什么多文件 C 项目通常需要用 Makefile 来管理编译过程。
2026-03-30 23:39:16
910
原创 【网络编程】KV存储项目中的测试与测压:从功能校验到简单 QPS 统计
KV 存储项目里的测试板块,真正重要的不是“能不能发一条请求”,而是能不能把功能验证、状态校验和简单性能观察串成一个完整闭环。验证功能链路是否正确发现服务端逻辑 bug统计一个最基础的吞吐量指标从实现上看,它其实并不复杂:连接服务端、发送请求、接收响应、比较结果、循环执行、统计耗时。但恰恰是这样一个看起来不大的测试模块,往往最能帮助把 KV 存储项目真正跑通。
2026-03-30 23:37:47
401
原创 【kv存储】从零看懂 KV 存储中的协议设计
本文结合 KV 存储项目代码,系统梳理文本协议的设计思路,详细讲解命令拆分、协议解析、命令分发以及协议层与底层存储层的衔接过程。
2026-03-24 21:54:42
539
原创 【C++】结构体命名中的 _s 和 _t 到底有啥区别?
本文结合 C 语言 KV 存储底层源码,通俗解析了结构体定义中 _s(真实大名)与 _t(类型小名)的区别、使用场景,以及为何在链表等自引用结构中绝不能省略 _s 的核心底层逻辑。
2026-03-24 21:52:37
362
原创 【C基础】C语言里 char ** 到底怎么理解?为什么字符串数组传参后会变成二级指针
本文围绕 C 语言中 char ** 的使用展开,重点解释为什么 char *tokens[] 在函数传参时会退化为 char **tokens,并结合代码说明数组元素类型、数组名退化规则以及二级指针的实际含义。
2026-03-10 08:00:00
676
原创 【网络编程】彻底搞懂 EPOLL 的 ET 与 LT 触发模式
Epoll 的 LT(水平触发)默认模式下缓冲区有数据就持续触发事件,易用稳定;ET(边缘触发)仅在缓冲区状态变化时触发一次事件,需搭配非阻塞 Socket + 循环读空缓冲区才能发挥高性能,本文结合实战代码与避坑指南,通俗讲解了两种模式的定义、设计初衷、实现方式及选型原则。
2026-03-08 21:54:59
395
原创 【网络编程】TCP 粘包与分包:从现象、原理到落地解决方案
本文从现象、原理到落地实现,通俗拆解 TCP 粘包与分包的核心成因,结合 KV 存储实战场景详解工业级解决方案,帮你彻底搞定 TCP 网络编程的这一经典难题。
2026-03-08 16:45:47
444
原创 [KV存储]从零构建高性能 KV 存储网络层
既然有了统一的业务函数,那我们在启动服务器时,到底该让哪个网络层去调用它呢?在kvstore.h// 这里就是主控开关,当前拨到了 NTYCO(协程)上在kvstore.c的main函数中,利用预处理指令if(argc!#endif不管进入哪个分支,我们都把端口号port和业务函数指针像参数一样注入到了底层的启动函数中。这就是典型的“依赖注入”思想。底层网络层只需要拿好这个的指针,在合适的时机调用它就行了。极度解耦。
2026-03-07 22:30:48
450
原创 【网络编程】彻底搞懂协程:为什么同步的写法,却能跑异步的效率?
想写同步代码:逻辑清晰、一行接一行,调试起来像 “顺着数台阶”,但遇到网络请求、文件读写这类 “慢操作”,线程就会原地阻塞,CPU 空转,效率低到感人;想写异步代码:用回调、IOCP、epoll 这些模型,线程不会阻塞,CPU 利用率拉满,但代码被拆成一堆回调函数,逻辑支离破碎(比如 “回调地狱”),维护起来像 “拆毛线团”。而协程的出现,恰恰解决了这个两难问题 ——用同步的逻辑写代码,却能实现异步的执行效率。很多人会疑惑:协程到底是怎么做到的?
2026-03-07 10:45:46
478
原创 【KV存储】基于协程实现高并发 TCP 服务器(简单 KVStore 实现)
本文通过一个简单的 KVStore 示例,介绍了如何使用协程实现一个高并发 TCP 服务器。服务器整体结构可以概括为:使用 socket 建立 TCP 服务每个客户端连接创建一个协程协程负责接收请求、解析命令、发送响应调度器统一管理所有协程通过协程 + Hook + 事件驱动的方式,我们可以在保持代码简洁的同时,实现高并发网络服务器。随着高并发应用越来越普遍,协程技术也正在被越来越多的系统采用。如果你希望深入理解现代高性能服务器架构,协程绝对是一个非常值得学习的技术方向。
2026-03-06 22:20:27
576
原创 【C++】#ifndef 和 #define 是什么?一篇彻底讲清头文件保护(Header Guard)
的作用是防止头文件被重复包含。它的核心思想就是:第一次包含头文件定义一个宏再次包含头文件发现宏已经存在跳过整个头文件内容一个头文件无论被 include 多少次,内容只会编译一次。这就是 C++ 中非常基础但非常重要的头文件保护机制(Header Guard)。
2026-03-06 21:23:28
247
原创 【网络编程】C++ IOCP 高性能服务器核心原理解析与代码实战
IOCP 是一种支持多处理器的异步 I/O 模型。简单来说,它就像是一个极其高效的快递中转站(完成端口)你(应用程序)告诉快递员(操作系统):“我要接收数据(WSARecv)”或者“我要接受新连接(AcceptEx)”。说完你就可以去干别的事了(非阻塞)。当操作系统把事情办完(比如数据收到了),它会把一个包含结果的“包裹”扔进中转站(完成端口队列)。你提前雇好的工人(工作线程池)就在中转站等着,谁有空谁就去拿包裹,拿到后根据包裹里的指示进行下一步处理。
2026-03-05 21:17:06
363
原创 【网络编程】从本质理解 KV 存储:它到底解决了什么问题?
但很多人其实并没有真正理解:KV 存储到底是什么?它为什么会成为高性能系统的核心组件?我们用四个核心部分讲清楚。
2026-03-05 21:16:26
389
原创 【网络编程】Reactor 模型原理与实现详解
Reactor 的精髓就是:检测归检测,操作归操作。这是它高并发的关键。// 回调函数功能:监听fd的读事件就绪(有新连接接入)时,执行accept接收连接// 1. 接收新的客户端连接,拿到客户端fd// 2. 关键后续动作:把新的客户端fd注册到epoll,并绑定它的读事件回调(比如接收客户端数据)// (对应第三步的注册逻辑,给客户端fd绑定read_callback读回调)// 创建socket、绑定端口、开启监听socket();bind();listen();
2026-03-04 16:30:21
750
原创 【网络编程】IOCP 模型深度解析
判断是否异步,核心看:I/O 操作是谁完成的?在 IOCP 中:应用程序只负责“投递”内核负责“执行”内核负责“通知”线程不参与 I/O 过程。这就是它和基于 epoll 的 Reactor 最大的区别。事件就绪 → 你自己 read()你先提交 → 内核读完 → 通知你一个是“你做 I/O”一个是“内核做 I/O”这就是同步和异步的根本差别。
2026-03-04 16:29:41
377
原创 【网络编程】手写一个高性能 TCP QPS 压测工具 (C语言多线程版)
getopt就是帮你把乱七八糟的命令行输入,整理成一个个清晰的Key-Value对,让你直接在switch语句里处理。这个工具是一个典型的BIO (Blocking I/O) 客户端模型:One Thread Per Connection(一个线程对应一个连接)。局限性:如果你指定-c 1000(1000个连接),在当前代码逻辑下,你必须开启-t 1000(1000个线程)。这在连接数极高时(例如几万并发)会因为线程切换开销过大而导致客户端先成为瓶颈。适用场景。
2026-03-03 21:49:44
381
原创 【网络编程】IOCP 和 Reactor 模型的区别详解
Reactor 是一种基于事件驱动的同步 I/O 多路复用模型。其核心思想是:一个或多个线程监听 I/O 事件,当事件就绪后分发给对应的处理器执行。
2026-03-03 21:49:42
1298
原创 【网络编程】从“排队买奶茶”看 Linux I/O 进化史:Select, Poll, Epoll 到 io_uring 的终极对决
角色Epollio_uring奶茶店模式店员拿着名单挨个问顾客拿取餐器,震动了自己去柜台拿阿姨直接把奶茶端到顾客桌上操作方式轮询 (Polling)事件驱动 (Event-driven)异步 (Asynchronous)时间复杂度O(N) 人越多越慢O(1) 人多人少一个样O(1) 且无系统调用开销谁负责读数据?你自己(走到柜台拿)你自己(走到柜台拿)内核(帮你端到桌上)关键痛点只有一个人做好,也要问遍全场数据还得自己拷贝配置稍微有点复杂适用场景连接数很少的老系统。
2026-01-29 16:29:14
587
原创 【网络编程】C语言手撸 io_uring 异步 Echo 服务器
在看代码之前,必须先理解 io_uring 的“双环”设计。传统的 Socket 编程是你去问内核:“数据来了吗?”(同步非阻塞)。而 io_uring 是你告诉内核:“我要读数据,读完了放这儿,我去忙别的了。”(异步)。它使用了两个环形队列(Ring Buffer)SQ (Submission Queue - 提交队列):我们把要做的任务(如:读、写、接受连接)放到这里。CQ (Completion Queue - 完成队列):内核把处理完的结果(如:读到了多少字节)放到这里。这样做的好处?零拷贝。
2026-01-29 15:52:05
703
原创 【网络编程】从零开始理解 io_uring:Linux 网络编程的“核动力”引擎
想象一下,你的电脑是一个巨大的快递公司。这里是核心仓库,存放着所有硬件资源(网卡、硬盘、内存)。只有拥有最高权限的管理员(内核)才能进出,普通人严禁入内。这里是客户大厅。你的程序(比如你写的 Python 脚本或 C 代码)就是客户,只能坐在大厅里填单子。你的程序(客户)想要读取硬盘里的一个文件(从仓库取货)。因为你不能进仓库,你必须:走到柜台窗口。填一张申请单(调用read函数)。把单子递给窗口里的管理员。管理员停下子手里的活,接过单子,转身走进仓库,找到货,搬出来,递给你。这个过程,就叫系统调用。
2026-01-27 11:31:04
567
原创 【网络编程】从网卡到就绪链表:硬核拆解 epoll 百万并发背后的“潜规则”
eventpoll静态管理:靠红黑树(rbr)——“一个都不能少”当你用epoll_ctl添加监控时,大管家会为每个 Socket 创建一个名为epitem的档案,并把它挂在红黑树上。红黑树极高的搜索效率保证了即便你监控了100 万个连接,大管家也能在极短时间内找到、修改或删除其中任何一个,绝不卡顿。动态通知:靠就绪链表(rdlist)——“只看谁有活干”这才是 epoll 性能起飞的关键。当网卡数据到达触发回调函数(Callback)时,大管家不需要去翻那棵巨大的红黑树,而是由回调函数直接把有数据的。
2026-01-26 22:33:33
620
原创 【网络编程】小白也能懂的 Epoll 详解:从“傻等”到“高效管理”的 I/O 神器
在内核建个“红黑树”和“就绪链表”。epoll_ctl:把新来的连接(FD)挂到“红黑树”上,并告诉内核:“这哥们有消息了记得告诉我”。(网卡收包过程):数据来了 -> 触发回调 -> 对应的 FD 被自动复制到“就绪链表”。epoll_wait:应用程序调用这个函数,其实就是去检查**“就绪链表”**是不是空的。如果不空,直接把链表里的东西拿走(O(1) 效率)。如果空,就睡一会儿等链表有东西。Epoll 是什么:Linux 下处理高并发网络连接的神器。解决了什么。
2026-01-26 11:05:39
1020
原创 【网络编程】深入探索 DPDK 用户态协议栈:从一张架构图看懂高性能服务器设计
这张手绘图虽然简单,但它展示了用户态协议栈 (User Space Stack)解耦。I/O 专注搬运:不受业务逻辑阻塞,保证线速收包。协议栈专注解析:处理复杂的滑动窗口、拥塞控制。业务专注逻辑:程序员依然可以使用类似recv/send的接口,不需要关心底层是 DPDK 还是 Socket。这就是为什么基于 DPDK 的 Nginx、Redis 或者自研网关,能够轻松做到单机百万甚至千万并发的秘密所在。希望这篇文章能让你对网络底层架构有更清晰的认识!
2026-01-23 21:28:59
730
原创 【网络编程】基于 DPDK 的 UDP/TCP 抓包与最简协议栈实现
在传统的网络程序中,我们通常通过)来收发数据包。但这种方式存在几个天然瓶颈:数据包必须经过Linux 内核协议栈存在系统调用开销中断、上下文切换频繁在高性能场景(10GbE、25GbE、100GbE)下容易成为瓶颈为了解决这些问题,Intel 推出了DPDK👉 它绕过 Linux 内核,直接让用户态程序接管网卡,用轮询的方式“抢”数据包。本文将基于一份完整可运行的 DPDK 示例代码,实现:UDP 数据包的抓取 + 打印UDP 数据包的原样回包TCP 三次握手的最小状态机TCP 数据的。
2026-01-23 14:46:56
947
原创 【网络编程】基于DPDK的TCP报文收发实现
通过这五个部分的拆解,我们实现了一个最基础的用户态协议栈雏形。初始化:利用接管系统资源。配置:利用设置网卡队列。接收:利用批量读取原始数据。解析与构造:通过指针偏移手动操作 Ethernet/IP/TCP 头部,完全控制协议细节。发送:利用将响应包打回网络。这段代码虽然简单,但它展示了DPDK开发的核心范式。在此基础上,你可以进一步实现TCP的三次握手状态机、滑动窗口、拥塞控制等高级功能,从而构建一个真正的高性能用户态TCP协议栈。
2026-01-16 11:10:36
660
原创 【DPDK实战】手撸协议栈:实现UDP 代码和TCP 有何不同?
维度UDP (代码逻辑)TCP (代码逻辑)核心动作(拷贝数据,直接发送)(计算序号,维护状态)头部解析定长(8字节),指针偏移固定。变长(20~60字节),需读取 Data Offset。内存管理用完即弃必须缓存。发出去的包在收到 Ack 前不能释放,以备重传。开发难度入门级。适合 DPDK 新手练手。地狱级。相当于把 Linux 内核网络栈逻辑搬到用户态重写一遍。
2026-01-16 10:38:37
678
原创 [网络编程] 基于 DPDK 的 UDP 报文收发实现
这条路径,在高性能场景(如高并发、低时延、网络测量、用户态协议栈)下会成为瓶颈。也就是说:网卡不再把包交给内核而是直接 DMA 到用户态的内存应用程序自己解析 Ethernet / IP / UDP本文将通过一段。
2026-01-15 19:53:07
706
原创 【网络编程】RX和TX(接受队列和发送队列)
网卡往里填数据,CPU 从里面拿数据(收快递)。:CPU 往里填数据,网卡从里面拿数据(寄快递)。本质:它们是内存里的环形缓冲区,配合 DMA 技术,实现了 CPU 和网卡之间的高速解耦。
2026-01-14 16:24:43
831
原创 【DPDK实战】编写一个高性能 UDP 抓包程序
include <stdio.h> // 标准输入输出库,用于 printf#include <rte_eal.h> // DPDK 核心库:EAL (Environment Abstraction Layer) 环境抽象层#include <rte_ethdev.h> // DPDK 网卡设备库:提供网卡配置、收发包 API#include <arpa/inet.h> // 提供网络字节序转换等函数 (如 htons)
2026-01-14 15:56:15
1215
空空如也
关于数据结构复习遇到的问题
2021-12-25
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅