2010-03-04 50 views
1

我的理解是,CGI每次在服務器上產生一個單獨的可執行進程,但是Servlet不會這樣做 - 但我不確定如何通過比較來描述servlet發生的情況。由於servlet存在於JVM內部,並且JVM是單個進程,因此Servlet與它存在什麼關係?CGI和Servlet如何以不同的方式執行?

回答

0

在運行時,Web服務器啓動CGI進程作爲單獨的OS shell。該shell包含一個OS環境和用於執行駐留在服務器文件系統中的CGI代碼的進程。每個新的http請求都會在服務器上啓動一個新的OS shell。 CGI程序的響應時間很長,因爲CGI程序在其自己的OS shell中執行,因此創建OS shell是OS的一項重量級活動。

對於servlet,它作爲web容器中的線程運行,而不是在單獨的OS進程中運行。 Web容器本身是一個OS進程,但它作爲服務運行並且可以持續使用。當servlet的請求數量增加時,不會創建額外的servlet實例。每個請求在每個請求中使用一個Java線程同時處理。

請注意,servlet作爲Web容器進程中的線程執行。

1

servlet容器(JVM進程)通常處理不同的thread中的每個請求。

如果已完成服務請求的線程保持活動狀態以備未來重新使用,則線程的最大數量通常都是可配置的屬性。

+0

所以一個Servlet產生一個單獨的線程和一個CGI產生一個單獨的過程。這是公平的嗎? – Uro 2010-03-04 04:33:18

+1

是的:http://en.wikipedia.org/wiki/Servlet#Advantages – 2010-03-04 04:37:03

0

Servlet代碼在一個線程中執行。該線程由運行在JVM中的Java應用程序Servlet容器產生。

在接收到請求後,Servlet容器啓動一個執行servlet代碼的線程,併爲該代碼提供處理的傳入請求。在完成處理後,該線程將進入池或根據容器的開發方式而終止。

好處是:產生一個新進程比OS在現有進程內產生的代價更高(內存,IO和CPU週期明智)。一個線程也與父進程共享內存空間。

線程可以合併。儘管創建線程的成本較低,肯定會有性能成本被支付;然而有一個線程池在一定程度上解決了這個問題。

有線程的另一個好處是錯誤處理可以優雅完成。如果一個線程通過拋出一個錯誤返回,那麼處理它比一個終止錯誤的進程要容易得多。

相關問題