在谈muduo之前,我们来探讨一下常用的网络编程模型,从线程的角度来看,分别有单线程服务器编程模型和多线程服务器编程模型。
1、单线程服务器编程模型常用的是Reactor,即non-blocking IO + IO multiplexing,比较著名的有lighttpd,libevent等,采用这种模型的程序基本结构为一个事件循环,以事件驱动和事件回调方式实现业务逻辑.
2、多线程服务器的常用编程模型
(1)每个请求创建一个线程,使用阻塞式IO操作
(2)使用线程池,同样使用阻塞式IO,这是对第一种的改进,提高性能
(3)使用non-blocking IO + IO multiplexing
第三种模型。在这种模型下,程序的每个IO线程有一个event loop,用于处理读写和定时事件,这样的好处是
(1)线程数目基本固定,可以采用线程池的方式
(2)方便在线程间调配负载
(3)IO事件发生的线程是固定的,同一个TCP连接不必考虑事件并发
总的来说,muduo推荐使用one event loop per thread + thread pool,其中event loop用作IO multiplexing,用来配合非阻塞IO,thread pool用来计算。
陈硕认为,TCP网络编程最本质的是处理三个半事件:
(1)连接的建立
(2)连接断开 包括主动断开和被动断开
(3)消息到达,文件描述符可读。这是最为重要的一个事件,对其处理方式决定了网络编程的风格(阻塞还是非阻塞,如何处理分包,应用层缓冲如何设计)
(3.5)消息发送完毕 对于低流量的服务,可以不用关心这个事件。另外这里的发送完毕指的是将数据写入操作系统的缓冲区,并不代表对方已经收到