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的对比:

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

  • 相关阅读:
    训练总结
    图论--最短路--SPFA模板(能过题,真没错的模板)
    图论--最短路-- Dijkstra模板(目前见到的最好用的)
    The 2019 Asia Nanchang First Round Online Programming Contest B Fire-Fighting Hero(阅读理解)
    关于RMQ问题的四种解法
    The Preliminary Contest for ICPC Asia Xuzhou 2019 徐州网络赛 K题 center
    The Preliminary Contest for ICPC Asia Xuzhou 2019 徐州网络赛 XKC's basketball team
    The Preliminary Contest for ICPC Asia Xuzhou 2019 徐州网络赛 D Carneginon
    ZOJ 3607 Lazier Salesgirl (枚举)
    ZOJ 3605 Find the Marble(dp)
  • 原文地址:https://www.cnblogs.com/sam-uncle/p/8875652.html
Copyright © 2011-2022 走看看