以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 请求的处理——初步分析的更多相关文章

  1. S2-052 RCE漏洞 初步分析

    PS:初步分析,只是分析了Struts2 REST插件的部分,本来菜的抠脚不敢发,但看到各大中心发的也没比我高到哪里去,索性发出来做个记事! 漏洞描述 2017年9月5日,Apache Struts发 ...

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

    Netfilter之连接跟踪实现机制初步分析 原文: http://blog.chinaunix.net/uid-22227409-id-2656910.html 什么是连接跟踪 连接跟踪(CONNT ...

  3. python简易的大乐透数据获取及初步分析

    该项目从网上爬取并分析彩票数据,为用户查看和初步分析往期数据提供一种简易的工具. https://github.com/unknowcry/Lottery # -*- coding: utf-8 -* ...

  4. Azure底层架构的初步分析

    之所以要写这样的一篇博文的目的是对于大多数搞IT的人来说,一般都会对这个topic很感兴趣,因为底层架构直接关乎到一个公有云平台的performance,其实最主要的原因是我们的客户对此也非常感兴趣, ...

  5. 基于Spark和SparkSQL的NetFlow流量的初步分析——scala语言

    基于Spark和SparkSQL的NetFlow流量的初步分析--scala语言 标签: NetFlow Spark SparkSQL 本文主要是介绍如何使用Spark做一些简单的NetFlow数据的 ...

  6. Flask系列10-- Flask请求上下文源码分析

    总览 一.基础准备. 1. local类 对于一个类,实例化得到它的对象后,如果开启多个线程对它的属性进行操作,会发现数据时不安全的 import time from threading import ...

  7. DirectUI的初步分析-转

    DirectUI的初步分析(一) 最近由于项目的需要学习了一下DirectUI方面的东西,主要借鉴的是一个国外程序员写的代码(见引用一),看了后发现它更多的是探讨一种实现的可能性和思路,和实际应用还是 ...

  8. Volley源码解析(三) 有缓存机制的情况走缓存请求的源码分析

    Volley源码解析(三) 有缓存机制的情况走缓存请求的源码分析 Volley之所以高效好用,一个在于请求重试策略,一个就在于请求结果缓存. 通过上一篇文章http://www.cnblogs.com ...

  9. drf安装与APIView初步分析

    drf安装 1. pip install djangorestframework 2. 在settings文件中注册app : INSTALLED_APPS = [..., 'rest_framewo ...

随机推荐

  1. 封装ios静态库碰到的一些问题(二)

    在静态库建立好了之后呢,于是应用程序就引用它,加上拷贝的h文件,但是引用之后Build之后提示很多sybmbol 重复 于是进行检查,确实由于是从其他工程修改过来的,很多基础库都引用了,删除之,最后就 ...

  2. Linux系统布置java项目

    一.远程服务器 Linux系统是没有Windows那样可视化的界面的,所以首先我们需要一个远程Linux服务器的软件,有好多种,比较好用的XShell,下载地址:http://rj.baidu.com ...

  3. 简单jquery实现select三级联动

    简单的jquery实现select三级联动 代码如下: <!DOCTYPE html> <html> <head> <meta charset="u ...

  4. Java程序员从笨鸟到菜鸟之(一百零一)sql注入攻击详解(二)sql注入过程详解

    在上篇博客中我们分析了sql注入的原理,今天我们就来看一下sql注入的整体过程,也就是说如何进行sql注入,由于本人数据库和网络方面知识有限,此文章是对网上大量同类文章的分析与总结,其中有不少直接引用 ...

  5. LINUX 虚拟机克隆与网络配置

    虚拟机克隆后,启动之后发现网卡没有启动.发现提示错误信息“Device eth0 does not seem to be present, delaying initialization.” 解决方法 ...

  6. C++ 中 int 转string, 以及10进制转2进制

    感谢:http://blog.csdn.net/xiaofei2010/article/details/7434737 以及:http://www.cnblogs.com/nzbbody/p/3504 ...

  7. windows 录音程序(一)

    (一)概述 1.依赖条件:winmm.lib 2.步骤: (1)打开设备 -----  waveInOpen(打开一个音频输入设备): (2)开始录音 ----- waveInStart开始录音: ( ...

  8. 美帝的emal to message gateway

    Provider Email to SMS Address Format AllTel number@text.wireless.alltel.com AT&T number@txt.att. ...

  9. 如何禁用Marlin温度保护

    最近在玩3D打印,搞了套MEGA 2560 + RAMPS 1.4 + A4988,刷Marlin(https://github.com/MarlinFirmware/Marlin)固件,接上电机调试 ...

  10. coding.net

    http://coding.net 看上去不错,简洁自然. https://coding.net/u/zhongzf/p/TestProject/git http://zhongzf.coding.i ...