tomcat4 请求的处理——初步分析

以tomcat4为例,

每当HttpConnector的ServerSocket得到客户端的连接时,会创建一个Socket。

接下来就处理这个Socket发来的数据。 怎么处理呢?

考虑到客户端同时发来的请求数可能有很多, 所以tomcat 中默认维护着一个连接池—— 最大数是:..

这里的连接池可以理解为处理池, 因为它维护的是HttpProcessor 的List之类的。。

——————

这里的处理池里面的所有HttpProcessor 是一直是运行之中的!! 就是一创建就处于了不断运行之中的。 —— 更具体的时机暂不清楚, 应该是创建池的时候就同时把他们都创建好了的。

—— 这里的运行, 是指没有死掉的意思, 其状态可能是Running、Waiting、Sleeping,(运行、阻塞、等待、休眠、。。) 而不仅仅表示Running

—— 之所以它会一直运行, 是因为它run 方法包含了一个无线循环(此处不能叫做死循环, 因为它有可能被唤醒的!!)的原因.

此循环, 依据一定的条件被唤醒,然后工作,工作完了,又回到休息或者等待状态! 具体见后面分析。

——————

每一个HttpProcessor 是一个线程—— 明白这点非常重要, 这也是我们把HttpProcessor 池成为线程池的原因!!

——————

首先, 从处理池中获取一个连接HttpProcessor (此时的HttpProcessor 一定的处于Waiting状态的!!),然后传给它刚刚获得的socket,让他进行处理。

—— 具体又是怎么让它进行处理的呢?

首先,要唤醒它,通过notify!

然后,使用socket处理(  此处的socket是局部变量——————  )当前 线程会从主线程拷贝一份。。。 ———— 这个具体有点不清楚!!

然后,处理完了,改变标志,又回到循环中(继续休息或者说等待!)!

然后,此HttpProcessor 被回收到池中,表明它可以被下一个客户端的建立连接了!!

明白了!

其实,关键点在于HttpProcessor 写得很巧妙, 继承Runnable, 又使用了线程的wait、notifyAll特性。

-- 等等, 为什么使用notifyAll呢? 。。

————————————

如果是我来写tomcat, 我应该怎么做呢? 或者说, 为什么tomcat一定要这么一种方式来设计呢??

其实是有原因的! 就是为了提供效率!

试想, 我们写了一个服务端, 我们为每一个客户端请求建立连接,进行处理,

—— 由于我们的服务端的端口只有一个(多个的情况以后再说), 所以, 我们对所有的客户端请求, 都必须在这一个服务端主服务类的代码内完成。

最开始,我们为每一个客户端请求建立连接(这当然是必须的,不可省略的),且对所有请求在一个线程内完成——这样的特点是,服务端的内存占用小,服务端很忙,服务端响应慢。但是, 客户端请求一变多,客户端的等待马上变得非常久了—— 这种方案马上被否定。

于是,为了快速的响应,我们为每一个客户端请求建立连接,并安排一个新的线程去处理它,(所有的线程都肯定的要占用一定的内存。。并且假设里面没有无限循环,即处理就退出, 但是它也是需要时间去处理的!)—— 当来自客户端请求在短时间内过大的时候, 服务端内存吃不消了!—— 甚至可能,服务端的临时端口(通过ServerSocket accept生成的那个)都不够了!

这样不行, 于是,我们也设立了线程池,—— 连接池的本质上是线程池。—— 先是一启动服务器的时候就建立了很多线程(放在池中)进行等待客户端的请求。客户端的请求一来,马上分配一个线程(我们可以把它称为处理线程,或处理器线程,一个短时的处理客户端请求的线程)进行处理之,处理完了之后回收到池中。—— 同时,需要记住的一点是, 这些线程都是一直在运行中的!

那么问题来了:

主线程(就是服务器工作主线程) 分配处理线程socket的时候,怎么告诉他,socket已经分配了, 你工作吧!—— 就是唤醒。

—— 或者有人会说, 我分配socket的时候,给处理线程的相应变量赋值了,处理线程监听其相应socket变量,看是否有值,有就运行,没有等待,不就可以了吗? —— 我不知道是否行得通。———— 问题是,主线程和处理线程可以这样的直接通信吗?
但,实际情况下,我们可能还是必须要使用到线程间的通信机制。

—— 这样,tomcat4的连接器、处理器的代码逻辑就变得自然而然了。。。

时间: 2024-10-27 05:16:31

tomcat4 请求的处理——初步分析的相关文章

Pin截获socket系统调用初步分析

Pin截获socket系统调用初步分析 根据为知笔记中上传的Pin tool for tracing system calls,修改代码过滤出socket相关的系统调用,并进行初步的分析.主要有2点: - 过滤socket相关的系统调用 - 分析得到的系统调用参数 过滤socket相关的系统调用 socket编程中与访问网络相关的主要关注socket().accept().然后在PinTool中过滤出这两个系统调用,对他们的参数进行初步的分析.下面先看一下这两个函数: int socket(in

Netfilter之连接跟踪实现机制初步分析

Netfilter之连接跟踪实现机制初步分析 原文: http://blog.chinaunix.net/uid-22227409-id-2656910.html 什么是连接跟踪 连接跟踪(CONNTRACK),顾名思义,就是跟踪并且记录连接状态.Linux为每一个经过网络堆栈的数据包,生成一个新的连接记录项(Connection entry).此后,所有属于此连接的数据包都被唯一地分配给这个连接,并标识连接的状态.连接跟踪是防火墙模块的状态检测的基础,同时也是地址转换中实现SNAT和DNAT的

Lending Club 公司2007-2018贷款业务初步分析

数据来源:https://www.kaggle.com/wendykan/lending-club-loan-data 数据描述:LendingClub是一家美国P2P借贷公司,总部位于加利福尼亚州旧金山.这是第一个对等网络贷款人登记其产品为证券与证券交易委员会(SEC),并在二级市场上提供贷款交易.LendingClub是世界上最大的点对点借贷平台.这些文件包含 LENGDING CLUB 公司 2007-2015 年间发放的所有贷款的完整贷款数据,包括当前贷款状态(“当前”,“延迟”,“已全

U-BOOT-2016.07移植 (第一篇) 初步分析

U-BOOT-2016.07移植 (第一篇) 初步分析 目录 U-BOOT-201607移植 第一篇 初步分析 目录 编译和移植环境 更新交叉编译工具 1 下载arm-linux-gcc 443 2 安装arm-linux-gcc 443 安装环境Ubuntu 910 下载u-boot-201607并解压 分析顶层Makefile 1 找出目标依赖关系 2 总结 初次编译u-boot 1 配置 2 编译 分析u-boot启动流程 1 分析startS 2 分析crt0S 3 总结 1. 编译和移

Cocos2d-x 3.1 Director ActionManger Scheduler初步分析

Director游戏主循环显示Node DisplayLinkDirector继承Director override了以下方法 virtual void mainLoop() override; virtual void setAnimationInterval(double value) override; virtual void startAnimation() override; virtual void stopAnimation() override; mainLoop()是游戏主循

mysql--error150错误原因初步分析

1, 两个字段的类型或者大小不严格匹配,例如,如果一个是INT(10), 那么外键也必须设置成INT(10), 而不是 INT(11) 也不能是 TINYINT. 你得使用 SHOW 命令来查看字段的大小,因为一些查询浏览器有时候把 int(10) 和int(11) 都显示为integer.另外,你还必须确定两个字段是否一个为 SIGNED,而另一个又是UNSIGNED, 这两字段必须严格地一致匹配. 2, 你试图引用的其中一个外键没有建立起索引,或者不是一个primary key , 如果其中

DirectUI的初步分析-转

DirectUI的初步分析(一) 最近由于项目的需要学习了一下DirectUI方面的东西,主要借鉴的是一个国外程序员写的代码(见引用一),看了后发现它更多的是探讨一种实现的可能性和思路,和实际应用还是有距离的,不过其实现还是很有意思的.在写此小结的时候又发现国内一个程序员将这个代码部分移植到WINCE下的代码(见引用二),因为平台的差异性要完全开发一个WINCE下的实际代码还是需要时间的. 由于本人GUI开发做得少,工作中有关这方面的东西主要是提供思路和方法,学习DirectUI的主要目的是为了

Irrlicht游戏引擎初步分析与研究

转载出处:http://blog.csdn.net/hellphenix/archive/2008/03/19/2198226.aspx Irrlicht游戏引擎主要是由一个名叫Nikolaus Gebhardt奥地利人所设计,是sourceforge上的一个开源项目,也是著名的开源游戏引擎.Irrlicht是一个德国神话故事中的一种动物的名字,它能够发光和飞翔,可以在大部分的沼泽地附近发现它.单词"Irrlicht"是两个德国单词("irr"意思是疯狂的:而&qu

struts2请求过程源码分析

Struts2是Struts社区和WebWork社区的共同成果,我们甚至可以说,Struts2是WebWork的升级版,他采用的正是WebWork的核心,所以,Struts2并不是一个不成熟的产品,相反,构建在WebWork基础之上的Struts2是一个运行稳定.性能优异.设计成熟的WEB框架. 我这里的struts2源码是从官网下载的一个最新的struts-2.3.15.1-src.zip,将其解压即可.里面的目录页文件非常的多,我们只需要定位到struts-2.3.15.1\src\core