`
pengtyao
  • 浏览: 396935 次
  • 性别: 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
分享到:
评论

相关推荐

    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 /...

    Tomcat在Linux服务器上的BIO、NIO、APR模式设置方法

    下面小编就为大家分享一篇Tomcat在Linux服务器上的BIO、NIO、APR模式设置方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

    Apache-Tomcat-8.5.5(Linux )

    为什么不使用NIO2,一看感觉像是加强版的NIO一样??其实两个是不同的东西。NIO是reactor模式,平常说的基本是只这个,比如说典型的Netty便是NIO扩建。NIO2则不同,是preator模式,是async io。async io是指client端...

    apr库(tomcat优化)

    包含以上是个包,只要应用于LINUX下,用于TOMCAT优化apr连接器使用的 说明下关于TOMCAT调优一种建议 1 Connector介绍  1.1 Connector的种类  Tomcat源码中与connector相关的类位于org.apache.coyote包中,Connector...

    MyEclipse中无法启动tomcat服务器的问题

    cmd下确实是可以把Tomcat启动的,所有问题肯定还是出在MyEclipse的配置上面。再次回到MyE,突然回想起以前遇到过Debug mode运行的时候,要是Eclipse中存在有断点的话,就无法正常启动Tomcat

    【高并发】高并发环境下如何优化Tomcat性能?看完我懂了!

    1.bio模式 默认的模式,性能非常低下,没有经过任何优化处理和支持。 2.nio模式 利用java的异步io护理技术,noblocking IO技术。要想运行在该模式下,则直接修改server.xml里的Connector节点,修改protocol为如下配置。 ...

    从连接器组件看Tomcat的线程模型——BIO模式(推荐)

    在高版本的Tomcat中,默认的模式都是使用NIO模式,在Tomcat 9中,BIO模式的实现Http11Protocol甚至都已经被删除了。但是了解BIO的工作机制以及其优缺点对学习其他模式有有帮助。只有对比后,你才能知道其他模式的...

    apr库(tomcat优化) for native 20

    包含以上是个包,只要应用于LINUX下,用于TOMCAT优化apr连接器使用的 说明下关于TOMCAT调优一种建议 1 Connector介绍  1.1 Connector的种类  Tomcat源码中与connector相关的类位于org.apache.coyote包中,...

    Tomcat面试专题及答案.pdf

    -- protocol 启用 nio 模式,(tomcat8 默认使用的是 nio)(apr 模式利用系 统级异步 io) --> <!-- minProcessors 最小空闲连接线程数--> <!-- maxProcessors 最大连接线程数--> <!-- acceptCount 允许的最大连接数...

    tomcat7优化版

    tomcat是经过优化配置的,下载根据自己内存大小好修改即可使用,下载后打(windows)开/bin/catalina.bat (linux)/bin/catalina.sh 下JAVA_OPTS= 后面内存参数修改即可 ;/conf/server.xml 已配置三种模式(bio/nio/...

    59-Spring Boot内嵌Tomcat配置1

    这里尤其要注意设置协议这一块,众所周知,Tomcat默认用的是BIO,在生产环境中,最差也得用NIO吧,最好是APR,那么对应的协议类如下:在实际应用的时候,可

    tomcat源码解析

    本资源是tomcat的源码(包含阅读的注释),和相关原理及生命周期的文档,启动流程等,以及模拟并发对tomcat不同的支持(bio、nio)的压测,还有相关tomcat的启动和部署脚本命令(模拟从svn下载)。

    tomcat7调优

    1、通过禁用AJP协议,达到在集群的时候提高处理请求的时间。 2、将BIO通讯模式修改为NIO通讯模式 3、在tomcat中设置JVM参数

    Tomcat并发优化方法介绍

    Tomcat 常用运行模式有3种,分别为 bio,nio,apr.生产环境建议用apr,详细请看上一篇博文《Tomcat之——运行模式》 安装APR [root@liuyazhuang ~]# yum -y install apr apr-devel openssl-devel [root@liuyazhuang ...

    tomcat性能优化之如何搭建Apr模块

    前言 ...tomcat服务器的三种模式bio (消息阻塞模式),nio(非阻塞模式) ,apr(使用apache静态文件处理库处理静态文件) 如何在一台全新的linux上部署tomcat的apr模块? 对于已稳定使用的机器可

    java面试资料合集-面向大厂

    2.BIO,NIO,AIO,Netty 3.Dubbo 4.ElasticSearch 5.Git 6.java并发 7.java基础 8.java集合 9.虚拟机 10.异常 11.Kafka 12.Kinux 13.Memcache 14.MyBatis 15.MySQL 16.Nginx 17.RabbitMQ 18.Redis 19.SpringBoot 20....

    第三十一章:Tomcat应用企业级优化1

    1.先了解四个概念:同步 : 自己亲自出马持银行卡到银行取钱(使用同步IO时,Java自己处理IO读写) 2.Java对BIO、NIO、AIO的支持:Java

    TOCAT 优化版

    Apache tomcat 优化配置,实现高并发,压缩传输,提高响应速度。

    netty通讯事列代码

    netty通讯事列代码,在平常使用的tomcat当中,tomcat一般配置采用BIO,如果采用了websocket技术的话则会占用tomcat线程,如果大量长连接保持在线的话,则会造成线程的大量浪费,所以引入netty进行nio的处理方式

Global site tag (gtag.js) - Google Analytics