- 博客(16)
- 收藏
- 关注
原创 shared_ptr实现中的RAII思想
本文介绍了C++中shared_ptr的实现原理,重点讲解了其三大核心机制:引用计数、原子操作和RAII思想。通过简化版shared_ptr代码示例,展示了构造函数、拷贝构造、移动语义等关键实现细节,说明如何通过引用计数管理共享资源,使用原子操作保证线程安全,并利用RAII实现资源自动释放。相比unique_ptr,shared_ptr更适合需要资源共享的场景,如线程池等。文章还分析了shared_ptr在异常安全和多线程环境下的可靠性。
2026-05-12 17:11:45
362
原创 谈C++智能指针对资源管理的优势
本文探讨了智能指针在现代C++中的核心作用。通过对比传统new/delete的内存管理方式,指出其易出错和异常不安全等缺陷。智能指针通过RAII机制,在对象析构时自动释放资源,有效解决了资源泄漏问题。文章以unique_ptr为例展示了其优势,同时也指出智能指针的局限性——在底层内存分配器等场景仍需使用malloc/free等底层操作。最后强调智能指针作为现代C++的重要特性,极大提升了资源管理的安全性和便利性,但对底层系统编程仍需保持敬畏。全文1800字,阅读约5分钟。
2026-05-10 16:13:59
349
原创 踩坑记录——eBPF实现实时数据主从同步
本文介绍了基于eBPF技术实现kv存储项目实时数据同步的方案。通过KProbe挂载内核函数捕获数据,采用内核态轻量处理+用户态复杂逻辑的架构设计,在保证约20%性能损耗下实现了零侵入同步。文章总结了开发过程中的三大关键经验:1)内核态代码保持精简以通过Verifier检查;2)选择TCP接收阶段而非发送阶段进行hook;3)优先实现基础功能,避免过度设计。测试表明该方案能稳定实现主从同步,为类似项目提供了可行的eBPF应用参考。
2026-04-08 15:10:06
449
原创 RDMA介绍
RDMA(Remote Direct Memory Access)和DMA (Direct Memory Access)相比,多了一个Remote,功能也就从单机内部的通信拓展到了机间的通信。RDMA是一种内核旁路的技术,通过RDMA,数据收发可以通过网卡直接实现,从而不需要传统的send_buffer -> sk_buffer ->网卡的多次拷贝路径,这种零拷贝的方式大大减少了系统级的开销,因此RDMA技术广泛用于云存储、数据中心等场景。
2026-03-31 19:51:37
391
原创 AI辅助实现心得分享 - RDMA优化KVstore已有数据同步
本文通过AI辅助编程成功将kvstore项目的主从同步从TCP sendfile迁移到RDMA零拷贝传输,实现了: 消除高并发场景下的系统调用开销 利用RDMA内核旁路直接网卡传输 保持单线程无锁设计,与原有reactor架构无缝集成
2026-03-12 17:06:36
534
原创 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
447
原创 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
210
原创 变长内存池实现
本文介绍了一个轻量级高性能KV存储项目中的内存池设计。该内存池采用双模式分配策略:对于小内存请求(≤4KB)使用定长内存池管理,通过线性分配和显式空闲链表实现高效分配;对于大内存请求直接调用malloc,由单独链表管理。内存池结构包含小内存节点链表和大内存块链表,支持动态扩容和内存对齐。性能测试表明,相比jemalloc可提升20%的QPS。项目通过宏定义实现内存分配组件的灵活切换,已成功应用于KV存储系统,支持8万+QPS的高性能场景。
2026-02-25 01:00:00
662
原创 定长内存池的实现
本文介绍了定长内存池的设计与实现,旨在解决服务器长期运行时因内存碎片导致的性能问题。内存池通过预分配大块连续内存,使用显式空闲链表管理固定大小的内存块,提供创建、销毁、分配和释放四个核心接口。关键实现包括:1) 内存池结构体设计,记录块大小、空闲数量及指针;2) 创建时初始化链表,通过强制类型转换正确存储下一空闲块地址;3) 分配时更新空闲指针和计数;4) 释放时采用头插法维护链表。该方法避免了频繁malloc/free调用,提高了内存使用效率和稳定性。
2026-02-21 12:14:24
607
原创 【kv存储】基于fwrite/fread的简单主从同步实现
当客户端发送命令时,识别到非PSYNC连接,进普通命令处理的逻辑,但是现在多一条处理----调用kvs_replication_feed_slaves()。最直接了当的方式是开一台仆从服务器,作为主服务器的“备份”,一旦主服务器下线,仆从服务器立即充当主服务器的角色继续服务客户端。进一步解释,请考虑如下函数,根据传入参数的不同,主机(初始化默认主机)可降级为从机,而从机可以晋升为master(从主转换)接受accept之后立即触发全量同步,遍历红黑树,并且以SET命令的形式发送到从机。
2026-02-13 18:18:54
338
原创 【kv存储】增量和存量持久化
存量持久化,即从现有的数据结构当中保存key-value键值对,在存量持久化的实现当中,我采用了二进制数据格式,而不是RESP,这是为了避免解析所产生的开销,试想如果存储的value非常大,如果还需要透过解析函数来恢复数据,将非常严重地拖慢系统性能。$5\r\nAlice\r\n ← 第三个元素:长度5,内容是"Alice"$3\r\nSET\r\n ← 第一个元素:长度3,内容是"SET"$3\r\n123\r\n ← 第二个元素:长度3,内容是"123"*3\r\n ← 数组有3个元素。
2026-02-05 23:23:38
358
原创 【kv存储】如何集成不同的网络架构
kvs_protocol函数的功能是:按照用户态kv存储协议来解析请求内容并且回发,这是分离网络io层的关键,网络架构层不需要考虑kv存储的用户态协议的实现、如何拆分键值对、用何种数据结构存储数据,比如在reactor.c当中,kvs_protocol就是kvs_handler。我们的目标是当网络io就绪的时候调用recv和send,但是如果网络io未就绪,则系统阻塞,我们必须先等待,协程的上下文切换可以让我们聪明地从这种等待当中脱身,现在我们同步的编程方式仍不变,但是在不同的上下文中切换。
2026-02-01 23:28:32
672
原创 基于epoll的TCP服务器实现
使用红黑树来管理全部需要监控的描述符(简称为整fd集)、双向链表来管理已就绪的描述符(就绪fd集),并且在事件就绪的时候由内核直接通知用户空间,避免不必要的内存复制。这里为了提升TCP服务器的性能,我们采用for循环创建多个端口(port+i),并且将这些端口与sockfd绑定,使用listen监听,再将这些端口的事件都会被加入epoll实例中。我们使用epoll_wait函数,当事件就绪的时候(EPOLLIN,EPOLLOUT)需要处理这些事件,指定timeout = 5,避免不必要的系统资源占用。
2026-01-18 17:36:31
322
原创 Mysql实战——二进制数据读写
Mysql提供了许多C API函数,借此我们可以使用实现一个客户端(位于NS)用于对mysql数据库进行读取和写入操作。
2026-01-16 21:36:08
392
原创 纯C实现线程池
现在我们置位后使用pthread_cond_broadcast函数将所有阻塞在条件等待的线程全部唤醒,这些线程就会关闭并且从链表中删去,相比于直接将pool实例中的工作队列和任务队列全部置为NULL,这样做才能避免内存泄漏的危险。工作队列当中定义了一个int terminate,作用是当线程中的工作已经完成,将其置位以打破循环退出。while(1)循环判断任务队列当中是否有任务,如果没有任务就阻塞等待(之前的pthread_cond_wait条件等待),有任务就执行任务。线程池是一个服务器的基础组件,由。
2026-01-16 17:26:44
370
原创 深入简出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
634
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅