Posted on 2008-05-09 18:30
Jerson Ju 阅读(109)
评论(0) 编辑 收藏 网摘 所属分类:
c/c++
最近自己想写一个专业的游戏服务器端 如升级,斗地主等。本想这个小意思,以前不是写过很多多线程的程序吗。传统的代码:如下 ServerSocket s=new ServerSocket(8888);
while(true)
{
Socket socket=s.accept();
Thread t = new Thread(new MyServer(socket));
t.start();
}
}
这样的效率极其低下。也太小看腾讯和那写游戏公司了。呵呵,后来研究发现效率低下的原因是每个客户端请求斗要创建一个线程对应一个客户端。CPU的线程调度上浪费了无数的资源,1万个客户就一万个线程,如果CPU要每个线程执行一个周期(切换1万次的Thread Context 切换也是非常耗时的),一个轮回都要N久,就别谈完成线程本身的工作了。
经过阅读 《Programming Applications for Microsoft Windows Fourth Edition》《Network Programming for Windows》侯捷《multithreading applications in Win32.pdf》 socket I/O模式一共 5种。第一种就是我们常用的,select模式,二种、异步选择模式 三种、事件选择模式 四种、重叠I/O模式 五、完成端口。所有的种完成端口是公认最好,也是所有大型网络程序采用的,但是它也是windows种最难理解的,最复杂的内核对象。
C++中TSocket的定义类型:word,我们可以判定这个连接理论峰值是65535,也就是说,你的单个服务器程序,最多可以承受6万多的用户同时连接。但是,在实际应用中,能达到一万人的同时连接并能保证正常的数据交换已经是很不容易了,通常这个值都在2000到5000 ,如果要实现2000到5000用户的单服务器同时在线,是不难的。在windows下,比较成熟的技术是采用完成端口。与完成端口相关的资料在网上和CSDN论坛里有很多,感兴趣的朋友可以自己搜索一下。只要运用得当,一个完成端口服务器是完全可以达到2K到5K的同时在线量的。但,5K这样的数值离百万这样的数值实在相差太大了,所以,百万人的同时在线是单台服务器肯定无法实现的。有牛人说“加机器”,呵呵,怎么加?不是说加就加的。
百万人同时在线的服务器模型应该是:登陆服务器+大厅服务器+房间服务器。当然,也可以是其它的模型,但其基本的思想是一样的.350台房间服务器才能顶住百万人,那这些程序怎么写呢。不是用钱买机器就行的。QQ和WOW真的是牛,具体分析继中.......