我的理解是,CGI每次在服務器上產生一個單獨的可執行進程,但是Servlet不會這樣做 - 但我不確定如何通過比較來描述servlet發生的情況。由於servlet存在於JVM內部,並且JVM是單個進程,因此Servlet與它存在什麼關係?CGI和Servlet如何以不同的方式執行?
1
A
回答
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代碼在一個線程中執行。該線程由運行在JVM中的Java應用程序Servlet容器產生。
在接收到請求後,Servlet容器啓動一個執行servlet代碼的線程,併爲該代碼提供處理的傳入請求。在完成處理後,該線程將進入池或根據容器的開發方式而終止。
好處是:產生一個新進程比OS在現有進程內產生的代價更高(內存,IO和CPU週期明智)。一個線程也與父進程共享內存空間。
線程可以合併。儘管創建線程的成本較低,肯定會有性能成本被支付;然而有一個線程池在一定程度上解決了這個問題。
有線程的另一個好處是錯誤處理可以優雅完成。如果一個線程通過拋出一個錯誤返回,那麼處理它比一個終止錯誤的進程要容易得多。
相關問題
- 1. 如何以更好的方式執行不同的條件
- 2. Ruby - 在Mac和Ubuntu上以不同方式執行的代碼
- 3. 聰明的方式使相同的程序集以不同的方式執行?
- 4. C++ - 可以以不同的方式執行函數嗎?
- 5. 不同的執行任務的方式
- 6. Servlet似乎並沒有以線程的方式執行
- 7. AngularJs:如何以同步的方式執行功能
- 8. 如何以編程方式執行UINavigationController?
- 9. CGI腳本不可執行
- 10. CGI腳本不執行
- 11. Chrome不執行cgi腳本
- 12. Perl腳本:不同的結果形式的命令行和CGI
- 13. 如何執行JavaScript函數以使用不同的樣式表?
- 14. 平臺進程與CGI和servlet有什麼不同?
- 15. 如何以不同的方式
- 16. Python CGI以不同的方式迴應相同的jQuery/AJAX請求
- 17. 傳遞相同參數時方法執行的方式不同
- 18. 可執行的CGI和萊蒂
- 19. Crontab以不同的方式運行bash
- 20. 如何以不同的數字類型執行操作,同時以慣用的Rust方式計算平均值?
- 21. 如何執行Java IDE以編程方式執行方法引用的搜索?
- 22. 如何從PHP執行CGI文件?
- 23. 如何執行python cgi腳本?
- 24. 如何以編程方式指定segue(不執行segue)?
- 25. Python的CGI腳本不執行
- 26. 多形式不同的Servlet
- 27. 如何讓這些按鈕以不同的方式運行?
- 28. cakephp - 如何以不同的方式對結果進行分組?
- 29. IF如果以任一方式執行?
- 30. 如何讓jquery以完全平行的方式執行動畫?
所以一個Servlet產生一個單獨的線程和一個CGI產生一個單獨的過程。這是公平的嗎? – Uro 2010-03-04 04:33:18
是的:http://en.wikipedia.org/wiki/Servlet#Advantages – 2010-03-04 04:37:03