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

Java servlet架构是否比CGI更快,因为它使用线程而不是进程?,java,multithreading,performance,servlets,cgi,Java,Multithreading,Performance,Servlets,Cgi,我对Java和web开发都是新手,所以我在阅读本文时说,servlet模式相对于CGI的一个优势是: 更好的性能:因为它为每个请求创建一个线程,而不是 过程 然而,我真的不明白为什么会这样。基于此,至少对于Linux,普遍的共识似乎是线程不一定比进程快,使用进程而不是线程实际上可能是有利的 在本教程中,CGI的工作原理如下: 对于每个请求,它启动一个进程,Web服务器仅限于 启动进程 当考虑到一个进程的启动成本时,这是有意义的。但是,我不知道为什么有必要为每个请求启动一个新进程,而不是让一个运行

我对Java和web开发都是新手,所以我在阅读本文时说,servlet模式相对于CGI的一个优势是:

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

然而,我真的不明白为什么会这样。基于此,至少对于Linux,普遍的共识似乎是线程不一定比进程快,使用进程而不是线程实际上可能是有利的

在本教程中,CGI的工作原理如下:

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

当考虑到一个进程的启动成本时,这是有意义的。但是,我不知道为什么有必要为每个请求启动一个新进程,而不是让一个运行CGI shell池为排队的请求提供服务。

因为 在CGI中,每个请求由重量级OS进程处理,而在servlet中,每个请求由轻量级Java线程处理,因为
在CGI中,每个请求都由重量级OS进程处理,而在Servlets中,每个请求都由轻量级Java线程处理。主要的性能差异在于,GCI为每个请求分叉/执行一个新的进程,但设计良好的Servlet容器在启动时创建一个(有界的)线程池,并将它们分配给请求,并在请求完成时重新命名它们

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

如果您可以维护一个“CGI shell”池,我想这样会更有效率。然而,CGI应用程序的正常假设是从零开始

还有几个其他问题:

  • 在servlet容器中,您还可以维护共享会话和请求缓存、共享数据库连接池等
  • 每个请求使用JVM实现的CGI的性能将非常糟糕。。。因为JVM启动/预热的开销。一个典型的请求可能不会运行足够长的时间来JIT编译字节码

主要的性能差异在于,GCI为每个请求分叉/执行一个新的进程,但设计良好的Servlet容器在启动时创建一个(有边界的)线程池,将其分配给请求,并在请求完成时对其进行重分类

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

如果您可以维护一个“CGI shell”池,我想这样会更有效率。然而,CGI应用程序的正常假设是从零开始

还有几个其他问题:

  • 在servlet容器中,您还可以维护共享会话和请求缓存、共享数据库连接池等
  • 每个请求使用JVM实现的CGI的性能将非常糟糕。。。因为JVM启动/预热的开销。一个典型的请求可能不会运行足够长的时间来JIT编译字节码

启动另一个进程需要启动另一个jvm。这需要额外的开销。如何进行跨边界通信?启动另一个进程需要启动另一个jvm。这需要额外的开销。你是如何进行跨国界沟通的?谢谢你的回答。然而,我的观点是,根本不清楚操作系统进程是“重量级”的,Java线程是“轻量级”的。谢谢你的回答。然而,我的观点是,根本不清楚操作系统进程是“重量级”的,Java线程是“轻量级”的。我明白了,所以这里的重要假设是CGI为每个请求启动一个新流程。对吗?这是我的假设/理解。我明白了,所以这里重要的假设是CGI为每个请求启动一个新的流程。对吧?这是我的假设/理解。