TinyWebServer 是一个用 C++14 从零构建的 Web 服务器,适用于学习 Linux 网络编程、I/O 多路复用、并发模型与 HTTP 协议实现。
### 核心技术
| 技术点 | 实现 |
|--------|------|
| **I/O 多路复用** | epoll (ET/LT 可切换) |
| **并发模型** | Reactor + 半同步/半反应堆 (HSHA) |
| **线程池** | 固定大小线程池 + 条件变量 + shared_ptr 安全设计 |
| **HTTP/1.1** | 手写状态机解析器 + Keep-Alive 长连接 |
| **零拷贝** | mmap 内存映射文件传输 + writev 集中写 |
| **定时器** | 小根堆 (二叉堆 + 哈希索引) O(log n) 超时管理 |
| **数据库** | MySQL 连接池 + RAII 守卫 + SQL 注入防护 |
| **日志** | 异步日志系统 (生产者-消费者 BlockDeque) + 日期/行数切分 |
| **缓冲区** | 用户态 Buffer (readv 分散读 + 动态扩容 + 原子指针) |
这个项目采用经典的 Reactor + 半同步/半反应堆(HSHA)架构。
主线程(Reactor)负责 I/O 事件监听和分发:
- 通过 epoll_wait 监听所有连接上的读写事件
- 发生读事件时,将读任务提交到线程池
- 发生写事件时,将写任务提交到线程池
- 发生新连接时,accept 并注册到 epoll
线程池(Worker)负责业务逻辑处理:
- 工作线程从任务队列中取任务执行
- 读任务:读取请求数据 → HTTP 解析 → 生成响应
- 写任务:将响应数据通过 writev 发回客户端
数据流是:客户端 → epoll_wait → 线程池 onRead → HttpRequest::parse
→ HttpResponse::makeResponse → 线程池 onWrite → writev → 客户端
这样做的优势是 I/O 和计算分离,主线程不被业务逻辑阻塞,
epoll ET 模式下可以轻松处理数千并发连接。