Asp.net

執行緒如何通過 Http.sys、IIS 和 ASP.NET 與請求綁定

  • January 29, 2011

我目前正在閱讀很多關於 node.js 的內容。在使用傳統的每個請求執行緒模型 (Apache) 的伺服器和使用事件循環的伺服器(Nginx、node、Tornado)之間經常進行比較。

我想詳細了解如何在 ASP.NET 中處理請求 - 從在 http.sys 中接收到它一直到在 ASP.NET 本身中處理它。我發現 http.sys 和 IIS 上的 MSDN 文件有點缺乏,但今天我的 google-fu 可能很弱。到目前為止,我找到的最好的資源是Thomas Marquardt 的部落格上的一篇文章。

任何人都可以對這個話題有更多的了解,或者給我指出任何其他資源嗎?

(出於這個問題的目的,我只對具有典型集成管道的 IIS7 感興趣)

從我目前的研究來看,我的理解是,當請求進入時,它會被放入核心模式請求隊列中。據此,當有大量請求(或程序或執行緒……)時,這避免了上下文切換的許多問題,為事件 IO 提供了類似的好處引自文章:

“每個請求隊列對應一個應用程序池。一個應用程序池對應HTTP.sys內的一個請求隊列和一個或多個工作程序。”

所以據此,每個請求隊列可能有多個“工作程序”。(Google記憶體)更多關於工作程序

據我了解:

  • IIS 打開創建一個請求隊列(參見下面的 http.sys api)
  • IIS中配置的一個“網站”對應一個工作程序
  • 一個網站/工作程序共享執行緒池。
  • 一個執行緒從請求隊列中得到一個請求。

這裡有很多關於IIS7 架構的重要資訊

這是有關http.sys的更多資訊。

我仍然有未解決的問題:

  • 如果 IIS 使用 HTTP.SYS,它到底如何更改伺服器標頭?(見這個問題

注意:我不確定“核心模式請求隊列”是否/如何對應於IO 完成埠,我假設每個請求都有自己的但我不知道,所以我真的希望有人能回答這個更多徹底。我只是偶然發現了這個問題,似乎 http.sys 實際上確實使用了 IO 完成埠,它應該提供幾乎所有與事件 IO(node.js、nginx、lighttpd、C10K 等)相同的好處。 .

引用自:https://stackoverflow.com/questions/4839657