讨论C/S结构TCP服务器的算法(散分1000罗)
我好久好久没发过问了,几千分多的也用不了,再此散分,但只给谈出心得谈出水平的朋友。
1周内我将发几个新贴给分,至少散个1000分吧,但不给灌水的哦 :)
服务器里最常见的就是C/S结构的TCP服务器了,无论是B/S结构的WEB还是FTP server,都需要TCP服务器。
它总是一个端口用于监听,若干个端口用于数据通讯。为了应付复杂的应用,它总是使用多线程的模型。
由于TCP仅次于应用层,因此,假如你构件了一个高性能的TCP的C/S结构服务器,可以很方便的做出Web/FTP/Mail/IRC等等各种各样的服务器。因此这个话题是非常有意义的。
虽然理论很简单,但是,就象数据库一样优化算法是相当重要的。
多数服务器都是基于unix吧,虽然赚钱,但离我们玩编程的是不是远了点?
基于winnt/9x,我做过若干服务器,但觉得性能都不是很令人满意,觉得总是可以再优化。请大家讨论一下,我提几个问题:
1. 对于winsock,实际有好几种socket模式,阻塞、同步非阻塞(select)、异步非阻塞(WSAAsyncSelect)还有winsock2.0的WSASend系列overlapped I/O函数,你觉得哪个好呢?对应的算法呢?
哦,对,还有NT的complete ports,谈谈也好,不过不能在win9x用。
2. 对于多线程模型,如果每个用户都开个线程,耗资源太大了,而且对于单CPU情况下,线程越多,性能似乎也越差。但单线程显然性能也差,至少不能抢占更多的cpu时间。
我常用的简单方法是把监听线程单独拿出来,数据都在一个线程中处理。好处是减少同步的麻烦,而且直觉上觉得cpu专心处理一件事再处理下一件事也比同时处理每件效率高。但数据处理复杂的情况(比如大量数据库操作)线程就总是在等待状态,浪费了cpu耗用。
较好的是有个线程池,但算法却复杂,如果调度和同步太复杂占用太多cpu,那性能反而降低了。
谈谈你理想的多线程模型和算法吧?
3.分布模型。如果做到海量应用,一定要用分布式的。使用DCOM组件?分布的数据库服务器?IP自动转向?
4. 优秀的源码/推荐。当然是越简练性能越高越好了。
语言不限