您的位置:首页 > 运维架构 > Tomcat

Tomcat 7服务器线程模型

2016-05-28 08:42 316 查看
转载自:http://blog.csdn.net/kobejayandy/article/details/47810201

       Tomcat 7服务器网络处理主要由NioEndpoint,其处理客户端连接的主要流程如图所示:

    


        图中Acceptor及Worker分别是以线程池形式存在,Poller是一个单线程。注意,与BIO的实现一样,缺省状态下,在server.xml中没有配置<Executor>,则以Worker线程池运行,如果配置了<Executor>,则以基于 java concurrent 系列的java.util.concurrent.ThreadPoolExecutor线程池运行。

Acceptor

       接收socket线程,这里虽然是基于NIO的connector,但是在接收socket方面还是传统的 serverSocket.accept()方式,获得SocketChannel对象,然后封装在一个tomcat的实现类 org.apache.tomcat.util.net.NioChannel对象中。然后将NioChannel对象封装在一个PollerEvent 对象中,并将PollerEvent对象压入events queue里。这里是个典型的生产者-消费者模式,Acceptor与Poller线程之间通过queue通信,Acceptor是events
queue的生产者,Poller是events queue的消费者。

Poller

       Poller线程中维护了一个Selector对象,NIO就是基于Selector来完成逻辑的。在connector中并不止一个 Selector,在socket的读写数据时,为了控制timeout也有一个Selector,可以先把 Poller线程中维护的这个Selector标为主Selector。

       Poller是NIO实现的主要线程。首先作为events queue的消费者,从queue中取出PollerEvent对象,然后将此对象中的channel以OP_READ事件注册到主Selector中,然后主Selector执行select操作,遍历出可以读数据的socket,并从Worker线程池中拿到可用的Worker线程,然后将 socket传递给Worker。整个过程是典型的NIO实现。

Worker

       Worker线程拿到Poller传过来的socket后,将socket封装在SocketProcessor对象中。然后从 Http11ConnectionHandler中取出Http11NioProcessor对象,从Http11NioProcessor中调用 CoyoteAdapter的逻辑,跟BIO实现一样。

       在Worker线程中,会完成从socket中读取http request,解析成HttpServletRequest对象,分派到相应的servlet并完成逻辑,然后将response通过socket发回 client。在从socket中读数据和往socket中写数据的过程,并没有像典型的非阻塞的NIO的那样,注册OP_READ或OP_WRITE事件到主Selector,而是直接通过socket完成读写,这时是阻塞完成的,但是在timeout控制上,使用了NIO的Selector机制,但是
这个Selector并不是Poller线程维护的主Selector,而是BlockPoller线程中维护的Selector,称之为辅 Selector。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: