我的理解是,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