- 博客(40)
- 收藏
- 关注
原创 【C++】STL源码仿写(二):vector
本文介绍了STL vector的简化实现,基于模板设计,核心成员包括数据指针data_、大小size_和容量capacity_。重点实现push_back与pop_back:通过emplace_back结合完美转发与放置新式(placement new)支持左右值;扩容时采用reallocate,确保异常安全;析构函数调用clear()释放对象并deallocate()内存。遵循Rule of Five,仅实现析构函数,其余操作禁用。补充了back()、operator[]等接口,完整覆盖基本功能。
2026-10-07 16:59:35
209
原创 【C++】STL源码仿写(一):string
本文通过简化STL string实现,手撕核心机制:基于char*、size_与capacity_管理内存,遵循Rule of Five实现RAII,支持C风格与二进制安全字符串构造,完成拷贝/移动语义及append等接口。采用翻倍扩容策略,辅以reserve预分配,兼顾性能与安全性,助读者在低复杂度下掌握STL容器设计精髓。
2026-10-02 20:22:59
243
原创 【kv存储】结合faiss构建向量内存数据库
Faiss结合KV存储实现向量功能,架构命令VSET/VGET/VDEL,实现细节包括索引、哈希表,总结。控制字数。</think>Faiss是高效向量相似性搜索库,本文介绍将其与KV存储结合,通过VSET、VGET、VDEL命令实现向量存取与删除。设计采用IndexIDMap支持自定义ID,利用哈希表维护键值映射,支持向量搜索与阈值比较。实现简单,适合小规模数据,大数据可扩展至PQ、IVF、HNSW等高级算法。
2026-09-06 14:30:45
182
原创 五分钟概念速递——eBPF与XDP
BPF(berkeley package filter)技术,曾经是内核中相当冷门的一项过滤网络数据包的技术,然而,后来随着大佬们的拓展迭代,诞生了 eBPF(extended berkeley package filter ),现在已经成为了内核技术中最具备革命性的通用型技术,由于 Linux 官方手册中并未区分 BPF 和 eBPF,本文将这两个词作为同义词使用。
2026-08-26 19:19:46
245
原创 【kv存储】AOF落盘方案对比——iouring vs 传统线程
本文对比了Redis的三种落盘策略(no、always、everysec)及其数据安全性差异,重点分析了everysec策略下两种实现方式的性能表现。测试数据显示,传统后台线程方案与io_uring异步落盘方案在SET/GET操作时性能下降幅度相近(3-4%),但io_uring方案省去了常驻线程的开销。作者指出当前io_uring实现尚未充分发挥其批量处理优势,未来将探讨进一步优化方案。文章通过具体数据揭示了不同落盘机制对系统性能的影响,为数据库持久化策略选择提供了参考。
2026-08-20 14:41:46
206
原创 【kv存储】全量持久化方案设计
本文介绍了KV存储中全量数据持久化的两种实现方式:同步阻塞的SAVE和异步非阻塞的BGSAVE。同步SAVE会阻塞主线程,影响服务响应;而BGSAVE通过fork子进程利用写时复制(COW)机制,在子进程中完成数据快照,主线程可继续处理请求。重点分析了COW机制的工作原理,即子进程读取fork时的内存快照,父进程后续修改会触发内存复制,从而保证快照数据的一致性。文章还展示了相关C语言实现代码,并讨论了子进程需要关闭继承的epoll文件描述符等实现细节。
2026-08-18 18:13:25
220
原创 KVStore 持久化优化实践:无锁RingBuffer的使用
本文介绍了vemory项目中的增量持久化(AOF)设计与实现,重点阐述了RingBuffer缓冲区设计思路。通过采用无锁SPSC模型的后台刷盘线程,在单线程架构下实现了高性能AOF机制,测试显示AOF开启仅导致3%的性能损失,远低于Redis的15%。文章详细解析了RingBuffer的工作流程、技术权衡及优雅关闭机制,包括信号处理和定时器轮询等关键技术点,确保了数据持久化的可靠性。该项目在保证数据安全性的同时,最大程度减少了性能开销,为内存数据库的持久化提供了高效解决方案。
2026-08-15 18:27:45
279
原创 Mysql实战——图片读写
这篇博客介绍了如何用C语言实现MySQL数据库的图片二进制读写功能,适用于节点服务器(NS)。主要内容包括:1)基础环境配置(MySQL权限、gcc工具链、libmysqlclient-dev连接器);2)通过mysql.h库实现数据查询功能,包括结果集处理与内存管理;3)使用预处理语句实现二进制数据的分段写入(mysql_stmt_send_long_data);4)分段读取二进制数据(处理数据截断情况)。技术重点涉及连接句柄、预处理语句的安全优势、MYSQL_BIND参数绑定,以及大文件的分段传输机制。
2026-08-09 01:24:37
159
原创 使用shell查看当前局域网宕机的IP地址
本文介绍了在macOS系统下使用shell脚本扫描局域网存活设备的方法。首先通过ifconfig命令获取本地IP网段(192.168.1.x),然后编写bash脚本利用for循环遍历1-254地址,使用ping命令检测各IP的连通性。初始版本会显示完整ping输出,改进版通过重定向到/dev/null简化输出,仅显示IP状态(up/down)。文中还提供了局域网IP地址分配的基本知识,包括网络地址、网关、可用主机范围和广播地址的说明。这种方法可以帮助用户快速发现网络中的活跃设备。
2026-08-09 01:20:14
172
原创 CSAPP:ProxyLab讲解与实现
本文介绍了如何从CS:APP的ProxyLab实验出发,逐步构建和改进一个简单的代理服务器。首先阐述了互联网的基本通信原理和客户端-服务器模型,重点讲解了套接字编程的基础知识,包括socket、connect、bind、listen、accept等关键函数。通过实现一个Naive版本的代理服务器,分析了其在并发处理和高性能请求方面的不足。随后提出了两种改进方案:使用I/O复用技术(select函数)来监控多个连接请求,以及引入线程池技术来处理高负载请求。文章为想要学习实用网络编程的读者提供了从基础到进阶的知
2026-08-09 01:16:39
187
原创 实现TCP发送HTTP请求
HTTP协议是最被广泛使用的网络传输协议,所有www文件都必须遵守这个标准,并且,HTTP基于TCP/IP通信协议来传递数据,本文的主要内容是介绍HTTP请求的的格式,并且使用C语言以TCP的方式来实现请求的发送。
2026-08-09 01:12:20
224
原创 用UDP实现向DNS服务器请求IP地址
第一个步骤比较关键,因为构造请求报头的内容需要我们熟悉相关协议的内容和结构,而解析响应报文的代码一般比较固定,在实际项目中可以直接借用,并不需要做深入理解。为了用UDP来发送报文,我们还需要一些网络编程的知识,本文集中了介绍。
2026-08-09 01:08:26
163
原创 定时器的介绍与实现
定时器是管理大量延时任务的模块,常见可以用红黑树等数据结构作为容器组织所有延时任务,通过超时检测来触发并执行任务(可以理解为异步非阻塞)触发时刻作为Key,延时任务作为Val(需要允许Key重复),本实现中选择STL中的multimap(底层是红黑树)
2026-06-25 18:13:51
305
原创 【C++】五分钟带你了解C++系列(七):综合案例——线程池
我们的《五分钟带你了解C++系列》终于迎来了尾声!在这里用一个”富含“C++特性的线程池作为综合案例来为本系列画上句号。如果你没有了解过C++,或者对线程池不熟悉,可以先参考。
2026-06-23 11:02:20
217
原创 【C++】五分钟带你了解C++系列(六):异步处理
我们日常写的程序大部分的都是基于同步( Synchronous),即按编码顺序一条条执行——这是最符合人类直觉的编码方式,然而当I/O的速度和CPU计算的速度不匹配时,会出现CPU资源浪费,为了解决这种问题,C++提供了异步(Asynchronous)处理的方法。
2026-06-22 16:37:06
317
原创 【C++】五分钟带你了解C++系列(五):类型推导
类型推导就是编译器帮助你自动将复杂的类型”猜出来“,从而不需要在代码里写冗长的类型名,主要涉及auto和decltype。
2026-06-22 01:06:49
357
原创 【C++】五分钟带你了解C++系列(四):可变参数模板
讲了完美转发(perfect forward)可用于构建工厂模式。可变参数模板主要用于工厂函数中参数的传递。——既能接收左值也能接收右值的引用,通过推导模板T的类型而实现同时兼容左右值,常配合完美转发出现。下面是通用创建的工厂函数,传递参数时使用的是。当中包含的字段是可变数目的参数。
2026-06-21 00:09:28
279
原创 【C++】五分钟带你了解C++系列(三):完美转发
这个函数的功能是将arg1,arg2按值传递给模板类T,获取一个指向T实例的指针,但是,使用者调用create的时候,可能传进以下几种arg1值。move强行改变左值为右值,完美转发forward则使值的属性(左值右值性、const/volatile修饰符等)完全保留。讲了左右值引用和移动语义,完美转发(Perfect Forwarding)是经常容易与移动语义相混淆的特性。场景2,3中传递进create的是右值,我们期望使用。,我们定义一个简单的create方法来承接创建功能。,从而值也变成了左值。
2026-06-20 14:42:06
306
原创 【C++】五分钟带你了解C++系列(二):移动语义
本文介绍了C++中的移动语义及其实现方式。首先通过unique_ptr的例子说明移动语义的必要性,解释了左值和右值的区别,以及move()函数将左值强制转换为右值的机制。然后详细解析了unique_ptr的简易实现,重点分析了移动构造函数和移动赋值函数的实现原理,展示了如何通过右值引用来实现资源所有权的转移,避免了拷贝带来的性能开销或限制。文章指出移动语义是C++11引入的重要特性,能够有效提升资源管理的效率。
2026-06-17 17:29:57
247
原创 【C++】五分钟带你了解C++系列(一):智能指针
shared_ptr功能强大,但是引入了引用计数、控制块、编码复杂度等额外开销,所以,除非资源拥有明确的共享关系,一般使用unique_ptr是最优。循环引用是 shared_ptr 的经典问题: A 对象拿着一个指向 B 的 shared_ptr,B 对象也拿着一个指向 A 的 shared_ptr,他们之间的相互引用,导致无论如何。unique_ptr 起到了对资源生命周期的自动管理的作用,即自动构造、自动析构。ref_count_拷贝时增加,析构时减少,最后一个使用者使用完毕负责释放资源。
2026-06-16 11:33:21
263
原创 Protobuf介绍
摘要:Protobuf(Protocol Buffers)是Google开发的二进制数据序列化协议,支持跨语言使用,特别适用于微服务通信和数据持久化。相比JSON等文本格式,Protobuf具有更高的传输效率和更小的数据体积。文章详细解析了Protobuf的工作流程、消息定义、字段修饰符(required/optional/repeated)、数据类型(基本类型、枚举、map)以及高级特性(如oneof互斥字段和package命名空间)。通过语法示例和压缩性对比,帮助开发者快速掌握Protobuf的核心用法
2026-06-08 23:02:21
209
原创 学校不是学技术的地方
摘要: 作者反思大学计算机教育的不足,指出学校课程(如谭浩强C++教材)脱离实际,消磨编程热情。毕业后求职受挫,意识到学历并非万能,转而自学MIT的SICP、CSAPP等课程,重燃技术兴趣。赴港读研后发现AI理论教学仍缺乏技术实践,遂通过在线课程(如零声教育)参与Linux C++项目开发,从KV存储实践中领悟“边学边做”的重要性,强调工程师思维(解决问题)优于学生思维(应试)。文末呼吁计算机学生尽早摆脱对学校的依赖,通过项目实战培养技术自信与工程能力。 (150字)
2026-05-25 22:25:18
331
原创 为什么会有缓存一致性的问题?
计算机缓存体系通过多级缓存(L1/L2/L3)显著提升性能,但引入了缓存一致性问题。由于多核CPU各核心拥有独立缓存(L1/L2)和共享缓存(L3),采用写回策略时会导致各核心缓存数据与主存不一致。解决方案包括总线嗅探机制和MESI协议,后者通过Modified、Exclusive、Shared、Invalid四种状态管理缓存行,确保数据一致性。该机制通过监控总线事务和状态转换,协调多核间的数据访问,在提升性能的同时维护内存正确性。
2026-05-25 02:07:08
45
原创 【C++】STL源码仿写(三):shared_ptr
shared_ptr通过引用计数实现资源共享,支持多对象共用同一资源,解决unique_ptr独占限制。其核心为原子引用计数,确保多线程安全;结合Rule of Five,通过拷贝/移动语义精确管理生命周期。构造时计数为1,拷贝时+1,析构时-1,归零则释放资源。移动操作转移所有权,避免重复释放。该机制保障了资源自动管理与线程安全,是实现高效、安全资源共享的关键。
2026-05-12 17:11:45
413
原创 谈C++智能指针对资源管理的优势
本文探讨了智能指针在现代C++中的核心作用。通过对比传统new/delete的内存管理方式,指出其易出错和异常不安全等缺陷。智能指针通过RAII机制,在对象析构时自动释放资源,有效解决了资源泄漏问题。文章以unique_ptr为例展示了其优势,同时也指出智能指针的局限性——在底层内存分配器等场景仍需使用malloc/free等底层操作。最后强调智能指针作为现代C++的重要特性,极大提升了资源管理的安全性和便利性,但对底层系统编程仍需保持敬畏。全文1800字,阅读约5分钟。
2026-05-10 16:13:59
383
原创 踩坑记录——eBPF实现实时数据主从同步
本文探讨了在KV存储中使用eBPF实现主从同步转发时遇到的性能问题。测试表明,相比直接使用send转发,eBPF方案在SET操作中带来额外18%的性能损失(约28µs/条),主要原因是uprobe陷入内核态的开销过大。文章指出两个关键设计缺陷:一是错误选择了用户态hook点导致频繁内核切换,二是忽视了eBPF verifier对512字节栈空间的限制,使得无法直接在网络接收层提取完整数据。这些经验揭示了eBPF在高性能场景下的实现挑战,需要平衡安全限制与性能需求。
2026-04-08 15:10:06
537
原创 五分钟概念速递——RDMA
RDMA通过内核旁路与零拷贝技术实现高效机间通信,支持IB、RoCE、iWARP协议,主流选择RoCEv2。核心概念包括QP(发送/接收队列)、CQ完成队列、MR内存注册及PD保护域。工作模式分双边Send/Recv(需远端CPU参与)和单边Read/Write(远端无感,适合大数据传输),广泛应用于云存储和数据中心。
2026-03-31 19:51:37
443
原创 AI辅助实现心得分享 - RDMA优化KVstore已有数据同步
本文通过AI辅助编程成功将kvstore项目的主从同步从TCP sendfile迁移到RDMA零拷贝传输,实现了: 消除高并发场景下的系统调用开销 利用RDMA内核旁路直接网卡传输 保持单线程无锁设计,与原有reactor架构无缝集成
2026-03-12 17:06:36
587
原创 KVStore 持久化优化实践:基于 io_uring 的异步 AOF 落盘
本文介绍了基于 io_uring 的异步 AOF 落盘优化实践。原同步 fwrite 持久化导致 KVStore 性能从 19.4 万 QPS 骤降至 3.2 万 QPS。通过分析发现磁盘 I/O 阻塞是主要瓶颈。优化方案采用 io_uring 异步接口,设计二级缓冲区机制(aof_buffer + pending_writes)解决数据生命周期问题,实现主线程非阻塞提交写入请求。关键实现包括:命令批量缓冲、io_uring 异步提交、非阻塞完成检查。该方案显著降低持久化对主线程的影响,提升系统整体吞吐量。
2026-03-09 17:22:04
510
原创 KVStore 持久化优化实践:基于mmap内存映射取代拷贝式加载
mmap核心概念文件映射到进程地址空间按需加载(缺页中断)零拷贝(直接使用映射内存)mmap的使用mmap参数详解addr:映射起始地址(通常NULL)length:映射长度(fstat获取文件大小)prot:保护标志(PROT_READ/PROT_WRITE)flags:映射标志(MAP_PRIVATE/MAP_SHARED)fd:文件描述符offset:文件偏移量(通常0)辅助函数open():打开文件fstat():获取文件大小close():关闭文件描述符munmap():解除映射。
2026-03-07 17:34:40
227
原创 变长内存池实现
本文介绍了一个轻量级高性能KV存储项目中的内存池设计。该内存池采用双模式分配策略:对于小内存请求(≤4KB)使用定长内存池管理,通过线性分配和显式空闲链表实现高效分配;对于大内存请求直接调用malloc,由单独链表管理。内存池结构包含小内存节点链表和大内存块链表,支持动态扩容和内存对齐。性能测试表明,相比jemalloc可提升20%的QPS。项目通过宏定义实现内存分配组件的灵活切换,已成功应用于KV存储系统,支持8万+QPS的高性能场景。
2026-02-25 01:00:00
686
原创 定长内存池的实现
本文介绍了定长内存池的设计与实现,旨在解决服务器长期运行时因内存碎片导致的性能问题。内存池通过预分配大块连续内存,使用显式空闲链表管理固定大小的内存块,提供创建、销毁、分配和释放四个核心接口。关键实现包括:1) 内存池结构体设计,记录块大小、空闲数量及指针;2) 创建时初始化链表,通过强制类型转换正确存储下一空闲块地址;3) 分配时更新空闲指针和计数;4) 释放时采用头插法维护链表。该方法避免了频繁malloc/free调用,提高了内存使用效率和稳定性。
2026-02-21 12:14:24
622
原创 【kv存储】实时主从同步实现与eBPF旁路转发方案
本文探讨了实时数据主从同步的实现方案,首先介绍了基于Redis的主从同步机制,包括全量数据同步和增量数据变更两个阶段。其次分析了传统send网络转发方案存在的性能开销问题,如多次编码和数据拷贝。最后提出一种eBPF旁路转发优化方案:通过hook解析函数获取命令参数,利用ringbuf传递数据,用户态程序编码后转发,从而减少主机处理负担。该方案通过内核旁路技术提升了转发效率,为实时数据同步提供了新的优化思路。
2026-02-13 18:18:54
370
原创 【kv存储】如何集成不同的网络架构
kvs_protocol函数的功能是:按照用户态kv存储协议来解析请求内容并且回发,这是分离网络io层的关键,网络架构层不需要考虑kv存储的用户态协议的实现、如何拆分键值对、用何种数据结构存储数据,比如在reactor.c当中,kvs_protocol就是kvs_handler。我们的目标是当网络io就绪的时候调用recv和send,但是如果网络io未就绪,则系统阻塞,我们必须先等待,协程的上下文切换可以让我们聪明地从这种等待当中脱身,现在我们同步的编程方式仍不变,但是在不同的上下文中切换。
2026-02-01 23:28:32
693
原创 epoll介绍与TCP服务器实战
本文介绍了Linux中的epoll机制及其在网络编程中的应用。epoll是一种高效的IO多路复用技术,相比select/poll具有显著优势:采用红黑树管理兴趣列表,双向链表管理就绪列表;能直接返回就绪事件;支持边沿触发模式。文章详细解析了epoll相关函数(epoll_create/ctl/wait)和事件类型,比较了水平触发(LT)和边沿触发(ET)的区别。最后通过一个TCP服务器实现示例,展示了如何利用epoll同时监听多个端口,处理连接请求和数据接收,其中监听套接字采用边沿触发模式,客户端套接字采用
2026-01-18 17:36:31
347
原创 Mysql实战——二进制数据读写
Mysql提供了许多C API函数,借此我们可以使用实现一个客户端(位于NS)用于对mysql数据库进行读取和写入操作。
2026-01-16 21:36:08
418
原创 纯C实现线程池
现在我们置位后使用pthread_cond_broadcast函数将所有阻塞在条件等待的线程全部唤醒,这些线程就会关闭并且从链表中删去,相比于直接将pool实例中的工作队列和任务队列全部置为NULL,这样做才能避免内存泄漏的危险。工作队列当中定义了一个int terminate,作用是当线程中的工作已经完成,将其置位以打破循环退出。while(1)循环判断任务队列当中是否有任务,如果没有任务就阻塞等待(之前的pthread_cond_wait条件等待),有任务就执行任务。线程池是一个服务器的基础组件,由。
2026-01-16 17:26:44
382
原创 深入简出Reactor——业务解耦、化繁为简
本文介绍了Reactor模式在服务器开发中的应用,通过封装epoll实现网络I/O与业务逻辑的解耦。Reactor采用同步非阻塞方式处理I/O,将事件监听分发与事件处理分离。文章详细阐述了连接结构体conn的设计、epoll事件注册机制(set_event/event_register)以及三种核心回调函数(accept_cb/recv_cb/send_cb)的实现。主循环通过epoll_wait监听事件并触发对应回调。最后展示了业务层如何基于Reactor提供的缓冲区(rbuffer/wbuffer)实现
2026-01-13 17:39:54
657
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅