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