项目经验
一、水声声呐数据采集软件(实习项目)
公司:北京中科海迅科技股份有限公司
岗位:C++研发工程师
时间:2025年1月 – 2025年6月
项目简介
参与水声声呐相关数据采集软件的研发,该系统涵盖数据采集、状态管理、任务管理、数据存储等多个模块。我主要负责任务管理模块中项目整体执行逻辑的开发,具体工作包括:
负载均衡与任务调度:设计并实现任务分配策略,保障多任务下系统资源的合理利用。
数据采集与心跳监控:实现数据采集任务的状态统计与心跳检测,及时发现异常任务。
任务故障转移:设计故障转移机制,当节点或任务异常时自动迁移任务,提升系统可靠性。
数据库写入:将任务信息持久化到 PostgreSQL 数据库。
网络与服务发现:使用 RCF(远程调用框架)、nanomsg、mDNS 实现模块间通信与服务自动发现。
消息队列集成:利用 Kafka 实现任务状态的高吞吐传输。
并发与设计模式:采用单例模式、多线程技术保证模块的高效与安全。
网络设备配置:了解并参与华为交换机、路由器的基本配置,保障网络环境稳定。
涉及技术
RCF、Kafka、PostgreSQL、nanomsg、mDNS、单例模式、多线程、华为交换机与路由器配置。
二、无锁内存池(个人项目)
项目简介
参考 tcmalloc 的设计思想,实现了一个适用于多线程环境的高并发内存池,通过三层缓存结构显著降低多线程频繁申请内存时的锁竞争问题。
Thread Cache(线程缓存)
每个线程独享,用于分配小于 256KB 的内存。线程从此层申请内存无需加锁,实现无锁化分配,提升并发性能。
Central Cache(中心缓存)
为 Thread Cache 分配内存,并在适当时机回收 Thread Cache 中的空闲对象。通过桶锁(细粒度锁)控制竞争,避免单个线程占用过多内存,实现多线程间的内存均衡调度。
Page Cache(页缓存)
从系统以页为单位分配大块内存,并切割为固定大小的小块提供给 Central Cache。回收 Central Cache 中满足条件的 Span 对象,并合并相邻的物理页以形成更大的连续内存,有效缓解内存碎片问题。
技术亮点
无锁设计(Thread Cache 层)
细粒度锁(桶锁)
内存页合并与碎片管理
三、负载均衡在线OJ(个人项目)
项目简介
采用 MVC 架构,实现了一个支持负载均衡的在线编程判题系统。用户可通过浏览器访问题目列表,在线编写并提交代码,后端自动分配服务器资源,在保证负载均衡的前提下提供高效的代码编译与运行环境。
核心模块
comm(公共模块)
提供通用工具类,包括文件名处理、时间获取、日志记录、字符串处理等基础功能。
compile_server(编译运行模块)
接收代码文件,调用编译器进行编译并执行,返回运行结果。
oj_server(核心服务模块)
负责题目列表获取、题目详情展示、在线编辑界面、负载均衡调度、判题逻辑以及网页渲染。网页前端使用了 HTML/CSS/JS 及 Ace 在线编辑器,后端通过 cpp-httplib 提供 HTTP 服务,并使用 ctemplate 进行动态页面渲染。
负载均衡设计
当用户提交代码时,oj_server 根据后端各编译服务器的实时负载情况(如任务队列长度、响应时间等),动态选择最优节点执行判题任务,确保整体服务的高吞吐与低延迟。
涉及技术
C++ STL、Boost(字符串切割)、cpp-httplib、ctemplate、jsoncpp、多进程、多线程、MySQL C API、Ace 前端编辑器、HTML/CSS/JS/jQuery/Ajax。