共计 823 个字符,预计需要花费 3 分钟才能阅读完成。
本人参照《Linux 多线程服务端编程》,以及模仿该书使用的 muduo,写了一个轻量的 Web 服务器。
源码
Github。代码中有比较详细的注释,可作为看《Linux 多线程服务端编程》的辅助材料。
已完成
- 完成基本的 Tcp(被动连接)库;
- 简易的 HTTP 服务器,可访问主页 HTML 和网站 favicon 图标。
技术
主从 reactor 模式:
- 主 reactor 负责监听连接,当有新的连接,accept 到新的 socket 后,使用 Round Robin 方法选择从 reactor,将 socket 派发给从 reactor;
- 从 reactor 负责管理时间描述符(timerfd 用于定时任务)、事件描述符(eventfd 用于唤醒 IO 线程)和 派发过来的 socket 文件描述符。
- multiple reactors + thread pool (one loop per thread + threadpool);
- EventLoop:使用 Epoll 水平触发的 IO 多路复用技术,非阻塞 IO;
线程池:
- 使用多线程能发挥多核的优势;
- 线程池可以避免线程的频繁地创建和销毁的开销。
- 简单的日志系统;
- 使用智能指针等 RAII 机制,来为降低内存泄漏的可能性;
并发模型
并发模型为 multiple reactors + thread pool (one loop per thread + threadpool);+ 非阻塞 IO,新连接使用 Round Robin 策略派发。
压测
压测结果。
参考
- 《Linux 多线程服务端编程》
- muduo
- 陈硕老师的 Blog
- linyacool 的 WebServer
- uv-cpp
- 开源 HTTP 解析器
- HTTP 请求和响应格式
- 写一个并发 http 服务器(有代码)
- 有什么适合提高 C/C++ 网络编程能力的开源项目推荐?– Variation 的回答 – 知乎(master/worker、proactor 等 IO 模型)
- Reactor 事件驱动的两种设计实现:面向对象 VS 函数式编程
- 网络编程中的关键问题总结
- muduo 源码剖析 – cyhone 的文章 – 知乎
- Muduo 源码分析
正文完