为什么要使用Servlet的背景(通用网关,进程和线程的介绍)
客户端请求,服务器端提供响应
无论我们通过本地机即客户端上网做什么,比如搜索一个查询,打开一个邮件,请求所得到的页面还有各种各样的数据都是从服务器端得到的。服务器是一个设备,它可以根据网络上的不同的客户所提交的请求而提供不同的信息。那么要实现数据在WEB上传输,最开始的时候是通过编写CGI(Common Gateway Interface)通用网关接口程序来实现的。
CGI 通用网关接口
通用网关接口其实就是一个服务器方的接口程序,这套接口描述了WEB服务器与同一计算机的软件通信方式,是一个外部网关程序和诸如HTTP这样的信息服务器之间的接口标准。
如同一座桥,把网页和服务器中的执行程序连接起来,客户端的指令传递给服务器,服务器执行的结果再返回给HTML页面。
WEB服务器寻找的普通的HTML文档是静态的,不会改变的文件,然后一个CGI程序是实时执行的,以便输出动态信息,像计数器就可以通过CGI程序来完成一个动态的交互。
虽然利用CGI根据用户请求生成动态主页是一种传统的方法,但是CGI一个很明显的缺点是:CGI是根据浏览器的HTTP请求激活响应进程,每一个请求对应一个进程,当同时有很多请求时,程序挤占系统资源,造成效率低下。
程序,进程和线程的区别
程序就是一组指令的集合,是静态的。
进程则是一组指令序列在处理机上的一次执行过程,是动态的。进程具有动态,并行,独立,异步等特性;一个进程由创建而产生,由调度而进入执行,在资源不能满足时挂起,由撤销而消亡。因此,一个进程是由生命的,且唯一的对应于一个 .exe 文件。
点击结束一个进程将终止一个程序的运行,那么所谓的进程其实就是一个程序的一次执行过程。
线程是进程中某一个单一顺序的控制流,也被称为轻量进程(light-weight-processes) ,它是一个程序的最小执行单元,可以理解为是进程中的实体。
一个进程是可以拥有多个线程,一个线程必须要有一个父进程。
线程不拥有系统资源,只有运行必须的一些数据结构。
父进程的其它线程共享该进程的所拥有的全部资源。
线程是对CPU单元的独立占有的最小单位,每个线程共享进程的数据,在每个进程被创建的时候只有一个主线程。线程可以创建和撤销线程,从而实现程序的并发执行。一般,线程具有就绪,阻塞和运行三种基本状态。线程的优点就在于:使同一个程序能有几个并行执行的路径,提高了执行速度,线程需要的系统开销比进程要小。
总结下来,那么就能够很清楚的知道当我们用CGI通用网关接口来实现数据在WEB上的传递时,对于客户端的每一个请求必须开启一个新实例的进程,可想而知它的速度和效率。
为了避免这种损耗,解决这个问题,我们就引入了采用多线程来代替进程的技术—JAVA方向的Servlet技术,能够很清楚的看到Servlet的生命周期,只需要初始化一次Servlet,以后就可以反复的使用。
小总结,打个比方
如果有10个人在线,那么CGI就得开10个进程。而类似于JSP,ASP 都是一个进程处理多个请求的,无论多少人在线,都只有一个进程。并且Servlet使用标准的API,可以被许多WEB服务支持,与平台无关。