`
pengtyao
  • 浏览: 401965 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

NIO & BIO(tomcat6使用nio)

阅读更多
很早就听说tomcat6使用nio了,这几天突然想到一个问题,使用nio代替传统的bio,ThreadLocal岂不是会存在冲突?
  
  首先,何谓nio?
  
  如果读者有socket的编程基础,应该会接触过堵塞socket和非堵塞socket,堵塞socket就是在accept、read、write等 IO操作的的时候,如果没有可用符合条件的资源,不马上返回,一直等待直到有资源为止。而非堵塞socket则是在执行select的时候,当没有资源的时候堵塞,当有符合资源的时候,返回一个信号,然后程序就可以执行accept、read、write等操作,这个时候,这些操作是马上完成,并且马上返回。而windows的winsock则有所不同,可以绑定到一个EventHandle里,也可以绑定到一个HWND里,当有资源到达时,发出事件,这时执行的io操作也是马上完成、马上返回的。一般来说,如果使用堵塞socket,通常我们时开一个线程accept socket,当有socket链接的时候,开一个单独的线程处理这个socket;如果使用非堵塞socket,通常是只有一个线程,一开始是 select状态,当有信号的时候马上处理,然后继续select状态。
  
  按照大多数人的说法,堵塞socket比非堵塞 socket的性能要好。不过也有小部分人并不是这样认为的,例如Indy项目(Delphi一个比较出色的网络包),它就是使用多线程+堵塞 socket模式的。另外,堵塞socket比非堵塞socket容易理解,符合一般人的思维,编程相对比较容易。
  
  nio其实也是类似上面的情况。在JDK1.4,sun公司大范围提升Java的性能,其中NIO就是其中一项。Java的IO操作集中在java.io这个包中,是基于流的阻塞API(即BIO,Block IO)。对于大多数应用来说,这样的API使用很方便,然而,一些对性能要求较高的应用,尤其是服务端应用,往往需要一个更为有效的方式来处理IO。从 JDK 1.4起,NIO API作为一个基于缓冲区,并能提供非阻塞O操作的API(即NIO,non-blocking IO)被引入。
  
  BIO与NIO一个比较重要的不同,是我们使用BIO的时候往往会引入多线程,每个连接一个单独的线程;而NIO则是使用单线程或者只使用少量的多线程,每个连接共用一个线程。
  
  这个时候,问题就出来了:我们非常多的java应用是使用ThreadLocal的,例如JSF的FaceContext、Hibernate的 session管理、Struts2的Context的管理等等,几乎所有框架都或多或少地应用ThreadLocal。如果存在冲突,那岂不惊天动地?
  
  后来终于在Tomcat6的文档(http://tomcat.apache.org/tomcat-6.0-doc/aio.html)找到答案。根据上面说明,应该Tomcat6应用nio只是用在处理发送、接收信息的时候用到,也就是说,tomcat6还是传统的多线程Servlet,我画了下面两个图来列出区别:
  
  tomcat5:客户端连接到达 -> 传统的SeverSocket.accept接收连接 -> 从线程池取出一个线程 -> 在该线程读取文本并且解析HTTP协议 -> 在该线程生成ServletRequest、ServletResponse,取出请求的Servlet -> 在该线程执行这个Servlet -> 在该线程把ServletResponse的内容发送到客户端连接 -> 关闭连接。
  
  我以前理解的使用 nio后的tomcat6:客户端连接到达 -> nio接收连接 -> nio使用轮询方式读取文本并且解析HTTP协议(单线程) -> 生成ServletRequest、ServletResponse,取出请求的Servlet -> 直接在本线程执行这个Servlet -> 把ServletResponse的内容发送到客户端连接 -> 关闭连接。
  
  实际的tomcat6:客户端连接到达 -> nio接收连接 -> nio使用轮询方式读取文本并且解析HTTP协议(单线程) -> 生成ServletRequest、ServletResponse,取出请求的Servlet -> 从线程池取出线程,并在该线程执行这个Servlet -> 把ServletResponse的内容发送到客户端连接 -> 关闭连接。  
  
  
  从上图可以看出,BIO与NIO的不同,也导致进入客户端处理线程的时刻有所不同:tomcat5在接受连接后马上进入客户端线程,在客户端线程里解析HTTP协议,而tomcat6则是解析完HTTP协议后才进入多线程,另外,tomcat6也比5早脱离客户端线程的环境。
  
  实际的tomcat6与我之前猜想的差别主要集中在如何处理servlet的问题上。实际上即使抛开 ThreadLocal的问题,我之前理解tomcat6只使用一个线程处理的想法其实是行不同的。大家都有经验:servlet是基于BIO的,执行期间会存在堵塞的,例如读取文件、数据库操作等等。tomcat6使用了nio,但不可能要求servlet里面要使用nio,而一旦存在堵塞,效率自然会锐降。
   
  
  所以,最终的结论当然是tomcat6的servlet里面,ThreadLocal照样可以使用,不存在冲突。
Original Address:http://tech.it168.com/j/2007-12-24/200712241252423.shtml
分享到:
评论

相关推荐

    手写 tomcat nio

    【标题】:“手写 Tomcat NIO” 在深入探讨手写Tomcat NIO之前,我们首先需要理解NIO(Non-...在实际项目中,如果需要高性能的Web服务器,可能需要考虑使用成熟的开源产品,如Tomcat本身或Netty等高性能NIO框架。

    tomcat:Java使用nio模式实现tomcat

    在Tomcat服务器的实现中,NIO模式被用来提高其性能和并发能力,尤其是在高并发场景下,相比传统的BIO( Blocking I/O)模式,NIO具有显著优势。 Tomcat是Apache软件基金会的Jakarta项目下的一个开源Web应用服务器,...

    NIOweb服务器

    Tomcat,作为一款广泛使用的开源Java Servlet容器,其内部也提供了多种I/O模型来处理网络连接,包括BIO、NIO和Apr(Apache Portable Runtime)等。NIO模型是Tomcat为了应对高并发场景而引入的,它利用Java NIO库进行...

    Tomcat6的源码

    2. **Connector组件**:这部分源码负责接收和发送网络数据,通常包括一个基于Java NIO(非阻塞I/O)的Connector和一个基于Bio(阻塞I/O)的Connector。了解它们的工作原理,有助于优化服务器性能。 3. **Jasper引擎...

    tomcat6-server-and-src

    Apache Tomcat 6 是一个广泛使用的开源Java Servlet容器,它实现了Java EE的Servlet和JavaServer Pages(JSP)规范。这个压缩包包含了Tomcat 6的服务器版本和源代码,让我们来深入了解一下这两个组成部分以及它们的...

    netty与tomcat功能比较

    - **Tomcat**:从6.x版本开始引入了NIO模式,这大大提升了其并发处理能力。此外,Tomcat还支持APR模式,该模式通过JNI技术调用Apache网络库,进一步提高了性能。 - **Netty**:基于NIO技术构建,具有天然的高并发...

    aio_bio_nio.rar

    Java网络通信中,AIO(Asynchronous Input/Output)、BIO(Blocking I/O)和NIO(Non-blocking I/O)是三种不同的I/O模型,它们各自有着不同的特性和适用场景。下面将详细介绍这三个概念以及它们在Java中的实现。 *...

    Java NIO Socket基本

    NIO在实际开发中常用于构建高性能的网络服务器,如Tomcat、Netty等框架就大量使用了NIO技术。通过合理使用NIO,开发者可以编写出更加高效、可扩展的服务端代码。了解和掌握Java NIO对于提升Java程序员在服务器端编程...

    apachetomcat6·0·16

    这些连接器能够与Java NIO或BIO模型配合,提高服务器的响应速度。 9. **故障排查**:当遇到问题时,日志文件(logs目录)会记录错误信息,帮助开发者定位问题。此外,还可以通过监控Tomcat的运行状态,如查看线程池...

    tomcat 6 + tomcat 7

    4. **NIO和APR**:除了传统的Bio(阻塞I/O)模型,Tomcat 7还支持NIO(非阻塞I/O)和APR(Apache Portable Runtime)接口,提供更好的I/O性能。 5. **更好的管理**:管理界面有所改进,提供更丰富的功能,如在线解压...

    tomcat7 tomcat 6 xshell6.zip

    2. **NIO.2支持**:除了原有的BIO(阻塞I/O)和NIO(非阻塞I/O),Tomcat 7增加了对Java NIO.2 API的支持,提供了更好的性能和可扩展性。 3. **Jasper升级**:JSP编译器 Jasper 在Tomcat 7中升级,提高了JSP处理速度...

    tomcat6服务器

    - 使用NIO(非阻塞I/O)模式代替BIO(阻塞I/O),提高服务器性能。 - 配置连接器的空闲超时时间,避免资源浪费。 - 开启JVM的内存优化,合理设置堆内存大小。 7. **日志管理**: Tomcat的日志信息默认保存在`...

    cipher-list-creator.jsp:为 Tomcat NIOBIO 连接器的 server.xml 创建密码列表

    目标环境Tomcat + JDK 使用 NIO/BIO 连接器进行 SSL。 在 Tomcat 7 + Java 7 / Tomcat 8 + Java 8 上测试,但写成 Tomcat 4.1 + JDK1.4.2 兼容。注意密码列表按推荐顺序排序。 接下来 Tomcat 将支持 Tomcat 8.0.21 /...

    Servlet API 和 NIO: 最终组合在一起

    NIO则是一种I/O模型的升级,与传统的阻塞I/O(BIO)不同,NIO允许在数据准备好之前不阻塞线程,而是通过选择器(Selector)来监控多个通道(Channel),当数据准备好时,选择器会通知用户。这种非阻塞特性使得NIO在...

    Tomcat6_0_18 源代码 src

    在Tomcat6.0.18中,主要有两个协议处理器:AprLifecycleListener(使用Apache Portable Runtime库)和 CoyoteAdapter(用于Java的NIO和BIO实现)。源码分析可以帮助我们理解数据传输的细节。 3. **Jasper与JSP编译*...

    基于Spring Boot + NIO实现的电商平台见证宝服务

    其次,NIO(Non-blocking I/O,非阻塞I/O)是Java提供的另一种I/O模型,与传统的BIO(Blocking I/O,阻塞I/O)相比,NIO具有更高的并发性能。在高并发场景下,如电商平台的订单处理、支付系统等,NIO能有效减少线程...

    Tomcat 9.0 ,6.0

    2. **NIO.2支持**:除了传统的BIO和NIO模型,Tomcat 9.0引入了对Java NIO.2 API的支持,进一步提高了性能和并发处理能力。 3. **WebSocket支持**:实现了JSR 356规范,为开发实时Web应用程序提供了基础。 4. **更好...

    tomcat性能优化.pdf

    Tomcat支持三种运行模式:bio、nio、apr,根据应用场景选择最适合的运行模式也很关键。 部署测试用的Java Web项目是验证Tomcat配置是否合理的重要步骤。部署web应用后,通过访问首页确认是否已成功启动,这是最基本...

    Tomcat6性能优化(小结).pdf

    本篇文章将聚焦于Tomcat6的性能优化,特别是关于NIO(非阻塞I/O)的使用以及并发量配置。 首先,让我们探讨一下NIO在Tomcat中的作用。传统的BIO(阻塞I/O)模型中,每个Web客户端的请求都会创建一个独立的线程,当...

Global site tag (gtag.js) - Google Analytics