学习Netty前对BIO、NIO、AIO的理解

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

概念

  • Netty是一个提供了易于使用的API的客户端/服务器框架
  • 高并发NIO(非阻塞IO)
  • 传输快,零拷贝(在Java中,内存分为堆栈常量池等。假设现在我们有一些数据,我们需要从IO里面读取并且放到堆里面,那么一般都会从IO流将数据读入缓冲区,然后再从缓冲区里读到堆内存中。这样的话,数据要经过两次的拷贝才能到达最终的堆里。如果数据很大的话,其实会造成资源的浪费。而零拷贝是指它会去开辟一个新的堆内存,然后数据直接从IO读到新开辟的内存中,这样子就加快了数据的传输速度。)

阻塞与非阻塞

线程访问资源,该资源是否准备就绪的一种处理方式。
阻塞:线程A去请求一个资源,若该资源在处理中,它会一直等待,直到资源处理完毕。
非阻塞:线程B去请求一个资源,若该资源在处理中,它会去请求另外一个资源,若还是在处理中,就会一直去请求新的资源,而不会陷入等待。

同步与异步

同步和异步是指访问数据的一种机制。
同步:线程A去请求一个资源,并等待资源的处理,资源处理完成后,会通知到线程A。
异步:线程B请求一个资源,该资源在处理中,它会继续请求另外一个资源,这两个资源都处理完成后,会逐一以异步的方式通知给线程B。

BIO(同步阻塞,Block IO)

在这里插入图片描述
原理:专门有一个线程(accept),负责监听客户端的请求。只要有客户端和服务端建立了一个请求,那么它们之间都会产生一个新的线程来处理。如果客户端数量逐渐增多,那么客户端与服务器之间就会频繁的创建和销毁线程。这时候服务端会面临很大的压力,甚至崩溃。在后续一段时间里进行了改进,不再额外新增线程,而是使用线程池,这种方式其实也是一种伪异步IO。

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

在这里插入图片描述
原理:客户端跟服务器通讯时,服务器会有一个多路复用器(Selector),也就是一个线程,它会去主动的轮询。假设客户端01与服务器建立连接,会在多路复用器里注册,注册完毕后产生一个通道(Channel)。每一个客户端与服务器建立连接都会产生一个与之对应的Channel。Channel是一个双向通道,可以进行数据的读写,这些数据的读写都会进入到缓冲区中(Buffer)。Channel相当于是一个读取的工具,每个客户端都可以理解为一个单独的Channel。读取方式都是非阻塞的读取,如果没有数据会直接跳过而不会同步的在这边干等着。Selector是一个单线程,整体来说线程资源开销很小,光这一个线程就能处理成千上万的客户端请求,客户端的增多也不会影响它的性能。

BIO与NIO一个比较重要的不同是,我们使用BIO的时候往往会引入多线程,每个连接一个单独的线程;而NIO则是使用单线程或者只使用少量的多线程,每个连接共用一个线程。
NIO的最重要的地方是当一个连接创建后,不需要对应一个线程,这个连接会被注册到多路复用器上面,所以所有的连接只需要一个线程就可以搞定,当这个线程中的多路复用器进行轮询的时候,发现连接上有请求的话,才开启一个线程进行处理,也就是一个请求一个线程模式。
NIO使用了多路复用器机制,以socket使用来说,多路复用器通过不断轮询各个连接的状态,只有在socket有流可读或者可写时,应用程序才需要去处理它,在线程的使用上,就不需要一个连接就必须使用一个处理线程了,而是只是有效请求时(确实需要进行I/O处理时),才会使用一个线程去处理,这样就避免了BIO模型下大量线程处于阻塞等待状态的情景。

AIO(异步非阻塞)

与NIO不同,当进行读写操作时,只须直接调用API的read或write方法即可。这两种方法均为异步的,对于读操作而言,当有流可读取时,操作系统会将可读的流传入read方法的缓冲区,并通知应用程序;对于写操作而言,当操作系统将write方法传递的流写入完毕时,操作系统主动通知应用程序。 即可以理解为,read/write方法都是异步的,完成后会主动调用回调函数。

生活实例

  • BIO:去上厕所,坑全满。此时我一直光等着,主动观察哪个坑好了,只要有坑位释放了,我立马去占坑。
  • NIO:去上厕所,坑全满。此时我回到工位上继续写代码,然后时不时再主动去看下厕所里的人出来没,如果有坑了,我就立马去占坑。
  • 异步阻塞:去上厕所,坑全满。我就在厕所里等着别人出来跟我说我可以去占坑了。(这种方式比较傻,别人都出来了,我当然就可以去占坑了,犯不着还要别人告诉我。)
  • AIO:去上厕所,坑全满。此时我回到工位上继续写代码,如果厕所里有人出来了,他会主动跟我讲,我可以去占坑了。(非常高效)

猜你喜欢

转载自blog.csdn.net/fu123123fu/article/details/85041764