TinyWeb--C++构建高性能Web服务器

C++构建高性能Web服务器——Step 0:前言

1、想法:

  • 一直想用C++作个项目,由于比较喜欢网络通讯这部分,又让事情变得更有些挑战性,我最终选择实现一个高性能的Web服务器。
  • 在宏观上我但愿TinyWeb可以这样:html

    • 配置简单
    • 扩展容易
    • 性能高效
    • 功能强大
  • 并但愿在开发的过程当中可以掌握如下知识:git

    • Unix环境编程的技能
    • Unix网络编程的技能
    • 巩固C++11知识
    • 掌握构建大型C++项目的技能
    • 掌握多进程、多线程同步、通讯机制
    • 实现高性能可复用Memory-pool
    • 掌握基本的数据结构(红黑树、链表、Hash)
    • 可以把通用的网络部分做为单独的网络库、为之后网络开发提高效率
  • TinyWeb 目前的功能是:github

    • 基本的Web服务,只能提供静态网页服务。
    • 单进程+Reactor+非阻塞方式运行
    • 只能用于Linux系统,不专一跨平台
    • 基本的Web服务配置
  • TinyWeb 目前的发展计划:编程

    • 使用进程池的方式提升并发性
    • 强有力的支持多种版本Http协议
    • 负载均衡功能
    • 代理功能

2、设计思想

1. 网络中最麻烦的是如何处理阻塞的事件:

若是IO事件没有发生,系统阻塞的等待IO事件发生,那么CPU就被
浪费了,为实现高并发,不能让进程阻塞,CPU等待IO事件.
借助Linux高效的Epoll机制,

至于为什么使用Epoll,而不使用Select或Poll,点这里看看吧.安全

2.为了提升并发性:究竟是选择多进程仍是多线程模式

多进程与多线程各有优缺点,而且大部分是互补的,具体就再也不赘述了,
详情请戳这里
我选择多进程的缘由是:服务器

  1. 安全性高,一个进程崩溃不会影响别的进程
  2. 容易调试,不易形成死锁
  3. 有较为成熟的进程间通讯同步机制(共享内存,信号,文件锁,socketpair....)

在接受客户端链接的时候,如何再去建立一个进程,效率低下.故所以采用进程池的方式:
Master进程为父进程,主要控制子进程的状态;可动态配置数量的Slave子进程,用于接受链接,
处理Http逻辑.网络

3.C++最难管理的仍是内存

为了方便的进行内存管理,我设计了一个内存池,不会产生大量的内存碎片,性能待测试.之后还会
介绍如何实现的,尽请期待.

4.进程间通讯的方式不少,到底选择哪几个

了解了下Nginx,有考虑了使用的复杂度,我决定使用这几个通讯.同步机制数据结构

  • 原子操做
  • 信号量
  • 消息队列
  • 共享内存
  • 信号

3、源码

想要源代码的请戳这里,但愿你们多多对代码风格作出评判,毕竟本身只是个大三的学生.多线程


4、参考文献

小伙伴想要了解更多的高性能的网络编程,推荐一个大神的专栏并发

相关文章
相关标签/搜索