一、基本知识(BIO、NIO、AIO)

一、什么是Netty?

Netty提供了易于使用的API的客户端/服务器框架
特点:

  • 并发高 - NIO
  • 传输快 - 零拷贝

二、阻塞与非阻塞

线程访问资源的时候,该资源是否准备就绪的一种处理方式。如果资源此时没有准备就绪,这个时候就有两种处理方式:阻塞和非阻塞。阻塞指这个线程会一直持续等待这个资源处理完毕,直到它响应返回一个结果,这个时候线程不可以去做任何回请。非阻塞是指这个线程会直接返回结果可以去做其他的事情。

三、同步和异步

同步和异步是指访问数据的一种机制。
同步是指线程主动请求并且等待IO处理完成之后给一个通知
异步是指线程主动请求数据之后可以继续去处理其他的任务,可以发起其他的请求。当请求处理完成之后通过某种特定的通知方式去通知线程。

四、BIO

同步阻塞,Block IO
IO在进行读写的时候,这个线程是会被阻塞的,这个线程无法去进行其他的操作。使用起来非常方便,但是对于并发处理的能力非常低,并且线程之间访问资源的耗时也是比较久的。会比较依赖于网速和带宽。在JDK1.4之前都是这样子的。


  • 上厕所,厕所的坑都满了,我必须要主动地去看那个坑的位置腾出来了,我就可以开心地去上厕所了,这种方式就是BIO

五、NIO

同步非阻塞,New IO(Non-Block IO)

  • 同样是上厕所,坑满了,我不会像之前那样干等着,我会出去抽根烟或者拿起手机摇一摇,不会干等着,期间我会时不时主动地回厕所看一下有没有坑释放。

NIO是JDK1.4之后出现的。NIO有几个相关概念,如下:


一、基本知识(BIO、NIO、AIO)_第1张图片
相关概念
  • selector:选择器、多路复用器
  • buffer:缓冲区
  • channel:通道
    图中有一个server,三个客户端,客户端在通信的时候会使用selector选择器,selector就是一个线程,这个线程会主动地轮询。如果client1和server要进行连接的时候,会向selector进行注册,注册完毕之后就会有一个channel1,每一个客户端和selector建立连接之后都会有一个channel,channel是一个双向通道,它可以进行一些相应的数据的读写,这些数据的读写都会到buffer缓冲区里面去,去进行非阻塞的读写。selector多路复用器是一个单线程,它的性能特别强大,可以处理成千上万的请求,客户端的增多不会影响它的性能。channel和client是一对一的,每一个channel都会对应一个client,每一个服务端都会有一个selector,buffer中的数据会被用于读写,每次读完之后都会存在buffer中,并不会消失。

六、异步阻塞IO

实际开发中用不到。
上厕所,坑满了,我比较懒,我就干等着,然后有一个坑满了之后我也不会主动去蹲,而是等着释放坑的那个人通知我让我去用,这种方式是比较傻的。

七、AIO

异步非阻塞IO
上厕所,坑满了,我没有在厕所里面干等着,我是在厕所外面干着其他的事情,厕所的坑位用户用完了出来会通知我让我进去蹲坑,这个时候才去蹲坑。
非阻塞异步的通信方式,在NIO原有的基础上引入了一个异步的概念,在读写的时候它的所有的返回类型都是一个future对象, 它有相应的事件监听。

八、BIO、NIO、AIO对比

一、基本知识(BIO、NIO、AIO)_第2张图片
BIO、NIO、AIO对比

你可能感兴趣的:(一、基本知识(BIO、NIO、AIO))