Windows服务器端编程-第二章 设备IO与线程通信-5-I/O完成端口

来源:互联网 发布:图像增强算法综述 编辑:程序博客网 时间:2024/04/29 03:34

l       I/O完成端口

Windows2000被设计成为一个安全的,健壮的,能够服务于数千个用户的操作系统。根据以往来看,通常使用以下两种模型之一编写服务应用程序:

 

l       串行模型

线程等待客户端的请求(通常通过网络)。当请求到达,线程醒来并处理客户端的请求。

 

l       并行模型

线程等待客户端的请求并产生一个新线程来处理请求。在新线程在处理客户端的请求时,老的线程循环处理另一个客户端的请求。新线程在完全处理完客户端的请求后退出。

 

串行模型的问题在于不能很好的处理多重的、并发的请求。如果两个客户端同时发出请求,一次仅能够处理一个;第二个请求必须等待第一个请求完成。设计成串行模型的服务应用程序在多处理器的机器上没有优势。很明显,串行模型用于简单的服务器应用程序比较好,较少的客户端连接使得请求能较快的被处理。Ping服务就是串行模型服务器应用程序的好例子。

 

       由于串行模型的局限性,并行模型极其流行。在并行模型下,创建一个线程用来处理所有客户端的请求。其优势在于等待请求到来的线程仅有很少一点工作要做。大多数时候,线程在休眠。当客户端请求到来,线程醒来,创建新的线程来处理请求,然后等待另一个连接。这意味着进入的客户端请求可以被很方便的处理。并且,由于每个客户端请求有自己的处理线程,服务器应用程序能够进行很好的伸缩,在多处理器的机器上更有优势。因此在使用并行模型的情况下,升级硬件(添加CPU),服务器应用程序的性能也跟着提升。

 

       并行模型的服务应用程序是在Windows下实现的。Windows小组注意到意味其性能并不像期望那样高。特别地,Windows小组注意到对大量并发客户端请求的处理意味着在系统中有大量的线程在同时运行。由于所有的线程都是可运行的(没有挂起和等待某些东西发生),微软意识到Windows的内核花费了太多时间在运行线程的上下文切换上,以至于线程没有足够的时间来干活。为了使Windows有一个令人信服的服务器运行环境,微软需要解决这个问题。结果就是I/O完成端口内核对象。 
原创粉丝点击