2010-03-04 18 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周期明智)。一个线程也与父进程共享内存空间。

线程可以合并。尽管创建线程的成本较低,肯定会有性能成本被支付;然而有一个线程池在一定程度上解决了这个问题。

有线程的另一个好处是错误处理可以优雅完成。如果一个线程通过抛出一个错误返回,那么处理它比一个终止错误的进程要容易得多。

相关问题