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的连接器、处理器的代码逻辑就变得自然而然了。。。
tomcat4 请求的处理——初步分析的更多相关文章
- S2-052 RCE漏洞 初步分析
PS:初步分析,只是分析了Struts2 REST插件的部分,本来菜的抠脚不敢发,但看到各大中心发的也没比我高到哪里去,索性发出来做个记事! 漏洞描述 2017年9月5日,Apache Struts发 ...
- Netfilter之连接跟踪实现机制初步分析
Netfilter之连接跟踪实现机制初步分析 原文: http://blog.chinaunix.net/uid-22227409-id-2656910.html 什么是连接跟踪 连接跟踪(CONNT ...
- python简易的大乐透数据获取及初步分析
该项目从网上爬取并分析彩票数据,为用户查看和初步分析往期数据提供一种简易的工具. https://github.com/unknowcry/Lottery # -*- coding: utf-8 -* ...
- Azure底层架构的初步分析
之所以要写这样的一篇博文的目的是对于大多数搞IT的人来说,一般都会对这个topic很感兴趣,因为底层架构直接关乎到一个公有云平台的performance,其实最主要的原因是我们的客户对此也非常感兴趣, ...
- 基于Spark和SparkSQL的NetFlow流量的初步分析——scala语言
基于Spark和SparkSQL的NetFlow流量的初步分析--scala语言 标签: NetFlow Spark SparkSQL 本文主要是介绍如何使用Spark做一些简单的NetFlow数据的 ...
- Flask系列10-- Flask请求上下文源码分析
总览 一.基础准备. 1. local类 对于一个类,实例化得到它的对象后,如果开启多个线程对它的属性进行操作,会发现数据时不安全的 import time from threading import ...
- DirectUI的初步分析-转
DirectUI的初步分析(一) 最近由于项目的需要学习了一下DirectUI方面的东西,主要借鉴的是一个国外程序员写的代码(见引用一),看了后发现它更多的是探讨一种实现的可能性和思路,和实际应用还是 ...
- Volley源码解析(三) 有缓存机制的情况走缓存请求的源码分析
Volley源码解析(三) 有缓存机制的情况走缓存请求的源码分析 Volley之所以高效好用,一个在于请求重试策略,一个就在于请求结果缓存. 通过上一篇文章http://www.cnblogs.com ...
- drf安装与APIView初步分析
drf安装 1. pip install djangorestframework 2. 在settings文件中注册app : INSTALLED_APPS = [..., 'rest_framewo ...
随机推荐
- ORA-01919
看到这个错误提示再明白不过了,Oracle中某个角色不存在. 不小心把Oracle中的几个重要角色删除掉了(dba,connect,resource),Plsql只能用DBA权限进去,普通权限进不去, ...
- 页面超慢,zabbix却没报警
故障背景:网站页面打开速度非常慢 排查过程: 1.一开始用vmstat 看到procs下的r值稳定在5.6,由于这台服务器是12核24线程,并且cpu的wa很大,说明系统很轻松, 肯定不会报警了,那为 ...
- 将excel数据导入到mysql的方法
文本框被键盘遮挡到了,不会再获取焦点的时候被顶到键盘顶部.解决方案:设置A的Position为绝对定位absolute即可,其他几种定位方式未测试,但是不能是fixed ,正是因为这种定位方式,导致它 ...
- 虚拟机安装LINUX网络配置注意的问题
1.如果你配置本地IP,不上网,网卡选项可以选择仅主机模式,如果要上网,就直接选择桥接模式,复制物理网络这个选项 2.将NET1网卡(仅主机模式)选中,然后进入下面这个配置选项 上面方框内的IP段 ...
- ArcGIS10.1 api for Flex开发用于ArcGIS 9.3时QueryTask 'Error #2032'错误的解决方案
因客户GIS软件需求,将应用降级到低版本ArcGIS9.3,不仅数据有些样式.配色.字符有些问题,API也要相应“降级”,解决如下: 利用9.3+flex做QueryTask时候出现了[RPC Fau ...
- SAS实验室之PROC TRANSPOSE
首先,抛开SAS,回忆我们在数学课本上学习的转置是什么概念,转置如下图: 以上就是数学中的转置. 那么在SAS里该如何转置呢? 先看语法格式: PROC TRANSPOSE <DATA=inpu ...
- Navicat Premium下sql导入中文乱码解决方案
今天帮忙朋友找bug的时候,准备导入她数据库里面的数据,所以我就试图在mysql管理工具Navicat下面导入相应的mysql命令.结果发现导入的中文字符全部变成乱码,所以做了如下这种尝试: 在“连接 ...
- (最小路径覆盖) News 消息传递 (hust OJ 2604)
http://begin.lydsy.com/JudgeOnline/problem.php?id=2604 Description 总部最近打算向下面的N个工作人员发出了一条秘密消息.因为它是机 ...
- windows编程:资源和播放声音
要播放声音,要附加项:winmm.lib,然后包含头文件:#include <mmsystem.h> 播放声音用PlaySound函数,只能播放midi和wav波形文件. #define ...
- firefox安装firebug\XPath Checker
XPath Checker安装,打开下面地址安装: https://addons.mozilla.org/en-US/firefox/addon/xpath-checker/ 安装XPath Chec ...