tomcat6 NIO源码剖析二(NIO工作流程)

本文主要分析NIO各个组件是如何协同工作的,剖析tomcat NIO实现原理和工作流程。建议读者先阅读tomcat6源码分析系列的三篇文章,NIO实现虽然和BIO实现有很大的不同,但总体的处理思路是相似的。所以理解了BIO模型的处理流程后,理解NIO模型也会容易很多。另外本文默认读者已经对JDK的NIO模型编程有一定了解,否则理解起来可能会比较困难。下面分为六个小节来阐述tomcat的NIO实现。

  • 总体处理流程介绍
  • Acceptor接受和分发请求
  • Poller处理PollerEvent事件
  • Poller处理SelectionKey
  • SocketProcessor处理流程
  • Http11NioProcessor处理流程

总体处理流程介绍


图1 NIO总体处理流程图

Acceptor接收和分发请求

图2 Acceptor接收分发请求图

这里需要注意三个配置参数:maxThreads、maxConnections、acceptCount。

  • acceptCount:当accept()操作阻塞后,系统还可以接收的连接数。这个连接队列由操作系统维护。
  • maxThreads:线程池最大线程数。在BIO模型下,当没有空闲线程可用时,从线程池获取工作线程操作被阻塞,Acceptor.accept()操作也因此被阻塞。在NIO模型下,没有可用线程时并不会阻塞 Acceptor.accept()操作。这样就带来一个问题:那连接数如何控制?这就是maxConnections配置的事情了
  • maxConnection: tomcat6没有这个配置,所以tomcat6并不能控制接进来的连接数(风险很大),大牛不会没想到这个风险吧,但在其源码和官方文档中确没找到相关配置。Tomcat7做了改进在Acceptor.accept()之后调用了countUpOrAwaitConnection(),若当前正在处理的连接数达到了maxConnections则等待。

Poller处理PollerEvent流程

图3 Poller处理请求序列图

Poller处理每个SelectionKey流程

图4 Process SelectionKey流程图

SocketProcessor处理流程

图5 SocketProcessor处理流程图

Http11NioProcessor处理流程

图6 SocketProcess处理流程图

此处使用的Adapter和BIO模型使用的Adapter相同。CoyoteAdapter的详细处理逻辑在上一篇Tomcat6源码分析系列博客中中已经描述。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值