深入了解 Windows Server 2008 内核变化
2008-03-27 12:35:20 来源:WEB开发网大多数可伸缩的 Windows 服务器应用程序(包括 IIS、SQL Server® 和 Exchange Server)都依靠称为完成端口的一个 Windows 同步 API 来最大程度减少执行 I/O 操作时在多个线程之间的切换。具体方法是首先将新到请求(如 Web 服务器客户端连接)通知与完成端口关联起来,并指定一个线程池来专门等待通知。当请求到来时,Windows 将调度一个线程,该线程通常执行其他 I/O 操作(如从磁盘读取一个网页并将其发送到客户端)来完成该请求。
因此,相同线程可尽快地返回以等待更多的客户端请求,线程异步执行 I/O 并将 I/O 完成与完成端口关联起来。线程随后返回等待完成端口,当新请求到来或某个 I/O 完成时,完成端口将调度该线程。通过这种方式,同一线程在 CPU 上始终处于活动状态:处理客户端请求或等待完成端口。
之前 Windows 版本中完成端口的缺陷在于:当 I/O 完成后,I/O 系统将让执行该 I/O 的线程立即执行一小段完成处理,而不考虑该线程当前正在执行的其他工作。如果还有其他线程处于活动状态,则常常会导致调度程序抢占活动线程,并上下文切换到另一个执行线程的情况。
通过将完成处理延迟到下一线程以等待与该 I/O 关联的完成端口,Windows Server 2008 避免了此类上下文切换。因此,即使还有另一线程正在等待完成端口,它仍会在执行其他代码之前先执行完成处理,而且调度程序不必切换到执行线程。这种最小化上下文切换的能力可显著地改善高负载服务器应用程序的可伸缩性。
线程池更加有效
利用多个 CPU 来写入应用程序非常困难,因此 Windows XP 引入了工作线程池,它是一种基础结构和相关 API,用于提取在多个 CPU 间执行小段工作的详细信息。 应用程序将工作项目指定给线程池 API,然后该 API 在它为系统中的每个 CPU 创建和管理的某个线程中执行这些工作项目。
更多精彩
赞助商链接