服务器的实现NIO与BIO

服务器的实现不止有这两种方式。数据库

先谈谈题主说的这两种服务器模型:apache

一、收到一个请求就处理,这个时候就不能处理新的请求,这种为阻塞
这个是单线程模型,没法并发,一个请求没处理完服务器就会阻塞,不会处理下一个请求。通常的服务器不会使用这种方式实现。编程

二、收到一个请求就新开一个线程去处理任务,主线程返回,继续处理下一个任务,这种为非阻塞
首先纠正一个错误,这并非非阻塞,它也是阻塞的。相对第一个模型来讲,它解决了主线程阻塞的问题,有了必定程度的并发量,可是在每一个新开的线程中仍是阻塞的。若是100我的同时访问,将会开100个线程,那1000我的,10000我的呢?频繁开关线程很消耗资源,这样实现的服务器性能依然不高。服务器

除了上面的两种方式,接下来的说说其余更好的方式:网络

三、相似2的模型,可是不是每次收到请求就开一个新的线程,而是使用线程池
若是不了解线程池,你可能会了解数据库链接池,因为频繁建立、关闭数据库链接会消耗资源,因此会用数据库链接池来保存必定数量的链接,若是须要就从链接池里取链接,不须要则放回链接池,不在频繁建立。线程池也是同样的道理,线程池管理多线程,性能比频繁建立线程高得多。这种方式实现的服务器性能会比2高。不过,它依然是阻塞的。线程池的线程数量一般有限制的,若是全部线程都被阻塞(例如网速慢,或者被人恶意占用链接),那么接下来的请求将会排队等待。多线程

四、基于Java NIO实现的服务器模型
上面说到的几种模型,都是基于BIO(阻塞IO)。而NIO则是非阻塞IO,它是基于IO多路复用技术(例如Reactor模式)实现,只须要一个线程或者少许线程,就能够处理大量请求。从性能上来讲NIO实现的服务器并发性通常大于BIO,因此能够实现高性能的服务器。若是感兴趣,能够学习一些基于NIO的网络编程框架,例如Netty、MINA。并发

最后,回答一下题主说到的Tomcat。Tomcat运行能够选择BIO或者NIO模型,原理分别对应上面的3和4两种方式。Tomcat默认是BIO方式运行,若是想要换成NIO,能够配置server.xml:框架

<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" .../>

从性能上考虑建议使用NIO。性能

相关文章
相关标签/搜索