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

来源:互联网 发布:w7计算机mac地址怎么查 编辑:程序博客网 时间:2024/05/16 06:13

本文主要分析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