将"理论理解 -> 实践验证 -> 项目集成"形成一个闭环,每学完一个知识点进行实践,保证深入理解为未来开发生涯打下坚实的基础。
第一阶段:夯实基础 & 循环学习(理论+实践)
这个阶段的目标是:不仅要知道是什么,还要知道为什么,并且能写代码证明它。
核心知识点清单
类别 | 关键知识点 | 实践建议("弄懂"后立刻动手) |
---|---|---|
C++基础 | 1. 面向对象 :封装、继承、多态(虚函数表原理) 2. 内存管理 :new/delete, malloc/free, 内存布局,栈 vs 堆 3. 关键字 :const, static, extern, volatile, explicit 4. 智能指针 :unique_ptr, shared_ptr, weak_ptr(循环引用问题) 5. RAII 机制与资源管理 | 1. 实现一个简单的字符串类(MyString),处理拷贝构造、赋值运算符 2. 写代码验证虚函数表的的存在(通过指针偏移访问) 3. 用shared_ptr 和weak_ptr 模拟一个循环引用的场景并解决它 |
C++11/14/17新特性 | 1. 移动语义 :右值引用,std::move, 完美转发 std::forward 2. Lambda表达式 3. 类型推导 :auto, decltype 4. 多线程 :std::thread, std::async, std::future 5. 容器:std::unordered_map, std::array, std::tuple | 1. 为你的MyString 类添加移动构造函数和移动赋值运算符,对比性能提升 2. 使用Lambda和std::sort 对自定义结构体向量进行排序 3. 用std::thread 写一个多线程累加程序,并思考数据竞争问题 |
STL | 1. 容器 :vector, list, map, set 的底层实现(数组、链表、红黑树)及时间复杂度 2. 迭代器 :种类及失效问题 3. 算法:find, sort, copy 等 | 1. 对比vector在push_back时与list的性能差异(使用chrono计时) 2. 写代码触发vector的迭代器失效(如插入元素),并分析原因 |
操作系统 | 1. 进程与线程 :区别、通信方式(管道、消息队列、共享内存等)、同步方式(互斥锁、信号量、条件变量) 2. 虚拟内存 :分页、分段、页面置换算法 3. 进程调度 :常见算法 4. 死锁:条件及避免 | 1. 用pthread 或std::mutex 编写一个多生产者-多消费者模型 2. 编写一个简单的程序,使用fork() 创建进程,并用管道进行通信 |
计算机网络 | 1. TCP/IP模型 :各层协议(重点TCP/UDP) 2. TCP :三次握手、四次挥手、状态转换图 、流量控制(滑动窗口)、拥塞控制(慢启动、拥塞避免) 3. HTTP/HTTPS :报文格式、方法、状态码、缓存、SSL/TLS握手过程 4. Socket编程 | 1. 必做 :用Socket API(C/C++)写一个简单的TCP回显服务器(Echo Server)和客户端 2. 使用Wireshark抓包,亲眼查看TCP三次握手、HTTP请求响应的原始报文 |
数据库(MySQL) | 1. 索引 :B+树原理、聚簇/非聚簇索引、最左前缀原则 2. 事务 :ACID特性、隔离级别、幻读/不可重复读 3. 锁 :乐观锁、悲观锁、行锁、表锁、间隙锁 4. SQL优化:Explain命令 | 1. 创建一张表,插入百万数据,对比有索引和无索引的查询速度 2. 开启两个MySQL会话,模拟事务的不同隔离级别下出现的问题 |
设计模式 | 1. 单例模式 (线程安全) 2. 工厂模式 3. 观察者模式 4. Reactor模式 (对网络服务器极其重要) | 1. 实现一个线程安全的懒汉/饿汉单例 2. 必做:实现一个简单的Reactor模型(事件驱动),这是你后续HTTP服务器的核心 |
第二阶段:高性能HTTP服务器项目
这是你简历上的亮点,能串联起上面绝大部分知识点。
项目核心特性与目标
-
核心技术 :IO多路复用(epoll)。这是"高性能"的基石。
-
核心架构 :Reactor模式(单Reactor多线程/多进程,或多Reactor)。这是现代高性能网络服务器的标准设计。
-
编程语言:C++17/20
-
目标:能处理高并发连接(数千以上),性能指标可通过压测工具(如wrk)进行验证。
功能模块拆解
-
基础网络库(核心中的核心)
-
封装Socket API
-
封装Epoll,实现事件循环(Event Loop)
-
实现Channel类,负责每个fd的事件分发
-
实现Acceptor类,负责处理新连接
-
实现EventLoopThreadPool,线程池,这是支持高并发的关键。
-
-
HTTP处理模块
-
HTTP请求解析器(Parser):状态机解析HTTP报文。
-
HTTP响应构建器。
-
实现静态资源请求(URL映射到本地文件)。
-
实现简单的API(如返回当前时间)。
-
-
高级特性(加分项)
-
定时器 :用于处理超时连接(如
std::priority_queue
或时间轮)。 -
数据库连接池:集成MySQL,支持用户登录/注册等功能。
-
日志系统 :异步日志(生产者-消费者模型),记录服务器运行状态。
-
配置文件解析。
-
支持HTTP长连接(Connection: keep-alive)。
-
学习与开发路径
-
先模仿 :学习 muduo/libevent 等优秀网络库的设计思想。切忌直接抄代码,理解其Class划分和数据流。
-
再动手:
-
第一步:实现一个最简单的Reactor,能接受连接并回显消息(基于你之前的Echo Server)。
-
第二步:加入线程池,让IO线程和计算线程分离。
-
第三步:加入HTTP解析模块。
-
第四步:一步步添加定时器、日志等高级功能。
-
-
测试与优化:
-
使用 wrk 或 ab 进行压测,查看QPS(每秒请求数)。
-
使用 valgrind 检查内存泄漏。
-
使用 perf 进行性能分析,找出热点函数。
-
面试准备
-
复盘项目:必须能清晰地讲出你的HTTP服务器的架构、为什么这么设计、遇到了什么困难、如何解决的、性能如何。
-
刷题 :LeetCode(Top 100-150题,至少刷两遍)。重点:链表、树、二分查找、动态规划、回溯、栈/队列。
-
八股文:基于第一阶段的知识点,进行系统性复习和背诵。你通过实践理解的"八股",会比别人深刻得多。
资源推荐
-
书籍:
-
《C++ Primer》
-
《Effective C++》
-
《STL源码剖析》
-
《TCP/IP网络编程》(尹圣雨)
-
《Linux多线程服务端编程》(陈硕,muduo作者)
-
《MySQL技术内幕:InnoDB存储引擎》
-
-
视频:
-
侯捷老师的C++系列课程
-
牛客网、慕课网上的实战项目课(可以看思路,代码要自己写)
-
-
开源库:
总结
学习一个知识点 -> 写代码验证 -> 记入笔记/博客 -> 思考如何用到HTTP项目中 -> 集成到项目里。