BIO、NIO和AIO的区别

IO的方式主要分为三种:BIO、NIO、AIO

在此之前,先要弄清几个概念:

。同步:在发出一个调用时,在没有得到结果前,该调用就不返回,一旦返回就有结果。

          同步IO是指用户进程请求IO操作以后通过等待或轮询的方式去查询IO操作是否就绪。

。异步:在调用发出之后就直接返回,所以没有返回结果,换句话说,当一个异步调用发生之后,调用者不会立即得到结果,而是在调用发生之后,被调用者通过状态通知来通知调用者。 

           异步IO需要操作系统更强的支持,操作系统开启独立的内核线程去处理IO操作。当read请求的数据到达时,由内核负责读取socket(网络上的两个程序通过一个双向通信连接实现数据的交换,这个连接的一段称为socket)中的数据,并写入用户指定的缓冲区中,最后用户通知用户线程。用户线程接收到内核通知后,已经完成了内核态到用户态的数据拷贝。

。阻塞:调用结果返回之前,当前线程会被挂起,调用线程只有在得到结果之后才会返回。

。非阻塞:不能立刻得到结果之前,该调用不会阻塞当前线程。

。BIO:同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个线程不做任何事情会造成不必要的线程开销。用于连接数量小且固定的架构。在此种方式下,用户进程发起一个IO操作以后,必须等待IO操作的完成,只有当真正完成了IO操作以后,用户进程才能运行,JAVA传统的IO模型属于此种方式。

。NIO:同步非阻塞,服务器实现模式为一个请求一个线程,客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有io请求时才启动一个线程进行处理,适用于连接比较多,比较短的架构。在此种方式下,用户进程发起一个IO操作以后可返回做其他事情,但是用户进程需要时不时的询问IO操作是否就绪,这就要求用户进程不停的去询问,从而引入不必要的CPU资源浪费,目前JAVA的NIO就属于同步非阻塞IO。

nio是new io,主要用到的是块,所以nio效率比io高

。AIO:异步非阻塞,一个有效请求一个线程,适用于链接数目多且长的架构。在此种方式下,用户进程只需要发起一个IO操作然后立即返回,等IO操作真正的完成以后,应用程序会得到IO操作完成的通知,此时用户进程只需要对数据进行处理就好了,不需要进行实际的IO读写操作,因为真正的IO读取或者写入操作已经由内核完成了,目前Java中还没有支持此种IO模型。

后面还有待完善..............................................

猜你喜欢

转载自blog.csdn.net/g1607058603/article/details/81297451