服务器程序详解
一、完全端口模型(I/O completion ports)是迄今为止最为复杂的一种I/O模型,假如一个程序需要管理为数众多的套接字,那么采用这种模型往往可以达到最佳的系统性能,不幸的是该模型 只适用与WIN2000和WINNT操作系统,因其设计的复杂性,只有在你的应用程序需要同时管理数百乃至上千个套接字的时候,而且希望随着系统内安装的 CPU的数量增多,应用程序的性能也可以线性的提升,才考虑采用“完成端口模型”(WEB服务器便是这方面的典型例子)。I/O completion ports是唯一适用于高负载服务器的一个技术,它利用一些线程帮助平衡“I/O请求”所引起的负载,这样的构架特别适合应用在SMP系统中产生所谓的 “Scalable”服务器,(Scalable是指能够籍着增加RAM或磁盘空间,CPU个数而提升应用程序效能的一种系统)。
二、完全端口模型的具体实现
为了使用“完成端口模型”,我产生了一堆线程在端口上等待,线程数量=CPU个数x2+2,我将每个客户端产生的文件句柄与I/O completion ports端口相关联,建立了这种关系之后,任何客户端发出操作请求,便会导致I/O completion packet被送到“完成端口”去,这个步骤是操作系统完成的,为了回应I/O completion packet,我让I/O completion释放一个等待中的线程,如果目前没有线程正在等待,它不会为这个客户端N产生新的线程, 当作用中的线程处理完相应客户端的“overlapped I/O”后,将返回I/O completion端口进行等待,客户端N这时才能够被处理,这样就保证了我的Workers线程总是保持一个稳定的数量(CPU个数x2+2)。如图二所示:
图二 完全端口线程模型示意图