前言:本文以TCP服务器为例,详细讲述TCP各种服务器模型的优缺点,以及TCP服务器模型的演变过程,揭开各种服务器模型的神秘面纱。学完本文,你总能挑选一款合适的TCP服务器。
1.循环服务器
循环指服务器是指在一个循环中不断地接受客户端请求,处理完一个请求后再接受下一个请求。循环服务器同一时刻只能响应一个客户端请求。
- 优点:简单易懂,容易实现,适用于处理低并发量的请求。
- 缺点:当并发量较高时,循环服务器的性能会受到很大的影响,因为每个请求都需要等待前一个请求处理完成后才能处理。
1.1 TCP循环服务器实现流程:

- 创建TCP套接字并绑定到指定的IP地址和端口号。
- 监听客户端连接请求,等待客户端连接。
- 循环创建新套接字处理连接请求,接收数据包,处理数据,发送响应包。
- 关闭新套接字,执行步骤b处理下一个连接请求。
2.多进程并发服务器
多进程并发服务器是指服务器能够同时处理多个客户端请求,而且每个客户端请求都在一个独立的进程中处理。这种服务器模型可以充分利用多核CPU的优势,提高服务器的并发处理能力。 多进程并发服务器优缺点: 优点:
- 可以充分利用多核CPU的优势,提高服务器的并发处理能力。
- 子进程之间相互独立,一个子进程崩溃不会影响其他子进程的运行。
缺点:
- 创建和销毁进程的开销比较大,会占用较多的系统资源。
- 子进程的创建和销毁可能会导致一定的延迟。
2.1 TCP多进程并发服务器(进程池版本)实现流程:

- 创建TCP服务器套接字,绑定IP地址和端口号。
- 监听客户端连接请求,等待客户端连接。
- 循环调用fork函数,创建进程池。
- 子进程接受客户端连接请求。
- 在子进程中,接收客户端发送的数据,处理数据并返回结果。
- 子进程关闭套接字并退出。
- 父进程挂起。
2.2 TCP多进程并发服务器(动态创建进程版本)实现流程:

- 创建TCP服务器套接字,绑定IP地址和端口号。
- 监听客户端连接请求,等待客户端连接。
- 接受客户端连接请求,创建子进程处理客户端请求。
- 在子进程中,接收客户端发送的数据,处理数据并返回结果。
- 子进程关闭套接字并退出。
- 父进程再次执行步骤c,处理下一个连接请求。
3.多线程并发服务器
多线程并发服务器是一种服务器架构,它可以同时处理多个客户端请求。在传统的单线程服务器中,每个客户端请求都必须等待前一个请求完成后才能被处理,这会导致服务器响应速度变慢。而多线程并发服务器则可以同时处理多个请求,从而提高服务器的响应速度。
多线程并发服务器优缺点:优点:
- 可以同时处理多个客户端请求,提高服务器的响应速度。
- 线程之间共享相同的全局内存,易于共享信息。
- 线程的效率高于进程。
缺点:
- 线程安全问题,需要进行线程同步。
- 线程数量过多会导致系统资源的浪费。
3.1 TCP多线程并发服务器(线程池版本)实现流程:

- 创建TCP服务器套接字,绑定IP地址和端口号。
- 监听客户端连接请求,等待客户端连接。
- 循环调用pthread_create函数,创建线程池。
- 子线程设置分离属性,防止子线程退出资源泄露。
- 子线程循环创建新套接字处理连接请求,接收数据包,处理数据,发送响应包。
- 子线程关闭新套接字并退出。
- 主线程挂起。
3.2 TCP多线程并发服务器(动态创建线程版本)实现流程:

- 创建TCP服务器套接字,绑定IP地址和端口号。
- 监听客户端连接请求,等待客户端连接。
- 主线程接受客户端连接请求,创建子线程处理客户端请求。
- 子线程设置分离属性,防止子线程退出资源泄露。
- 子线程循环接收数据包,处理数据,发送响应包。
- 子线程关闭新套接字并退出。
- 主线程再次执行步骤c,处理下一个连接请求。
4.IO复用服务器
无论是循环服务器,多进程并发服务器还是多线程并发服务器都存在一个问题,就是无法处理海量长连接请求,所以需要一种更为高效的服务器模型,IO复用服务器模型由此诞生,IO复用服务器分为select,poll,epoll服务器模型。
4.1 select IO复用服务器模型
详细实现方式请参考此链接: 图解Linux select机制_从内核到应用(精华篇)
4.2 poll IO复用服务器模型
详细实现方式请参考此链接:图解Linux poll机制,终于集齐IO复用三剑客(精华篇)
4.3 epoll IO复用服务器模型
详细实现方式请参考此链接:一篇文章让你真正搞懂epoll机制
5.各种服务器模型对比

