zoukankan      html  css  js  c++  java
  • Java网络编程基础(Netty预备知识)

    今天在家休息,闲来无事,写篇博客,陶冶下情操~~~

    =================我是分割线================

    最近在重新学习Java网络编程基础,以便后续进行Netty的学习。

    整理了一下重要的基础知识点,供大家参考。

    正在读这篇随笔的你是否遇到过如下问题?

    什么是BIO?什么是NIO?什么是AIO?什么是同步IO?什么是异步IO?什么是阻塞IO?什么是非阻塞IO?

    为什么我感觉异步IO和非阻塞IO是一样的?

    读完这篇随笔后相信大家就会明白了。

    废话不多时,直接上干货。

    一、阻塞IO和非阻塞IO、同步IO和异步IO

    阻塞,通俗的说就是在干一件事情的时候不能干其他事情,直到当前正在干的事情完成为止。

    一个IO操作其实分成了两个步骤:发起IO请求和实际的IO操作。
    同步IO和异步IO的区别就在于第二个步骤是否阻塞,如果实际的IO读写阻塞请求进程,那么就是同步IO;如果不阻塞,而是操作系统帮你做完IO操作再将结果返回给你,那么就是异步IO。
    阻塞IO和非阻塞IO的区别在于第一步,发起IO请求是否会被阻塞,如果阻塞直到完成那么就是传统的阻塞IO,如果不阻塞,那么就是非阻塞IO。

    也就是说发起IO请求之后不能再去发起别的请求,那就是阻塞,否则是非阻塞。

    如果实际IO操作的时候进程不能进行其他实际操作,那就是同步;否则是异步(因为是OS在实际进行IO操作,OS操作的时候,进程还可以做其他事情)。

    所以异步和非阻塞看上去都是在做一件事情的时候还能做别的事情,好像是一样的,但是却对应于IO操作的两个不同步骤。

    另外,同步和异步说的是进程和进程(OS)之间;而阻塞和非阻塞说的是进程内部。

    我们来举个通俗的例子:

    你想吃金拱门了:
    1.你点了份汉堡,然后在收银台前等着,还不停的问收银妹子“好了没啊,饿死了”-----同步阻塞
    2.你点了份汉堡,然后找个位置坐下打起了王者农药,然后隔一会儿去问下收银妹子“好了没啊,饿死了”-----同步非阻塞
    3.打王者农药的时候,收银台的妹子说汉堡好了,让你自己过去取-----异步阻塞
    4.汉堡好了之后,收银台的妹子把做好的汉堡端给你-----异步非阻塞

    IO操作可以分为3类:同步阻塞(即早期的IO操作)、同步非阻塞(NIO)、异步(AIO)。 

    同步阻塞: 
    在此种方式下,用户进程在发起一个IO操作以后,必须等待IO操作的完成,只有当真正完成了IO操作以后,用户进程才能运行。JAVA传统的IO模型属于此种方式。 
    同步非阻塞: 
    在此种方式下,用户进程发起一个IO操作以后便可返回做其它事情,但是用户进程需要时不时的询问IO操作是否就绪,这就要求用户进程不停的去询问,从而引入不必要的CPU资源浪费。其中目前JAVA的NIO就属于同步非阻塞IO。 
    异步: 
    此种方式下是指应用发起一个IO操作以后,不等待内核IO操作的完成,等内核完成IO操作以后会通知应用程序。”

    ----------以上内容参考了https://blog.csdn.net/u013851082/article/details/53942947

    二、BIO、NIO、AIO

    理解了同步和异步、阻塞和非阻塞之后我们来分别看下java的各种IO:

    1.BIO(同步阻塞IO)

    JDK1.4之前使用的IO操作,客户端通过Socket来实现,服务器端通过ServerSocket来实现;客户端和服务器通过一条inputStream和一个outputStream进行通信

    从上图中可以看出每个客户端和服务器之间都会存在两条流,一个输入流一个输出流(图中是相对于客户端来说的,客户端的输入流就是服务器的输入流,客户端的输出流就是服务器的输入流)。

    另外,服务器在和客户端1通信的时候不能同时和客户端2进行通信。

    2.NIO(同步非阻塞IO)

    JDK1.4之后开始使用NIO

    NIO引入了三个概念:Selector(选择器,也叫多路复用器)、Buffer(缓冲区)、Channel(双向通道)。

    Java NIO采用了channel进行数据传输,而不是单向的流(stream),channel中的数据是先写入缓冲然后处理,同样数据的读取也是到缓冲区里面去读。

    在通道上可以注册我们感兴趣的事件。一共有以下四种事件:

    服务端接收客户端连接事件 SelectionKey.OP_ACCEPT(16) 
    客户端连接服务端事件 SelectionKey.OP_CONNECT(8)
    读事件 SelectionKey.OP_READ(1)
    写事件 SelectionKey.OP_WRITE(4)

    服务端和客户端各自维护一个管理通道的对象,我们称之为selector,该对象能检测一个或多个通道 (channel) 上的事件。

    selector用来轮询所有channel,用来发现就绪的channel。

     

    3.AIO(异步IO)

     JDK 1.7中开始引入AIO,也就是NIO 2.0。AIO引入新的异步通道的概念,并提供了异步文件通道和异步套接字通道的实现。

    三、三种I/O的对比:

    网上看到一张图,分享一下

  • 相关阅读:
    Maven
    Maven
    Maven
    Maven
    Maven
    Maven
    Maven
    Python
    Maven
    include和require的区别
  • 原文地址:https://www.cnblogs.com/sam-uncle/p/8875652.html
Copyright © 2011-2022 走看看