要做一个高效的服务器,应该使用多线程模型,但不是对每个客户连接创建一个线程,这样做会浪费资源,而且增加了线程调度的开销。合理的做法是使用一组线程为所有的客户服务,就象商场里由少数的服务员为大量的顾客服务一样,这组线程的具体数目要根据具体的情况而定。Windows NT对编写这类程序提供了支持,就是使用IO完成端口(IOCompletionPort),IIS就是使用这个模型的。 MSDN里有一些关于使用IOCP的技术文章:MSDN->Technical Articles->Windows Platform->Base Services->Writing Scalable Applications for Windows NTMSDN->Technical Articles->Windows Platform->Base Services->Writing Windows NT Server Applications in MFC Using I/O Completion Ports 和一些例子:Pop3 sample等。你可以看看。但服务器的效率不仅与通讯的效率有关,你的程序可能就需要进行大量的磁盘IO,对数据进行缓冲,减少访问磁盘的数量是很有必要的,。
pbi是大拿。我同意其观点。磁盘IO的算法很有讲究。《通信学报》上有很多相关文章。我就用socket API 作过多线程的服务器程序。每个线程为多个客户服务。 有兴趣的mail我。
关于IO完成端口的介绍,请参考Jeffrey Richter写的《Advanced Windows,3rd Edition》(中文版叫《Windows高级编程指南》第三版,清华大学出版社出版)。使用IOCP的例子,在MSDN里有。另外,我正在寻找一本书:Jeffrey Richter的《Programming Server-Side Applications for Microsoft Windows 2000》,如果有谁知道的话,请告知。谢谢。
MSDN里有一些关于使用IOCP的技术文章:MSDN->Technical Articles->Windows Platform->Base Services->Writing Scalable Applications for Windows NTMSDN->Technical Articles->Windows Platform->Base Services->Writing Windows NT Server Applications in MFC Using I/O Completion Ports 和一些例子:Pop3 sample等。你可以看看。但服务器的效率不仅与通讯的效率有关,你的程序可能就需要进行大量的磁盘IO,对数据进行缓冲,减少访问磁盘的数量是很有必要的,。
有兴趣的mail我。
[email protected]
“完成端口”模型是迄今为止最为复杂的一种I/O模型。然而,假若一个应用程序同时需管理为数众多的套接字,那么应该采用这种模型,往往可以达到最佳的系统性能!但不幸的是该模型只适用于Windows NT和Windows 2000操作系统。因其设计的复杂性,只有你的应用程序需要同时管理数百乃至上千个套接字的时候,而且希望随着系统内安装的CPU数量的增多,应用程序的性能也可以线性上升,才应该考虑“完成端口”模型。要记住的一个基本准则是,假如要为Windows NT以及Windows 2000开发高性能的服务器应用,同时希望为大量套接字I/O请求提供服务(Web服务器便是这方面的例子),那么I/O完成端口模型便是最佳的选择!
非常感谢
[email protected]