1 Linux 下tcp 并发服务器的几种设计的模式套路 在做网络服务的时候tcp 并发服务端程序的编写必不可少。tcp 并发通常有几种固定的设计模式套路,他们各有优点,也各有应用之处。下面就简单的讨论下这几种模式的差异: 单进程,单线程 在accept 之后,就开始在这一个连接连接上的数据收接收,收到之后处理,发送,不再接收新的连接,除非这个连接的处理结束。 优点: 简单。 缺点: 因为只为一个客户端服务,所以不存在并发的可能。 应用: 用在只为一个客户端服务的时候。 多进程 accept 返回成功时候,就为这一个连接 fork 一个进程,专门处理这个连接上的数据收发,等这个连接处理结束之后就结束这个进程。 优点: 编程相对简单,不用考虑线程间的数据同步等。 2 缺点: 资源消耗大。启动一个进程消耗相对比启动一个线程要消耗大很多,同时在处理很多的连接时候需要启动很多的进程多去处理,这时候对系统来说压力就会比较大。另外系统的进程数限制也需要考虑。 应用: 在客户端数据不多的时候使用很方便,比如小于 10 个客户端。 多线程 类似多进程方式,但是针对一个连接启动一个线程。 优点: 相对多进程方式,会节约一些资源,会更加高效一些。 缺点: 相对多进程方式,增加了编程的复杂度,因为需要考虑数据同步和锁保护。另外一个进程中不能启动太多的线程。在 Linux系统下线程在系统内部其实就是进程,线程调度按照进程调度的方式去执行的。 应用: 类似于多进程方式,适用于少量的客户端的时候。 Select+多线程 有一个线程专门用于监听端口,accept 返回之后就把这个描述符放入描述符集合 fd 中,一个线程用 select 去轮训描述符集合,在有数据的连接上接收数据,另外一个线程专门发送数据。当然也可以接收和发送用一个线程。描述符可以设置成非阻塞模式,也可以设置成阻塞模式。通常连接设置成非阻塞模式,发送线程独立出来。 优点:相对前几种模式,这种模式大大提高了并发量。 缺点:系统一般实现描述符集合是采用一个大数组,每次调用 select 的时候都会轮询这个描述符数组,当连接数很多的时候就会导致效率下降。连接数在 1000 以上时候效率会下降到不能接受。 应用:目前 windows 和一般的 Unix上的 tcp 并发都采用 select 方式,应该说应用还是很广泛的。 3 epoll 方式 在Linu x 2.6 版本之后,增加了epoll。具体的使用是:一个线程专门进行端口监听,accept ...