线程是如何通过Http.sys、IIS和ASP.NET与请求相关联的

23

我目前正在大量阅读关于node.js的内容。经常有一个比较,即使用传统的每个请求一个线程模型(Apache)的服务器和使用事件循环(Nginx、Node、Tornado)的服务器。

我想详细了解ASP.NET中请求是如何处理的——从它在http.sys接收到的时候一直到它在ASP.NET本身被处理。我发现MSDN关于http.sys和IIS的文档有点不足,但也许我的谷歌搜索能力今天有点弱。到目前为止,我找到的最好的资源是Thomas Marquardt的博客上的一篇文章。

有人能对这个主题提供更多的信息或指向其他资源吗?

(针对这个问题,我只对具有典型集成管道的IIS7感兴趣)


2
我的谷歌搜索技巧找到了http://www.west-wind.com/presentations/howaspnetworks/howaspnetworks.asp,这可能会回答你的问题。 - Chris O
1
这是一个很好的问题,也是我自己一直在思考的事情。 - Jake
1个回答

8
据我的研究,当请求进来时,它会被放入内核模式请求队列中。根据这个,这避免了在有大量请求(或进程或线程)时出现的上下文切换问题,提供了类似事件IO的好处。
引用文章内容:
“每个请求队列对应一个应用程序池。应用程序池对应于HTTP.sys中的一个请求队列和一个或多个工作进程。”
因此,根据该文章,每个请求队列可能有多个“工作进程。”(Google缓存)更多关于工作进程的信息 从我的理解来看:
  • IIS打开创建一个请求队列(请参阅下面的http.sys API)
  • 在IIS中配置的“网站”对应一个工作进程
  • 网站/工作进程共享线程池。
  • 一个线程从请求队列中获取请求。
这里有关于IIS7架构的大量信息 这里有关于http.sys的更多信息。 我还有一些未解决的问题:

注意:我不确定“内核模式请求队列”与IO完成端口是否对应,我会假设每个请求都有自己的IO完成端口,但我不知道,所以我真的希望有人可以更全面地回答这个问题。我刚偶然发现这个问题,看起来http.sys实际上使用了IO完成端口,这应该提供几乎与事件IO(node.js、nginx、lighttpd、C10K等)相同的好处。


感谢提供如此丰富的信息。我暂时保留这个问题,以便其他人可以做出贡献。我还在IIS论坛上发布了这个问题,以鼓励那些人来尝试一下。 - David Padbury

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接