b.BIO连接器整体框图

上一讲讲解过NIO的框图,可以看来,NIO通道是目前Tomcat7以后的默认的通道的推荐配置,在Tomcat6和以前的配置中,BIO是主流的配置:

只需要修改protocol协议部分即可,而后续还有APR协议,NIO2.0的协议,都是修改这个字段。

对于BIO的整体框图,基本和NIO保持类似,整体流程变化不大:

1.Http11Protocol

与NIO一样,这个Http11Protocol是默认的BIO的http1.1协议的处理类,Tomcat除了有NIO,BIO,其实还有两个通道:

APR是高性能通道,NIO2是基于纯异步IO的通道,这个会在后面的Tomcat中进行讲解。

Http11Protocol类中,依然持有Endpoint和handler的引用:

只不过,BIO对应的Endpoint是JIOEndpoint,对应的handler是Http11ConnectionHandler。

2.JIoEndpoint

JIoEndpoint是BIO的端点类,它和NIO一样,也是维护着线程池,只不过因为没有Selector.select,没有SocketChannel的通道的注册,所以相比NIO模式,没有Poller线程是非常容易理解的,反倒是NIO的三个线程不容易理解,BIO可以看做就是基于Socket进行操作。

首先,初始化的JIoEndpoint的时候,会调用bind方法绑定Serversocket到对应的端口:

bind方法是初始化构造JIoEndpoint的重要步骤,他的主要作用就是建立ServerSocketFactory。

根据SSL信道或者是普通的http的信道,Tomcat都实现了ServerSocketFactory,

普通的http通道的ServerSocketFactory就是DefaultServerSocketFactory类,其工厂方法就是创建ServerSocket,很简单:

对于SSL通道的ServerSocketFactory是JSSEServerSocketFactory,这个类创建的是SSLServerSocket:

其次,JIoEndpoint启动的时候,会将Acceptor线程和工作线程池启动起来:

除此之外,还启动了一个专门的线程,这个线程就是检查异步请求的Timeout的,后续会有专门的介绍针对于Tomcat的异步请求。

工作线程池,使用的就是JDK自带的ThreadPoolExecutor:

可以从线程的堆栈看到,对应的http-bio-8443-exec-n 这种线程都是工作的线程池:

如果在tomcat中没有指定工作线程池的设置,那么都走的是JDK自带的ThreadPoolExecutor的默认值。

3.Acceptor线程

Acceptor线程的主要作用和NIO一样,如果没有网络IO数据,该线程会一直serversocket.accept进行阻塞住。

当有数据的时候,首先将socekt数据设置Connector配置的一些属性,然后将该接力棒传递给工作线程池:

最后一步processSocket方法,非常简单:

直接调用工作线程池,将SocketProcessor作为工作任务传入到工作线程池中,进行执行。

这一步相比NIO的架构,缺少了NIO通道中的PollerEvent一个缓存的队列,NIO中有这样的一个队列是因为需要从Acceptor到Poller线程,中间传递需要一个缓存的地方,而可以看到上述的BIO中的代码,如果工作线程池已经满载了,会根据JDK的ThreadPoolExecutor的策略是缓存,还是直接拒绝,或者是timeout等待,只不过BIO将这块的策略决断交给了ThreadPoolExecutor来做了。

对于Acceptor线程中还有一个重要的作用,就是控制连接的个数,这个在NIO通道的分析中没有讲解,这里看一下

Acceptor线程在while轮询的时候,每一次最开始都会检查一下当前的最大的连接数超出没有,

如果超出了,直接按照上图的序列调用LimitLatch进行锁定。

我们发现,实际上LimitLatch也是模仿JDK中的读写锁,内部持有一个Sync的类,这个类继承了JDK中隐藏功与名的AQS队列,这个AQS队列还是比较著名的,去年在分析JDK源码的时候,多次在n个并发类中都看到过他的踪迹,其实现中几乎全部是CAS锁的实现。

4.SocketProcessor工作任务

SocketProcessor是工作任务,用于传入到工作线程池中,输入就是Acceptor传过来的socketWapper包装:

如果是SSL交互的话,Tomcat开放了握手的这个环节,但是并没有对应的实现,这个是因为SSL下的握手实现在SUN的包中做的,JDK提供的SSLServerSocket的接口已经隐藏了这个细节,我们可以从handshake这个第二步看到:

Tomcat中直接就可以拿到SSLSession,这个类可以获得相当于SSL已经是握手成功了,否则就会出现失败。

对于为什么保留beforeHandShake和handshake这两个步骤,是为了和NIO通道中的SSLEngine交互的接口做个兼容而已。

暂且不用管它,最重要的步骤就是第3步,也就是handler.process这一步,通过Http11ConenctionHandler进行处理http协议,并疯转出Response和Request两个对象,传递给后端的容器。

总结

后续的流程基本上和NIO通道一样,总结一下,BIO的结构因为缺少了selector和轮询,相比NIO少了一部分的内容,整体上就是使用的ServerSocket来进行通信的,一线程一请求的模式,代码看起来清晰易懂,但是,由于BIO的模型比较落后,在大多数的场景下,不如NIO,而现在Tomcat新版本也是NIO是默认的配置。

来自为知笔记(Wiz)

时间: 2025-01-11 13:52:39

b.BIO连接器整体框图的相关文章

j.APR连接器整体框图(含SSL实现分析)

APR连接器的思路和bio,nio的整体架构也是类似的,可以看到下面的整体框图: 第一个区别是,对于从Acceptor线程中的socket解析这块,无论是nio还是bio都是在Acceptor线程内直接阻塞执行的,对于APR通道,搞出一个SocketWithOptions的线程,专门执行这个socket解析的工作,然后直接交给Poller线程进行poll: 其次,SSL交互和socket接收等等都是调用tomcat-native的JNI的代码来完成的. 下面通过源码分析,讲讲整个框图中比较核心的

c.BIO连接器与NIO连接器的对比

前面两节,我们分别看了BIO和NIO的两种模式Tomcat的实现方式. BIO的方式,就是传统的一线程,一请求的模式,也就是说,当同时又1000个请求过来,如果Tomcat设置了最大Accept线程数为500,那么第一批的500个线程直接进入线程池中进行执行,而其余500个根据Accept的限制的数量在服务器端的操作系统的内核位置的socket缓冲区进行阻塞,一直到前面500个线程处理完了之后,Acceptor组件再逐步的放进来. 分析一下,这种模式的BIO的好处,可以让一个请求在cpu轮转时间

d.BIO连接器与NIO连接器的对比之二

前面在Tomcat中讲解了两个通道,BIO和NIO,我们这里来通过两端程序,简单模拟两个通道,找找异同点: BIO: 1. public class SocketServer { public SocketServer() { try { int clientcount = 0; // 统计客户端总数 boolean listening = true; // 是否对客户端进行监听 ServerSocket server = null; // 服务器端Socket对象 try { // 创建一个S

h.SSL协议栈整体分解

1.SSL整体框图 SSL协议是应用层次(http协议)和TCP层级的一个可选的位置,可以从下面的图中非常清楚看到该层次: 绿色的框图就是这个SSL./TLS的位置,最右面的SSL/TLS图可以进一步的抽象为下面的图: SSL Record Protocol: 记录协议,给上层的各种协议提供一些方法支撑. SSL Handshake Protocol: 握手协议,在普通的socket的TCP/IP的三次握手的前提之上,又加了SSL的四次握手的过程. SSL Change Cipher Spec 

Java的HTTP服务端响应式编程

为什么要响应式编程? 传统的Servlet模型走到了尽头 传统的Java服务器编程遵循的是J2EE的Servlet规范,是一种基于线程的模型:每一次http请求都由一个线程来处理. 线程模型的缺陷在于,每一条线程都要自行处理套接字的读写操作.对于大部分请求来讲,本地处理请求的速度很快,请求的读取和返回是最耗时间的.也就是说大量的线程浪费在了远程连接上,而没有发挥出计算能力.但是需要注意一点,线程的创建是有开销的,每一条线程都需要独立的内存资源.JVM里的-Xss参数就是用来调整线程堆栈大小的.而

智能家居系统-框架设计

3.1 控制系统整体设计 智能家居远程控制系统的目标是实现家庭环境下的家用电器的集中网络化控制,并且具有环境参数监测功能,将原来由各自遥控器控制的电器集中到远程网络.服务器.web等终端上进行控制,或者由近端的手机.平板电脑等通过家庭局域网进行控制.总体的说,实现了在任何有网络的地方,就能随心所欲的控制家庭中电器设备的目标. 图3-1  智能家居控制系统技术框图 系统的技术实现如图3-1所示,系统以ARM CORTEX-M3为控制核心,通过GPRS.WIFI.nRF.ZigBee实现对外连接,完

Linux内核源代码情景分析-内存管理之slab-分配与释放

首先说缓存区的数据结构: struct kmem_cache_s { /* 1) each alloc & free */ /* full, partial first, then free */ struct list_head slabs;//指向所有的slab块链表,前面是完全块,然后是非完全块,最后是空闲块 struct list_head *firstnotfull;//指向第一个非完全块,如果没有非完全块,就指向上面的slabs unsigned int objsize;//对象的大

基于R7F0C80212ESP的蓝牙婴儿早教机

功能介绍 通过操作手机上的蓝牙软件发送命令,播放不同的语音内容(儿歌.故事)等.可以一边码着代码,一边给孩子放点音乐,还可以进行扩展一下,控制机械手臂来摇一摇拨浪鼓啥的.当然,如果时间充裕,还是最好亲自陪陪孩子. 整体框图 本方案比较简单,主要以此次的板子作为控制中心,通过蓝牙与手机通信,手机发送不同的命令来控制语言ic的输出,再经过放大电路将语音信号放大,然后通过小喇叭输出,以下是整个方案的整体框图. 资源介绍 本方案中主要使用了以下资源: Ø  R7F0C80212ESP目标板 Ø  HC0

每天近百亿条用户数据,携程大数据高并发应用架构涅槃

互联网二次革命的移动互联网时代,如何吸引用户.留住用户并深入挖掘用户价值,在激烈的竞争中脱颖而出,是各大电商的重要课题.通过各类大数据对用户进行研究,以数据驱动产品是解决这个课题的主要手段,携程的大数据团队也由此应运而生;经过几年的努力,大数据的相关技术为业务带来了惊人的提升与帮助. 以基础大数据的用户意图服务为例,通过将广告和栏位的"千人一面"变为"千人千面",在提升用户便捷性,可用性,降低费力度的同时,其转化率也得到了数倍的提升,体现了大数据服务的真正价值. 在