我想大致了解HTTP.sys 在 IIS 7.0 及更高版本中将请求转发到工作进程的方式。为此,我阅读了http://www.iis.net/learn/get-started/introduction-to-iis/introduction-to-iis-architecture上的帖子。然而,这篇文章中有两点似乎是矛盾的,让我感到困惑。
第 1 点: “超文本传输协议堆栈 (HTTP.sys)”一节中提到的第二个要点如下。
内核模式请求队列。请求导致上下文切换的开销更少,因为内核将请求直接转发到正确的工作进程。如果没有工作进程可用于接受请求,则内核模式请求队列会保留该请求,直到有工作进程接收它。
根据这一点,我的结论如下: HTTP.sys绕过WWW服务将请求“直接”转发给工作进程。如果没有可用的工作进程,HTTP.sys 在内核模式请求队列中排队请求,同时 WAS 服务启动一个新的工作进程。然后,该工作进程自行从内核模式队列中获取请求。
第2点: “Windows进程激活服务(WAS)”部分下的进程管理小节如下。
WAS 为 HTTP 和非 HTTP 请求管理应用程序池和工作进程。当协议侦听器接收到客户端请求时,WAS 会确定工作进程是否正在运行。如果应用程序池已经有一个工作进程正在为请求提供服务,则侦听器适配器将请求传递给工作进程进行处理。如果应用程序池中没有工作进程,WAS 将启动一个工作进程,以便侦听器适配器可以将请求传递给它进行处理。
根据这一点,我的结论如下: HTTP.sys“通过WWW服务”将请求转发给工作进程,因为它是监听适配器。如果没有可用的工作进程,HTTP.sys 在内核模式请求队列中排队请求,同时 WAS 服务启动一个新的工作进程。然后,来自内核模式队列的请求被 WWW 服务接收并转发给工作进程。
谁能告诉我以上两个结论中哪一个是正确的?如果两者都不正确,请告诉我正确的流程。