IO模型学习(一)IO模型分类

原创 2018年04月15日 16:43:45

IO分类

在java中,IO分为Bio、Nio、Aio三类,三者有本质的区别,下面主要讲解其在网络IO中的区别。

Bio
阻塞式IO,客户端类为Socket,服务端类为ServerSocket。该类中提供的方法全部为阻塞方法,即该操作完成后,该方法才会返回。举例说明,如果调用了Socket输入流的readLine方法,那么该方法必须在读取到换行符才会返回。优点:实现简单缺点:针对每一个客户端请求都需要创建一个IO线程进行处理,并且IO操作在等待条件未满足时,仍然占用已持有资源等待,受网络波动的影响较大。

Nio
非阻塞式IO,客户端类为SocketChannel,服务端类为ServerSocketChannel。在Nio中提供了阻塞和非阻塞两种模式,一般我们会使用Nio的非阻塞模式,即每一个方法不会等待条件满足就会立即返回。举例说明:如果调用SocketChannel的read方法时,不管读没读到数据都会立即返回,那么带来的问题也可想而知,对于IO操作的判断逻辑会变得更加复杂(因为执行IO操作时,并不知道该操作有没有完成)。优点:Nio中使用一个IO线程(Selector轮询检查每一个注册的Channel)去处理所有的客户端连接,且IO操作会立即返回,不会产生BIO中保持资源等待的情况。缺点:由于IO操作的完成情况是不确定的,导致了处理逻辑会比Nio复杂,其次IO线程通过轮询的方式检测,当注册在Selector上的Channel非常多时,会成为系统的瓶颈

Aio
异步IO,客户端类为AsynchronousSocketChannel,服务端类为AsynchronousServerSocketChannel。相比于只使用一个IO线程处理IO操作的Nio而言,Aio中不存在额外的IO线程,而是通过事件回调的方式来执行。(对Aio了解还不是很深刻,此处不做过多的讲解)优点:不需要IO线程,相比于轮询Channel的Nio而言,采用事件响应模式可以有更小的开销缺点:目前还不知道

Tomcat配置IO协议

使用指定IO模型的配置方式:
配置 server.xml 文件当中的

<Connector protocol="HTTP/1.1">

protocol 修改即可。
默认配置 8.0 protocol=“HTTP/1.1” 8.0 之前是 BIO 8.0 之后是NIO
BIO
protocol=“org.apache.coyote.http11.Http11Protocol“
NIO
protocol=”org.apache.coyote.http11.Http11NioProtocol“
AIO
protocol=”org.apache.coyote.http11.Http11Nio2Protocol“
APR
protocol=”org.apache.coyote.http11.Http11AprProtocol“

下面是摘的server.xml中的一段配置

<!-- A "Connector" represents an endpoint by which requests are received
         and responses are returned. Documentation at :
         Java HTTP Connector: /docs/config/http.html
         Java AJP  Connector: /docs/config/ajp.html
         APR (HTTP/AJP) Connector: /docs/apr.html
         Define a non-SSL/TLS HTTP/1.1 Connector on port 8080
    -->
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    <!-- A "Connector" using the shared thread pool-->
    <!--
    <Connector executor="tomcatThreadPool"
               port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    -->
    <!-- Define a SSL/TLS HTTP/1.1 Connector on port 8443
         This connector uses the NIO implementation. The default
         SSLImplementation will depend on the presence of the APR/native
         library and the useOpenSSL attribute of the
         AprLifecycleListener.
         Either JSSE or OpenSSL style configuration may be used regardless of
         the SSLImplementation selected. JSSE style configuration is used below.
    -->
    <!--
    <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
               maxThreads="150" SSLEnabled="true">
        <SSLHostConfig>
            <Certificate certificateKeystoreFile="conf/localhost-rsa.jks"
                         type="RSA" />
        </SSLHostConfig>
    </Connector>
    -->
    <!-- Define a SSL/TLS HTTP/1.1 Connector on port 8443 with HTTP/2
         This connector uses the APR/native implementation which always uses
         OpenSSL for TLS.
         Either JSSE or OpenSSL style configuration may be used. OpenSSL style
         configuration is used below.
    -->
    <!--
    <Connector port="8443" protocol="org.apache.coyote.http11.Http11AprProtocol"
               maxThreads="150" SSLEnabled="true" >
        <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
        <SSLHostConfig>
            <Certificate certificateKeyFile="conf/localhost-rsa-key.pem"
                         certificateFile="conf/localhost-rsa-cert.pem"
                         certificateChainFile="conf/localhost-rsa-chain.pem"
                         type="RSA" />
        </SSLHostConfig>
    </Connector>
    -->

Connector 可以配置HTTP协议的和AJP协议. 可以参考/docs/config/http.html 里面的内容 .
可以配置线程池, 链接超时时间, 监听的端口号,SSH链接配置. 重定向的端口.

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liudashuang2017/article/details/79950616

python线程进程、异步IO

-
  • 1970年01月01日 08:00

操作系统IO模型

目前IO模型主要经历了以下五种: 1)阻塞IO 2)非阻塞IO 3)IO复用(select和poll) 4)信号驱动IO(sigio) 5)异步IO(aio_)   内核空间和用户空间:...
  • zhangzeyuaaa
  • zhangzeyuaaa
  • 2015-01-11 11:31:48
  • 4289

Linux网络编程--IO模型基础

IO的方式有阻塞IO、非阻塞IO模型、IO复用、信号驱动、异步IO等,本文以UDP为例大概介绍这几种IO模型的基础知识和原理。 1.阻塞IO 阻塞IO是最通用的IO类型,使用这种模型进行数据接收的...
  • u010193457
  • u010193457
  • 2015-09-10 16:33:11
  • 1168

Nginx学习笔记一_UNIX中的IO模型

要理解NGINX框架,首先必须了解网络编程中的5种基本IO模型。 (1)阻塞式IO:进程会阻塞于IO系统调用,直到数据准备好,系统调用完成返回。 (2)非阻塞式IO:进程不会阻塞与系统调用。当...
  • u013753804
  • u013753804
  • 2015-09-13 13:24:35
  • 580

【I/O模型】几种IO模型浅析(一)

基本概念的学习: 同步&&异步   同步:如果有多个任务或者事件要发生,这些任务或者事件必须逐个地进行,一个事件或者任务的执行会导致整个流程的暂时等待,这些事件没有办法并发地执行;   异步:如果有多...
  • hejingyuan6
  • hejingyuan6
  • 2015-08-15 09:14:18
  • 6246

Client IOCP.zip

  • 2009年12月25日 18:27
  • 7KB
  • 下载

Linux五种IO模型性能分析

socket阻塞与非阻塞,同步与异步 作者:huangguisu 1. 概念理解      在进行网络编程时,我们常常见到同步(Sync)/异步(As...
  • jay900323
  • jay900323
  • 2014-01-11 15:53:55
  • 25802

透彻 Linux (Unix) 五种 IO 模型

IO模型   用一幅图表示所支持的I/O模型 纵向维度是“阻塞(Blocking)”、“非阻塞(Non-blocking)”;横向维度是“同步”、“异步”。总结起来是四种模型...
  • a627088424
  • a627088424
  • 2017-01-17 13:51:58
  • 1101

java 中的IO模型

BIO:JDK1.4之前的阻塞IO   BIO,即为Blocking I/O,阻塞IO,大致流程为   1)服务端建立ServerSocket,以一个端口启动,2)等待客户端建立socket连...
  • wanghang88
  • wanghang88
  • 2016-07-16 01:19:07
  • 1810

Linux下select, poll和epoll IO模型的详解

http://blog.csdn.net/tianmohust/article/details/6677985     一).Epoll 介绍 Epoll 可是当前在 Linux 下开发大...
  • fanbird2008
  • fanbird2008
  • 2013-11-25 11:13:52
  • 9393
收藏助手
不良信息举报
您举报文章:IO模型学习(一)IO模型分类
举报原因:
原因补充:

(最多只允许输入30个字)