servlet架构是否比CGI更快,因为它使用线程而不是进程?

时间:2017-04-06 14:18:45

标签: java multithreading performance servlets cgi

我是Java和Web开发的新手,因此我正在阅读tutorial,其中说servlet模式优于CGI的一个优点是:

  

更好的性能:因为它不为每个请求创建一个线程   过程

但是,我真的不明白为什么会这样。基于这个answer,至少对于Linux来说,普遍的共识似乎是线程不一定比进程更快并且实际上可能有利进程代替线程。

在教程中写道CGI的工作原理如下:

  

对于每个请求,它启动一个进程,Web服务器仅限于   启动流程。

考虑到流程的启动成本时,这可能有意义。但是,我不确定为什么有必要为每个请求启动一个新进程,而不是让一个正在运行的CGI shell池服务于排队的请求。

2 个答案:

答案 0 :(得分:1)

,因为 在CGI中,每个请求都由重量级的OS进程处理,而在In Servlets中,每个请求都由轻量级Java Thread处理

答案 1 :(得分:1)

主要的性能差异是GCI为每个请求分配/执行一个新进程,但设计良好的Servlet容器在启动时创建(有界)线程池,将它们分配给请求,并且 recyles < / em>请求完成时。

创建线程( 重要)的成本在servlet容器的生命周期内摊销。

如果你可以维护一个&#34; CGI shell&#34;,我想这会更有效率。但是,CGI应用程序的正常假设是从一张干净的表开始。

还有其他一些问题:

  • 在servlet容器中,您还可以维护共享会话和请求缓存,DB连接的共享池等。
  • 由于JVM启动/预热的开销,每个请求使用JVM实现的CGI的性能很糟糕。一个典型的请求可能不会运行足够长的字节码来进行JIT编译。