zoukankan      html  css  js  c++  java
  • BIO、NIO、AIO

    首先理解BIO、NIO、AIO是什么东西。

    Java中的BIO、NIO、AIO是Java语言对操作系统各种IO模型的封装。我们在使用这些API的时候,不用关心操作系统层面的知识,也不用根据不同的操作系统写不同的代码。在讲之前,先讲一下同步、异步、阻塞、非阻塞的概念。

    同步:发起一个调用后,被调用者未处理完请求前,调用不返回

    异步:发起一个调用后,立即得到被调用者的回应表示已接收到请求,但是被调用者并没有返回结果,之后被调用者通过回调等机制通知调用者返回结果。

    同步和异步最大的区别在于异步调用,调用者不必等待被调用者返回结果,被调用者会通过回调等机制通知调用者结果。

    阻塞:

    举个生活中的例子:烧水时,一直傻等着水开,是同步阻塞。去干其他事情,然后时不时看下水是不是开了,是同步非阻塞。买个水开后水壶会发出声音的水壶,水开之后,水壶发出声音,这个时候再去倒水,这是异步非阻塞。

    BIO:同步阻塞IO

    在JDK1.4之前,只有BIO。BIO原理是:服务器通过一个Acceptor线程监听客户端请求,并为每个客户端创建一个新的线程进行链路处理。典型的一请求一应答模式。假如客户端数量很多,频繁地创建和销毁线程会给服务器带来很大的压力。后改良为用线程池替代新增线程。

    BIO通过ServerSocket和Socket完成套接字通道的实现,客户端和服务端连接需要三次握手,使用简单,但吞吐量小。

    NIO:同步非阻塞IO

    在JDK1.4中引入了NIO。客户端和服务器之间通过Channel通信。这些Channel都会被注册到Selector多路复用器上。Selector通过一个线程不停地轮询这些Channel,找出已经准备就绪的Channel进行IO操作。NIO提供了Channel、Selector、Buffer等抽象。

    Channel:通道。和流不同,通道是双向的。NIO可以通过Channel进行数据的读、写和同时读写操作。

    Selector:多路复用器。Selector会不停地轮询注册在其上的通道,如果某个通道处于就绪状态,就会被Selector轮询出来,从而进行后续的IO操作。服务器端只要提供一个线程负责Selector的轮询,就可以接入成千上万的客户端,这是NIO的巨大进步。

    Buffer:缓冲区。BIO是将数据直接写入或者读取到流对象中,而NIO的数据操作都是在缓冲区中进行的。缓冲区实际上是一个数组。

    NIO通过SocketChannel和ServerSocketChannel完成套接字通道的实现,客户端和服务器通过Channel连接,采用多路复用器轮询注册的Channel。提高吞吐量和可靠性。

    AIO:异步非阻塞IO

    AIO没有采用NIO的多路复用器,而是使用异步通道的概念,提供了异步文件通道和异步套接字通道的实现。

    AIO通过AsynchronousSocketChannel和AsynchronousServerSocketChannel完成套接字通道的实现。

    但是实际项目中一般不用jdk原生的api,而是用netty api。原因是

  • 相关阅读:
    关于Maya Viewport 2.0 API 开发的介绍视频
    春节大假
    Some tips about the life cycle of Maya thread pool
    Can I compile and run Dx11Shader for Maya 2015 on my side?
    How to get current deformed vertex positions in MoBu?
    想加入全球首届的 欧特克云加速计划吗?
    三本毕业(非科班),四次阿里巴巴面试,终拿 offer(大厂面经)
    mac、window版编辑器 webstorm 2016... 永久破解方法。
    node 搭载本地代理,处理web本地开发跨域问题
    js 一维数组,转成嵌套数组
  • 原文地址:https://www.cnblogs.com/koushr/p/5873464.html
Copyright © 2011-2022 走看看