IIS ASP.NET的進(jìn)程模式淺析
IIS ASP.NET的進(jìn)程模式有哪些呢?他們各自有什么特點(diǎn)呢?來開始我們的講解。
IIS ASP.NET的進(jìn)程模式之ASP.NET處理模型
到目前為止,我們已經(jīng)明白當(dāng)請求一個(gè)ASP.NET文件的請求傳到IIS后,他被轉(zhuǎn)遞到aspnet_isapi.dll,他是ASP.NET相關(guān)處理的主要入口點(diǎn)。實(shí)際上,這個(gè)擴(kuò)展明顯依賴于系統(tǒng)上IIS的版本,因此處理模型是通過asp.net運(yùn)行時(shí)通過有序的操作執(zhí)行來處理請求并生成回送,也許有那么一點(diǎn)改變。
在IIS5.X,所有asp.net相關(guān)請求通過ISAPI擴(kuò)展被分配到外部工作進(jìn)程叫做aspnet_wp.exe.ISAPI擴(kuò)展,在IIS進(jìn)程(inetinfo.exe)中運(yùn)行,再傳遞控制權(quán)連同所有關(guān)于當(dāng)前傳入請求的信息到aspnet_wp.exe。2個(gè)進(jìn)程間的通信通過命名管道(眾所周知IPC[內(nèi)部進(jìn)程通信]機(jī)制建立。ASP.NET工作進(jìn)程執(zhí)行ISAPI擴(kuò)展的大部分任務(wù)。注意一下每個(gè)WEB應(yīng)用程序的實(shí)質(zhì),以及與IIS下不同虛擬目錄的通訊,他們在asp.net工作進(jìn)程同一個(gè)進(jìn)程的上下文中被執(zhí)行。為了實(shí)現(xiàn)讀取各自執(zhí)行中上下文ASP.net引入了應(yīng)用程序域的概念,縮寫AppDomains.他們可以被認(rèn)為是一個(gè)輕量級的進(jìn)程。更多的將在后面介紹。
如果運(yùn)行在IIS6上,aspnet_wp.exe進(jìn)程沒有被使用,選擇一個(gè)更優(yōu)的進(jìn)程叫做w3wp.exe.同時(shí),inetinfo.exe也不再用來傳遞HTTP請求到ISAPI擴(kuò)展,盡管這樣他還是保持為其他協(xié)議的請求提供服務(wù)。雖然IIS6能夠運(yùn)行在兼容模式下并且模擬之前的行為,但是相對于先前的IIS5處理模型有了很多的變化。相對早期***改變,當(dāng)處理模型運(yùn)行在IIS5上,傳入進(jìn)來的請求以lower-kernel-level形式然后傳遞到正確的ISAPI擴(kuò)展,從而避免在內(nèi)部信息處理方面花費(fèi)過多的操作。在下面的段落中,我們將進(jìn)行更深入的研究。
IIS ASP.NET的進(jìn)程模式之IIS5.0 處理模型
在windows2000以及XP系統(tǒng)上這是默認(rèn)的處理模型。如上所說他有IIS inetinfo.exe進(jìn)程默認(rèn)在TCP端口80監(jiān)聽傳入的HTTP請求并且把他們推送進(jìn)隊(duì)列等待處理。如果請求類型是asp.net,處理將委托給asp.net isapi擴(kuò)展 aspnet_isapi.dll.這樣輪流通過命名管道與ASP.NET工作進(jìn)程通信,最終工作進(jìn)程處理并傳遞請求到asp.net HTTP運(yùn)行時(shí)環(huán)境。圖表2將具體描敘這個(gè)過程。
圖表2:IIS5.0處理模型
圖表2顯示一個(gè)我們尚未提到過的元素—ASP.NET HTTP運(yùn)行時(shí)環(huán)境。目前他并不是我們這編文章的主題,他將在接下來的文章中被解析。HTTP運(yùn)行時(shí)可以被看作一個(gè)黑色盒子,所有ASP.NET指定處理在這里發(fā)生,所有的受管制代碼運(yùn)行場所,從HTTP運(yùn)行時(shí)一直到httphandler最終處理請求并生成回送都在這里被處理。這里還涉及到ASP.NET管道或HTTP運(yùn)行時(shí)管道。
就這個(gè)模型有一個(gè)有趣的地方就是所有請求,一旦被ISAPI擴(kuò)展處理,就被傳遞到asp.net工作進(jìn)程。每次活動(dòng)時(shí)間有且僅有一個(gè)進(jìn)行實(shí)例,一個(gè)例外,后面討論。因此所運(yùn)行在IIS上的asp.net web應(yīng)用程序?qū)嶋H上也運(yùn)行在工作進(jìn)程上。盡管如此,這并不意味著所有應(yīng)用運(yùn)行在同一個(gè)上下文上并共享他們所有的數(shù)據(jù)。值得一提,asp.net引入APPDomain概念,本質(zhì)上是一種提供獨(dú)立和安全邊界的受管制輕量級進(jìn)程。每個(gè)IIS虛擬目錄在一個(gè)APPDomain里執(zhí)行,他將自動(dòng)加載到工作進(jìn)程只要資源是屬于***次請求的應(yīng)用程序。一旦appdomain被加載,換句話說,當(dāng)前請求所有需要的程序集被加載到appdomain–實(shí)際上是傳遞到asp.net管道處理。若干appdomains能夠這樣運(yùn)行在同樣的進(jìn)程中,當(dāng)多個(gè)請求對于同樣的appdomain能夠在多個(gè)線程出來。盡管如此,一個(gè)線程并不屬于一個(gè)appdomain,他能為多個(gè)不同的appdomians處理多個(gè)請求,但是同一個(gè)給定的時(shí)間一個(gè)線程屬于一個(gè)APPdomain.
處于性能目的,工作線程能夠根據(jù)一些標(biāo)準(zhǔn)(通過MACHINCE.CONFIG文件配置)被回收。這些標(biāo)準(zhǔn)包括進(jìn)程生命周期,請求以及隊(duì)列數(shù)量,空閑時(shí)間,內(nèi)存分配。一旦達(dá)到這些參數(shù)中一項(xiàng)臨界值,ISAPI擴(kuò)展將生成一個(gè)新的工作進(jìn)程實(shí)例用來處理請求。實(shí)際上,先前的進(jìn)程實(shí)例并沒有被關(guān)閉,但是他被終止服務(wù)等待的請求。
IIS ASP.NET的進(jìn)程模式之IIS6.0處理模型
IIS6是WINDOWS2003系統(tǒng)默認(rèn)的。在IIS5處理模型的上他有幾個(gè)改變和改進(jìn)。其中之一***改變就是應(yīng)用程序池概念。在IIS5系列應(yīng)用程序上,即所有的appDomains—運(yùn)行在asp.net工作進(jìn)程上。為了在安全以及特性上完成一個(gè)出色的界定,IIS6處理模型允許應(yīng)用程序運(yùn)行在同一個(gè)工作進(jìn)程的不同拷貝上。每個(gè)應(yīng)用程序池能夠包含多個(gè)appdomains(運(yùn)行在單獨(dú)一個(gè)工作進(jìn)程拷貝上).換而言之,這個(gè)變化是從單一進(jìn)程運(yùn)行所有程序到多個(gè)進(jìn)程運(yùn)行每一個(gè)應(yīng)用池。這個(gè)模型也叫做工作過程隔離模式。
例外一個(gè)大變化相對先前的模型在IIS監(jiān)聽所有傳入數(shù)據(jù)方面。在IIS5里,由IIS進(jìn)程,inetinfo.exe監(jiān)聽指定的TCP端口。在IIS6中,傳入請求被處理并隊(duì)列在核心級別來替換先前通過核心驅(qū)動(dòng)調(diào)用http.sys的用戶模式;這種方法有幾個(gè)優(yōu)勢相對于先前的模式被叫作 kernel-level 請求隊(duì)列。
圖表3 IIS6處理模型
圖表3主要由請求處理組成。一旦一個(gè)請求到達(dá)核心級別設(shè)備驅(qū)動(dòng)http.sys,然后發(fā)送到相應(yīng)的應(yīng)用程序池隊(duì)列,每個(gè)隊(duì)列屬于一個(gè)指定的應(yīng)用程序池。
工作進(jìn)程負(fù)責(zé)加載asp.net ISAPI擴(kuò)展,依次加載 CRL 委派所有工作到HTTP運(yùn)行時(shí)。
W3WP.exe進(jìn)程與IIS5下面的aspnet_wp.exe不同,他不是asp.net特有的,能夠用來處理任何類型的請求。什么樣的ISAPI模塊被加載類型根據(jù)需要的服務(wù)資源類型。
IIS ASP.NET的進(jìn)程模式就向你就介紹到這里,希望對你有所幫助。
【編輯推薦】