- 博客(36)
- 收藏
- 关注
原创 【网络编程】初识 DPDK 并配置 DPDK 环境
本文介绍了DPDK技术相关的设备环境搭建知识,主要包括三个部分: 网卡硬件原理:解释了网卡作为物理层与数字信号转换设备的工作原理,重点说明了DMA机制如何通过PCIe总线实现高效数据传输,避免CPU直接参与数据拷贝。 网卡驱动作用:阐述了网卡驱动作为操作系统与硬件间的"翻译官"功能,详细描述了sk_buff数据结构作为网络数据包在内核中的载体,如何在接收和发送流程中被创建和传递。 多队列网卡技术:对比了单队列和多队列网卡的区别,说明多队列如何通过将网络流量分散到不同CPU核心处理来解决性
2025-09-15 10:36:37
533
原创 【网络编程】从与 TCP 服务器的对比中探讨出 UDP 协议服务器的并发方案(C 语言)
文章摘要:本文回顾了TCP服务器的实现步骤,包括初始化服务器、创建EPOLL实例、处理客户端连接、接收和发送消息等关键流程,并详细解析了bind、listen和accept等系统调用的底层机制。作者分享了零声教育的技术教程链接,涵盖Linux、Nginx、MySQL等主流技术,并附上自己关于TCP/UDP协议及reactor模型的系列文章链接。
2025-09-10 15:49:40
493
原创 【基础组件】手搓共享指针(智能指针之一)附带介绍三大智能指针的 ABC
本文介绍了C++中的智能指针,重点讲解了共享指针std::shared_ptr的实现原理和应用场景。智能指针通过RAII机制自动管理资源生命周期,主要分为独占指针(unique_ptr)、共享指针(shared_ptr)和弱指针(weak_ptr)。其中shared_ptr通过引用计数机制解决内存泄漏和悬空指针问题,允许多个指针共享同一资源,当引用计数归零时自动释放资源。文章详细分析了shared_ptr的构造、析构、赋值等核心操作,并强调了其线程安全特性,同时提醒注意循环引用问题。最后通过房地产抵押的比喻
2025-09-10 15:43:09
553
原创 【基础组件】手搓自旋锁(C++ 版本)—— 原子操作的最简单使用案例
这篇文章介绍了自旋锁的概念、实现原理及其在C++中的应用。自旋锁是一种忙等待锁机制,通过CAS原子操作实现,适用于短时间临界区资源竞争。文章详细解析了compare_exchange_weak和compare_exchange_strong两种CAS操作的区别,以及如何选择合适的内存序来保证同步性能。最后给出了自旋锁的C++实现代码建议,强调成功时使用memory_order_release保证写可见性,失败时使用memory_order_acquire确保读取最新状态。该锁适用于计算时间极短的场景,相比互
2025-09-07 17:27:44
756
原创 【硬件底层】一次过讲清 CPU 的三级缓存、MESI 缓存一致性协议和原子操作三者的关系
CPU缓存与MESI协议 CPU三级缓存(L1/L2/L3)通过分级存储设计缓解CPU与内存间的速度差异。L1最快最小(核心独享),L2次之(核心独享),L3较慢但容量大(所有核心共享),均基于局部性原理工作。缓存系统采用写回策略,配合MESI一致性协议维护数据一致性。 MESI协议定义了四种缓存行状态:Modified(已修改)、Exclusive(独占)、Shared(共享)、Invalid(无效),通过总线嗅探机制实现状态转换。当核心修改数据时,会广播使其他核心的副本失效,确保数据一致性。该机制允许C
2025-09-07 11:13:12
1148
原创 【基础组件】手撕内存池的设计代码(C 实现)
摘要 该文章介绍了内存池的概念及其在长期运行程序(如服务器)中的必要性,重点解决内存碎片问题。作者通过图示展示了内存碎片现象,并提出将小内存块组合成大结点的解决方案。文章包含C语言实现的内存池代码,区分小尺寸块(≤4KB)和大尺寸块,利用位运算实现内存对齐优化性能。内存池数据结构包括管理小块的链表节点(mp_node_s)和大块链表(mp_large_s),通过柔性数组实现动态扩展。该设计旨在减少内存碎片,提升内存分配效率,适用于需要持续稳定运行的系统程序。
2025-09-05 20:57:50
782
原创 【基础组件】手撕 MYSQL 连接池(C++ 版本)
C++ MySQL连接池实现摘要 本文介绍了基于C++的MySQL连接池实现方案,主要包含以下核心内容: 连接池设计原则: 复用性:网络连接管道和工作线程可复用 低功耗状态:无查询任务时线程休眠 任务缓冲:超负荷时能缓存涌入的查询任务 关键技术实现: 采用单例模式保证全局唯一性 使用BlockingQueuePro作为任务队列 通过SQLOperation封装MySQL查询语句 提供Query接口供生产者推送查询任务 核心组件: MySQLConnPool:管理连接池实例 MySQLConn:封装单个数据库
2025-09-05 16:30:39
884
原创 【基础组件】手撕 C++ 的线程池(包含 C++ 语法的插叙)
本文介绍了线程池的基本概念及其在C++中的实现方法。文章首先通过类比游泳池、电池等"池"的概念,阐述了线程池的三个核心特性:资源复用、低功耗休眠和任务缓存机制。随后重点解析了一个基于双队列结构的线程池实现方案,包含生产者队列和消费者队列,通过互斥锁保证线程安全。文章详细讲解了BlockingQueuePro模板类的代码实现,包括Push、Pop、SwapQueue_等关键方法,展示了如何利用条件变量实现线程休眠与唤醒。最后还通过图示展示了线程池的工作流程,包括任务投递、队列交换和执行过程
2025-09-05 10:26:16
1045
原创 【网络编程】NtyCo协程服务器的框架(轻量级的协程方案,人称 “小线程”)
NtyCo是一个基于纯C语言实现的轻量级协程框架,专注于提升网络编程中的IO性能。该项目由零声教育的王博靖开发,对标腾讯的libco/libgo,主打"纯C、零依赖、单线程百万并发"特性。核心功能包括:1)通过汇编实现高效的协程上下文切换;2)结合epoll实现异步IO操作;3)内置调度器管理就绪、等待和睡眠三种状态的协程。相比传统Reactor模型的同步IO局限,NtyCo采用协程方案解决了高并发场景下的连接拥塞问题,其8KB固定栈大小和5k代码量展现出极高性能优势。该框架通过就绪队列
2025-08-27 17:26:53
987
原创 【数据结构】布隆过滤器的概率模型详解及其 C 代码实现
布隆过滤器是一种高效的概率型数据结构,通过位数组和多个哈希函数快速判断元素是否存在。其核心优势在于超高的空间效率和查询速度,适用于缓存防护、爬虫去重等场景。关键原理是将元素通过k个哈希函数映射到位数组,查询时若所有对应位均为1则“可能存在”,否则“绝对不存在”。误判率可通过位数组大小(m)和哈希函数数量(k)调节,最优k值仅取决于目标误判率p。C语言实现需包含位数组、哈希函数等组件,适用于高性能场景。布隆过滤器特别适合处理海量数据下的存在性判断,虽有一定误判率,但“不存在”判断100%准确。
2025-08-23 23:30:18
1051
原创 【数据结构】跳表的概率模型详解与其 C 代码实现
本文介绍了跳表(Skip List)这一高效的数据结构,它通过多层索引加速有序链表的查找、插入和删除操作,平均时间复杂度为O(log n)。跳表在数据库(如LevelDB、Redis)、搜索引擎(如Elasticsearch)、网络路由(如P2P网络)和实时金融系统中有广泛应用。相比平衡树,跳表实现更简单,并发性能更好,支持高效范围查询。 文章详细解析了跳表的核心组成:多层节点结构、随机层数生成算法,以及查找、插入、删除操作的原理。通过类比“马里奥游戏”和“随机生长的小草”,生动解释了跳表的工作机制。此外,
2025-08-23 17:09:56
1214
原创 【数据结构】挂载红黑树的 hash 表(也叫散列表)的C 代码实现
本文介绍了哈希表(Hash Table)这一高效查找数据结构,通过哈希函数实现O(1)查询时间。重点讨论了哈希冲突的解决方案——采用红黑树挂载法,相比传统开放寻址法更优。文章分析了哈希表的核心概念(键、值、哈希函数、冲突处理)、关键性能指标(负载因子)以及MurmurHash3等优秀哈希算法。作者提供了C语言实现代码,展示了如何结合红黑树构建高性能哈希表,包括数据结构定义、键比较函数、红黑树旋转操作等核心内容。文末附有相关技术教程链接和红黑树专题文章的参考,为读者深入学习提供了丰富资源。
2025-08-23 14:23:32
967
原创 【数据结构】B+ 树——高度近似于菌丝网络——详细解说与其 C 代码实现
本文介绍了B+树的基本概念及其与红黑树的对比,重点分析了B+树的8个核心定义特性。通过4阶B+树的示例,详细说明了中间节点和叶子节点的结构组成,以及数据插入过程中节点分裂和键值上溢的机制。文章还对比了B+树与红黑树在结构平衡性、范围查询效率、存储优化等方面的差异,指出B+树更适合磁盘存储场景,能有效减少I/O操作。最后以具体例子展示了B+树的数据插入过程,包括节点满员时的分裂处理。这些内容为理解B+树的高效数据组织方式提供了清晰的技术框架。
2025-08-22 20:07:37
816
原创 【数据结构】B 树——高度近似可”独木成林“的榕树——详细解说与其 C 代码实现
本文介绍了B树的基本概念和严格定义。B树是一种多路平衡查找树,主要用于高效查询键值对型数据列。文章详细阐述了B树的7条定义律,包括节点结构、根节点特性和叶子节点要求,并以3阶B树为例进行说明。重点讲解了B树插入数据的四种情况:(1)根节点满员时分裂;(2)正常插入;(3)插入导致节点分裂和数据上溢;(4)父节点和子节点都满员时的处理策略。文章通过图示直观展示了B树数据插入和节点分裂的过程,帮助理解B树如何通过合理组织数据实现高效查询。
2025-08-22 13:25:11
1072
原创 【数据结构】SPLAY 树的 C 代码实现及其算法的摊还分析
本文介绍了Splay树(伸展树)的基本原理和C语言实现。Splay树是一种自适应的二叉搜索树,通过splay操作将最近访问的节点移动到根节点,利用访问局部性原理提高频繁访问节点的效率。文章详细阐述了Splay树的核心特性,包括自适应性、均摊性能和简单性等,并通过C代码展示了节点结构、基本旋转操作(zig/zag)以及关键的splay操作实现。Splay树适用于需要频繁访问最近数据的场景,如输入法词库缓存等应用。
2025-08-21 23:34:26
818
原创 【数据结构】红黑树的 C 代码实现——包括插入和删除操作的详细解析
这篇文章介绍了红黑树的基本概念、应用场景及其高效的自平衡特性。主要内容包括: 红黑树定义:五条规则确保树的平衡性,如根节点为黑、无连续红节点、黑高相同等。 应用场景:广泛用于文件系统、数据库索引等需要高效搜索的场景,对比链表说明其优势(时间复杂度为O(log N))。 自平衡机制:通过左旋/右旋调整结构,插入红色节点后通过递归修改颜色(如父节点和叔节点变黑、祖父节点变红)恢复平衡。 时间复杂度:平衡的红黑树搜索效率接近对数级(O(log₂N)),优于线性结构。 文章结合图示和代码逻辑,深入浅出地解析了红黑树
2025-08-21 14:17:38
981
原创 【网络编程】KCP——可靠的 UDP 传输协议——的知识汇总
《基于UDP的高效传输协议KCP设计与应用》摘要:本文介绍了基于UDP协议的高效可靠传输协议KCP的设计原理与应用。通过分析UDP协议的无连接、不可靠等特性,指出其在实时应用中的优势与不足。在此基础上,详细阐述了KCP协议如何通过快速重传、选择性确认等机制实现可靠低延迟传输,特别适用于游戏、实时音视频等场景。文章还通过DNS查询实例展示了UDP报文结构,并对比了UDP与TCP的关键特性,为理解KCP协议的工作机制提供了理论基础。
2025-07-11 16:47:10
1037
原创 【网络编程】 TCP 协议栈的知识汇总
本文从TCP协议栈入手,详细解析了TCP协议的内部结构和数据传输过程。作者通过分析三次握手、数据传输和四次挥手等关键环节,结合Wireshark抓包数据,展示了TCP报文的具体格式和状态迁移。文章还介绍了TCP协议栈在应用层和传输层的位置关系,以及编程中使用的POSIX-API底层函数对TCP报文处理的封装。重点剖析了TCP状态迁移图和报文头部结构,包括端口号、序列号、控制标志位等关键字段的布局和作用。通过对TCP协议从数据结构层面进行微观解析,帮助读者深入理解TCP连接建立、数据传输和终止的全过程。
2025-07-10 16:36:20
519
原创 【网络编程】简易的 p2p 模型,实现两台虚拟机之间的简单点对点通信,并以小见大观察 TCP 协议的具体运行
摘要:本文介绍了P2P(点对点)网络的核心概念、与传统客户端-服务器模型的对比及其典型应用场景。P2P作为去中心化网络架构,具有节点平等、直接通信和资源共享等特点,广泛应用于文件共享、加密货币等领域。文章还提出了一个智能家居场景下的P2P应用构想,并详细解析了如何设计简易点对点通信代码,包括主动连接和被动监听功能,通过多线程和select机制实现。代码实现部分展示了全局状态管理、套接字设置及错误处理等关键技术要点,为构建轻量级P2P系统提供了实用参考。
2025-07-09 00:12:50
970
原创 【网络编程】基于事务驱动 reactor 的 HTTP 服务器的 C 代码
本文介绍了如何在一个事务驱动Reactor服务器的基础上实现HTTP响应功能。通过在原有服务器代码中增加HTTP响应函数,使服务器能够处理HTTP请求并返回响应报文,支持浏览器访问和内容渲染。文章详细讲解了代码修改部分,包括状态机设计、主函数优化和接收回调函数的调整,重点阐述了如何构建HTTP响应报文并处理网络I/O事件。该实现保留了服务器的高性能特性,同时增加了HTTP协议支持,为后续业务功能扩展奠定了基础。
2025-07-03 11:03:38
663
原创 【网络编程】事务驱动 reactor 服务器的百万并发
本文介绍了如何基于EPOLL事件驱动机制实现百万级并发连接的Reactor服务器,重点分析了实现百万并发所需的核心系统参数配置。文章指出实现百万并发的关键在于调整操作系统的文件描述符上限和端口资源配置,并合理管理内存和CPU资源。通过代码优化(如关闭调试输出)和系统调优(扩展端口使用和文件描述符限制),作者展示了一个4G内存服务器如何通过20个监听端口支持360万理论连接。全文从技术原理到实践步骤,为构建高性能服务器提供了实用指导。
2025-07-02 14:28:19
698
原创 【网络编程】事件驱动 reactor 式的服务器(EPOLL机制)
本文介绍了一种基于事件驱动的reactor服务器架构设计,通过模块化方式实现网络I/O高并发处理。文章首先推荐了零声教育的Linux等技术学习资源,然后详细阐述了如何将EPOLL服务器代码拆分为三个核心模块:accept_cb(处理新连接)、read_cb(处理读事件)和send_cb(处理写事件)。通过流程图展示了整体运行机制,并提供了C语言实现的关键代码片段,包括reactor.h头文件定义和主要准备工作。该设计支持业务扩展,可降低开发难度,同时为后续实现百万级并发连接奠定了基础。
2025-06-30 18:35:19
989
4
原创 【网络编程】EPOLL 事件触发机制的服务器
摘要 本文深入探讨了Linux EPOLL机制在构建高效网络服务器中的应用。文章对比了传统I/O模型(一I/O一线程、SELECT、POLL)与EPOLL的性能差异,重点解析了EPOLL的边缘触发(ET)模式工作原理。通过分析内核数据结构(红黑树兴趣列表和就绪链表)和核心API(epoll_create/epoll_ctl/epoll_wait),揭示了EPOLL实现O(1)时间复杂度的高效机制。文章还提供了ET模式下的编程要点:必须使用非阻塞I/O并循环读写至EAGAIN,并附有服务器程序流程图。测试表明
2025-06-28 22:55:11
942
原创 【网络编程】多路复用的网络 I/O 服务器(C代码),select、poll 和多线程共三个版本
摘要 本文介绍了三种实现多路复用网络I/O服务器的方法,重点改进了recv和send函数的使用方式,以实现多路连接和可复用性。案例一采用"一I/O一线程"的多线程模式,通过while循环和阻塞式套接字实现复用。文章首先提供了必要的头文件及服务器初始化函数init_server,随后详细解析了案例一的实现逻辑,包括线程回调函数的设计和服务器主循环结构。该方法通过为每个连接分配独立线程,结合阻塞式I/O操作,确保服务器能够高效处理多路连接请求。
2025-06-28 00:37:42
626
原创 【网络编程】NetAssist 网络调试工具和两个极简服务器的 C 代码
摘要:本文介绍了两个基础的C++服务器开发案例,重点讲解了网络I/O的核心函数recv和send的使用。第一个案例实现了一个"丐版"服务器,只能处理单次网络I/O事务。文章详细解析了服务器创建的流程,包括套接字初始化、端口绑定、监听设置等关键步骤,并通过流程图展示了服务器的基本工作原理。同时提供了完整的C语言实现代码,包括错误处理和端口复用等实用技巧。特别说明了如何使用NetAssist工具进行服务器测试,并解释了局域网内IP地址的交互关系。作者来自零声教育,专注于C/C++后端开发教学
2025-06-26 20:02:01
780
原创 【网络编程】按 HTTPS 加密协议实现客户端请求的 C 代码
HTTPS与HTTP的核心区别在于安全性。HTTPS通过SSL/TLS加密技术,在HTTP基础上增加了数据加密、身份验证和完整性保护功能。主要区别包括:1) HTTPS使用443端口,HTTP用80端口;2) HTTPS传输数据加密,HTTP明文传输;3) HTTPS需要SSL证书验证。HTTPS能有效防止中间人攻击、数据篡改和信息泄露,是银行、电商等安全敏感网站的必备协议。本文还分析了TLS握手流程,并通过流程图展示了HTTPS请求的重定向处理机制。
2025-06-22 18:02:50
1056
原创 【网络编程】实现客户端 HTTP 服务器请求的 C代码
HTTP协议是Web应用中最广泛使用的网络传输协议。本文介绍了HTTP协议的基本概念,并通过Wireshark抓包工具分析了HTTP请求和响应报文的格式结构。请求报文包含方法、资源路径、协议版本和头部信息;响应报文包含状态码、原因短语和响应头部。文章还提供了用C语言实现HTTP客户端访问百度网页的代码示例,包含DNS查询、套接字创建、请求发送和响应接收等关键步骤。代码演示了如何构造HTTP请求报文,建立TCP连接,发送请求并处理服务器响应,最终打印获取的网页内容。
2025-06-20 17:26:00
695
原创 【网络编程】详解 DNS 报文与实现 DNS 域名查询服务的 C 代码
摘要本文介绍了网络抓包工具Wireshark的使用方法和DNS协议基础。Wireshark作为流行的网络封包分析工具,能够截取并详细显示网络数据包信息,帮助开发测试问题定位。文章通过Wireshark抓包实例分析了DNS请求报文和响应报文的结构,包括报头字段(如会话ID、标志位)和正文组成部分(如域名查询类型)。特别讲解了DNS查询解析过程,包括客户端发起查询、递归服务器处理以及CNAME记录的解析机制。文章还提供了零声教育的技术学习资源推荐,涵盖Linux、Nginx、MySQL等多项热门技术内容。
2025-06-18 15:34:15
685
原创 【多线程编程】测试自制的线程池任务队列 C-API
本文介绍了一个基于C语言的线程池任务队列实现方法,使用Linux系统特有的POSIX线程库。文章详细讲解了如何通过引用threadpool_ver1.c文件来创建线程池,并演示了如何定义任务函数、初始化线程池、派发任务和释放资源。示例代码展示了用20个线程执行1000个计数任务的过程,重点说明了多线程任务执行的独立性以及操作系统调度可能导致的任务执行顺序变化。编译时需要链接pthread库,运行结果显示任务基本按队列顺序执行,但由于线程调度仍会出现少数顺序不一致的情况,体现了多线程编程的特点。该实现适用于需
2025-06-16 17:36:14
635
原创 【多线程编程】制作一个线程池任务队列的 C-API
摘要本文介绍了线程池任务队列的原理与实现。线程池使用固定数量的线程处理任务队列,遵循"先入先出"原则但无法保证任务完成顺序。文章详细讲解了三个核心数据结构:采用尾部插入和头部拔除的双向链表任务队列、工人线程链表以及互持引用的线程管理池。提供了C语言实现代码,包括任务队列的宏操作定义、线程回调函数等关键部分。线程池广泛应用于服务器编程、数据处理和网络爬虫等场景,能有效提高程序并发处理能力。实现中使用了pthread线程库和原子操作,并强调了线程安全和锁机制的重要性。
2025-06-16 16:24:19
724
原创 【MySQL-C-API 编程】用 C 语言实现 MySQL 的图片存储
本文介绍了如何使用MySQL C API实现图片数据的远程存储与读取。首先说明了业务场景:通过C程序将图片上传至公司MySQL服务器,再由同事下载使用。文章详细讲解了代码实现步骤,包括检查MySQL开发环境、准备连接参数、设计四个核心函数(读取图片、写入数据库、读取数据库、保存图片)等。关键点在于使用MySQL预处理语句处理二进制图片数据,通过MYSQL_STMT类型和绑定缓冲区实现图片传输。最后提供了完整的代码框架,包括MySQL连接初始化和核心业务流程。该方案适用于需要存储视频等二进制数据的实际应用场景
2025-06-16 02:51:05
793
原创 【MySQL-C-API 编程】MySQL 远程连接与 MySQL 上的 CRUD 操作
针对MySQL学习,提出简化入门方法"CRUD"操作,并解释了MySQL作为服务器的本质特性。文章详细介绍了Linux环境下MySQL的安装步骤,包括解决密码遗忘问题。通过命令行演示了查看系统数据库和用户的方法,并指导如何创建具有全部权限的"admin"用户。最后指出MySQL与Linux系统的良好兼容性,以及C语言API的重要性,强调在Linux环境下进行C编程的优势。全文以实用为导向,帮助读者快速掌握MySQL基础操作和核心概念。
2025-06-15 15:19:54
925
原创 【多线程编程】线程与线程锁的案例讲解
摘要:本文介绍了多线程编程中的线程概念与线程锁机制。通过罗志祥时间管理的生动例子说明线程提高效率的原理,详细讲解了自旋锁和互斥锁的区别与应用场景。在Linux环境下使用pthread库实现了三种线程操作模式(无锁、互斥锁、自旋锁)的对比案例,展示了线程锁对共享变量的保护作用。代码编译需链接POSIX线程库(-lpthread),运行结果显示无锁模式会导致任务丢失,验证了线程锁的必要性。
2025-06-03 13:24:29
998
原创 【链表】使用链表实现通讯录的小项目
本文从链表数据结构的角度解析了关系型数据表(如通讯录)的实现原理。作者通过一个通讯录项目的代码实例,展示了如何使用双向链表构建MySQL式的关系型数据表。文章分为三个层次:底层数据结构层(包含链表结构体和操作方法)、功能支持层(实现增删查改等核心功能)和业务层(用户交互体验)。重点介绍了链表插入/删除的宏定义实现,以及文件读写、记录查找等关键功能的代码逻辑。该项目通过实践演示了如何用链表模拟数据库表格,为理解数据结构与数据库原理提供了实用案例。代码示例详细展示了通讯录系统的内存管理和文件持久化实现方法。
2025-06-03 04:13:19
943
原创 【状态机】实现英文文章各单词的词频统计
本文介绍了一种基于状态机技术的英文文章词频统计方法。首先定义了单词链表和统计链表的数据结构,采用头插法实现链表操作。状态机通过标记关键字符(OUT表示分隔符,IN表示字母)来高效识别单词,并构建单词链表。接着遍历单词链表,在统计链表中记录每个单词的出现频率。代码实现了单词插入、状态识别等核心功能,并处理了连字符等特殊情况。该方法通过状态转换和链表操作,实现了高效的单词统计,最后可规范打印统计结果。文章提供了完整的C语言代码实现,包括文件读取、状态机处理、链表操作等关键技术细节。
2025-06-02 14:31:19
736
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人