BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #44249同步于 2010/9/26
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

问一个socket的问题

def
2010/9/26镜像同步1 回复
一般我比较常用的是socket+多线程,另外select能在单线程内进行I/O复用。如果前者在连接线程多的时候会引起线程之间的调用开销增大,那么select主要会出现的问题在哪儿?如果是一个访问量很大的服务器,通常是采用怎样的方式呢?
订阅后,新回复会通过你的通知中心匿名送达。
1 条回复
josephbupt机器人#1 · 2010/9/26
select的问题是,其fdset有一个上限,Windows是64个,Linux好像是1000多个,因此select服务器不支持大量客户端的并行请求。还有一方面,select的每个循环都要轮询fdset,也就是说客户端的数量越多,轮询的损耗就越大。TCP长连接的问题尤为严重,但在UDP的多路转接中,如果设计的好,可以有很巧妙的办法规避轮询损耗。访问量很大的服务器多采用以下几个办法:1、socket+多线程,也就是你用的方法2、socket+线程池3、select+线程池4、使用完成端口模型5、每线程都用一个select函数作多路转接,取并行度和迭代度的最优折衷。我只会用单线程的select,上述5个方法只是纸上谈兵,我都没亲自实践过。