基于epoll与线程池实现的C++网络库,其中服务端采用线程间共享互斥锁避免惊群效应。详解架构设计、异步日志、支持非阻塞IO的缓冲。阅读时长约20min。
从Nginx说起
Nginx是使用多进程与IO多路复用实现的高性能C++服务端,但是Nginx为什么要使用多进程,而不是多线程呢?
子线程与子进程的主要区别在于子进程有独立的PID与地址空间,独立PID在并发编程时使得信号的处理更加方便,因为信号根据种类不同,作用于线程组时的行为也有很大的不一样。但由于父子进程各自的地址空间是独立的,所以nginx在避免惊群效应时使用了进程锁,分析源代码底层有两种实现:
①基于CAS(Compare and Swap)与共享内存,其中CAS需要CPU硬件支持。②使用fcntl系统调用实现记录锁。
进程锁的实现相对麻烦,以前甚至碰到过fcntl系统调用对记录锁的实现有BUG。
作者尝试使用posix线程库实现线程池以替换多进程,同样可以实现高性能,框架命名为kingpin。
架构设计
对于一个库而言,设计者最开始就要想清楚的是,想要解决的问题、针对的业务场景、怎样设计API?
King