- 论坛徽章:
- 0
|
如题,昨天电话面试的时候被问到这个问题
当时有点发蒙,说了几句人家不满意,我就回答不知道了,后来静下来想想。
首先,我觉得因为一般构建服务器都是使用操作系统中提供的listen函数,这确实会带来一些限制。服务器调用listen后,当客户端有请求连接到来时(SYN),TCP接受这个数据包并维护一个未完成队列。当三次握手完成后,将此项从未完成队列移到已完成队列中,此时accept可从已完成对列中取出信息。由于队列长度有所限制,当短时间内有大量请求到来时,完全可能出现队列满服务器无法响应第一个SYN消息的情况,此时会一般会导致客户端重传SYN。我当时是从这个角度考虑的,确实没想到什么有效的方法,除非加大队列长度。
如果是从创建线程或者进程带来并法效率低下的角度考虑,可以预先创建线程池或进程池(线程池效率较高),个人感觉当时面试官期待的可能是这个答案?
记得以前有人介绍过一些大网站的做法,专门用一台机器当作前置服务器处理连接,在此服务器之后放置几台机器专门处理任务,有前置机做负载均衡。这应该是从处理任务比较消耗资源的角度来考虑吧。但是如果需要后面几台机器同步信息的话就十分复杂了。
关于这个问题大家认为该怎么解决?
查了点资料,有人说windows下用complete port,unix/linux下用异步io。不过我印象里好象记得linux没有真正实现异步io。如果有人用过的请多指教。 |
|